PHP Nesneleri ve Diziler - Yineleme sırasında performans karşılaştırması


91

Bir sinir ağı için üzerinde yinelemem ve bazı hesaplamalar yapmam gereken çok sayıda PHP nesnem var. Sınıf örnekleri yerine ilişkisel bir dizi kullanmanın daha iyi olup olmayacağını merak ediyordum.

3640Nesnelerin etrafında uğraşıyorum ve 500bunun üzerine (en iyi durumda) zamanlar etrafında yineliyorum , böylece herhangi bir mikro optimizasyon çok yardımcı oluyor. Bunu yapmak kaçınılmaz olarak daha hızlı mı $object['value']olur $object->value?

Düzenleme: Yani ikisi de aynı. Ama inşaatçı için biraz ek yük olacağını düşünüyorum. Her iki durumda da güzel sınıflarımı kirli dizilerle takas etmek istediğimi düşünmüyorum: P

Yanıtlar:


65

Quazzle koduna dayanarak, bir sonraki kodu çalıştırdım (5.4.16 windows 64bits):

<?php
class SomeClass {
    public $aaa;
    public $bbb;
    public $ccc;
    }

function p($i) {
  echo '<pre>';
  print_r($i);
  echo '</pre>';
}


$t0 = microtime(true);
$arraysOf=array();
$inicio=memory_get_usage(); 
for ($i=0; $i<1000; $i++) {
    $z = array();
    for ($j=0; $j<1000; $j++) {
        $z['aaa'] = 'aaa';
        $z['bbb'] = 'bbb';
        $z['ccc'] = $z['aaa'].$z['bbb'];            
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>arrays: '.(microtime(true) - $t0)."</p>";
echo '<p>memory: '.($fin-$inicio)."</p>";
p($z);

$t0 = microtime(true);
$arraysOf=array();
$inicio=memory_get_usage(); 
for ($i=0; $i<1000; $i++) {
    $z = new SomeClass();
    for ($j=0; $j<1000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>arrays: '.(microtime(true) - $t0)."</p>";
echo '<p>memory: '.($fin-$inicio)."</p>";
p($z);

$t0 = microtime(true);
$arraysOf=array();
$inicio=memory_get_usage(); 
for ($i=0; $i<1000; $i++) {
    $z = new stdClass();
    for ($j=0; $j<1000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>arrays: '.(microtime(true) - $t0)."</p>";
echo '<p>memory: '.($fin-$inicio)."</p>";
p($z);  
?>

Ve bir sonraki sonucu elde ettim:

arrays: 1.8451430797577

memory: 460416

Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

arrays: 1.8294548988342

memory: 275696

SomeClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

arrays: 2.2577090263367

memory: 483648

stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

Php 5.4 için sonuç

  1. Sınıf, Dizilerden daha hızlıdır (ancak marjinal olarak).
  2. stdClass kötüdür.
  3. Sınıf, Dizilerden daha az bellek kullanır. (yaklaşık% 30-40 daha az !!)

ps: not olarak, eğer sınıf tanımlıysa ancak üyeler o zaman bu sınıfın kullanımı daha yavaştır. Ayrıca daha fazla bellek kullanır. Görünüşe göre sır, üyeleri tanımlamak.

Güncelleme

Php 5.4'ten php 5.5'e (5.5.12 x86 windows) güncelledim.

arrays: 1.6465699672699

memory: 460400

Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

arrays: 1.8687851428986

memory: 363704

SplFixedArray Object
(
    [0] => aaa
    [1] => bbb
    [2] => aaabbb
)

arrays: 1.8554251194

memory: 275568

SomeClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

arrays: 2.0101680755615

memory: 483656

stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

Php 5.5 için sonuç

  1. Diziler için PHP 5.5, PHP 5.4'ten daha hızlıdır, nesne için hemen hemen aynıdır
  2. PHP 5.5 ve dizilerin optimizasyonu sayesinde sınıf Dizilerden daha yavaştır.
  3. stdClass kötüdür.
  4. Sınıf hala Dizilerden daha az bellek kullanır. (yaklaşık% 30-40 daha az !!).
  5. SplFixedArray, bir Sınıf kullanmaya benzer ancak daha fazla bellek kullanır.

Size aferin efendim. Bunu iç içe dizilere, vb. Genişletmek ilginç olurdu. Diğer PHP performansı için ilginç siteler: phpbench.com php-benchmark-script.com ama sizin de bellek kullanmış olmanız hoşuma gitti .
Heath N

2
PHP7 ile diziler ve nesneler arasındaki fark daha önemli hale geldi. Betiğiniz,% 30 çalışma zamanı ve% 60 bellek farkı gösterir. Bu sadece benim makinem, ama genel bir kural olarak: Dizileri yapı olarak kullanmayın. Bunun yerine nesneleri kullanın :)
KingCrunch

Bu durumda nesneler sınıflardan farklı mı?
Matt G

Herhangi bir PHP7 güncellemesi umuduyla bunu yer imlerine ekleyin. Ve uygulanabilir olduğunda belki de yaklaşan PHP8. @magallanes
s3c

8

Bu kodu "profil oluşturma" için kullandım (1000 örnek, 1000.000 okuma / yazma):

function p($i) {
  echo '<pre>';
  print_r($i);
  echo '</pre>';
}


$t0 = microtime(true);
for ($i=0; $i<1000; $i++) {
    $z = array();
    for ($j=0; $j<1000; $j++) {
        $z['aaa'] = 'aaa';
        $z['bbb'] = 'bbb';
        $z['ccc'] = $z['aaa'].$z['bbb'];
    }
}
echo '<p>arrays: '.(microtime(true) - $t0);
p($z);

$t0 = microtime(true);
for ($i=0; $i<1000; $i++) {
    $z = (object) null;
    for ($j=0; $j<1000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;
    }
}
echo '<p>obj: '.(microtime(true) - $t0);
p($z);

echo '<p> phpversion '.phpversion();

Şu şeyleri barındıran LINUX'umda çıktı:

arrays: 1.1085488796234

Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
obj: 1.2824709415436

stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
phpversion 5.2.17

yani sonuç olarak: nesneler PHP 5.2'de bile daha yavaştır. Oop özelliklerine gerçekten ihtiyacınız olmadıkça nesneleri kullanmayın.


7
user levans stackoverflow.com/users/1473035/levans : Bunu 5.3.8 ile çalıştırdım ve nesneler daha yavaştı, diziler için 0.51839280128479 ve nesneler için 0.85355806350708. Ayrıca 5.4.13'te çalıştırdım ve muhtemelen diziler için 5.4, 0.6256799697876 ve 0.43650078773499'da yapılan sınıf optimizasyonları nedeniyle ters sonuçları aldım. Böylece, masalar dönmüş ve nesneler artık gidilecek yol gibi görünüyor.
Jean-Bernard Pellerin

1
İyi yanıt, XAMPP (Apache) üzerinde test ettim ve aşağıdaki sonuçları aldım: arrays: 0.5174868106842 Array ([aaa] => aaa [bbb] => bbb [ccc] => aaabbb) obj: 0.72189617156982 stdClass Object ([aaa] => aaa [bbb] => bbb [ccc] => aaabbb) phpversion 5.4.19
ilhnctn

1
5.4.13'te de koştum, ancak Jean-Bernard Pellerin'in tersini aldım: Diziler: 0.5020840167999 Nesneler: 1.0378720760345 Yani henüz nesnelere taahhüt vermezdim.
simontemplar

Kodda bazı değişiklikler yaptım ve Sınıf, php 5.4 için Dizilerden daha hızlı (5.4.16 32bits Windows). Sebebini açıklayan yeni bir cevap koydum.
magallanes

PHP 5.5.11 Sonuçlar: Diziler: 0.17430, Nesneler: 0.24183
Lex

3

Php 7.0.9 altında magallanes kodunu kullanıyorum:

arrays: 0.19802498817444

memory: 324672

Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.18602299690247

memory: 132376

SomeClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.1950249671936

memory: 348296

stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

Ve php 7.1.3 kullanıcısı:

arrays: 0.59932994842529
memory: 444920
Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

arrays: 0.72895789146423
memory: 164512

SomeClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

arrays: 0.61777496337891
memory: 484416
stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)                      

1
Ve stdClass'ın gerçek dize sayısal anahtarı kullanabileceğini unutmayın. ['1' => 1], [1 => 1] olarak depolanacak, ancak $a=new stdClass(); $a->{1} = 1; $b=(array)$a;gerçek ['1' => 1] alabiliriz.
chariothy

2
Sonuç olarak, diziler% 18 daha hızlıdır ancak 2,7 kat daha fazla bellek tüketir.
jchook

3

magallanes komut dosyası @ PHP 7.3.5

  • SomeClass Object en hızlı ve en hafiftir.
  • Array 1.32x hız. 2.70x bellek.
  • stdClass Object 1.65x hız. 2.94x bellek.

Ham çıktı:

arrays: 0.064794063568115
memory: 444920
Array (
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.048975944519043
memory: 164512
SomeClass Object (
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.081161022186279
memory: 484416
stdClass Object (
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

3

Hala bu soruyla ilgilenenler için :) Quazzle kodunu PHP 7.1 Ubuntu x64 üzerinde çalıştırdım ve şu yanıtı aldım:

arrays: 0.24848890304565

memory: 444920

Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.23238587379456

memory: 164512

SomeClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.24422693252563

memory: 484416

stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

Sonuç

Dizi , sınıf nesnesine göre 4 (!) Bellek alır.
Nesneyi marjinal olarak daha hızlı sınıflandırın.
stdClass hala kötü © magallanes :)


2

Bize nasıl $object->valueçalıştığına dair kodu göstermediniz , çünkü bu arka uç bir dizi olabilir ve bu durumda teorik olarak bir dizi kullanmak, bir daha az işlev çağrısı içerdiğinden daha hızlı olur. Arama yapmanın maliyeti, işlev çağrısına kıyasla muhtemelen çok büyük olacaktır. Bir değişkense, PHP'deki nesneler ve diziler çok benzer bir uygulamaya sahip olduğundan çok az farklılık olacaktır.

Optimizasyonlara bakıyorsanız, çoğu zaman nerede kullanıldığını kontrol etmek için profil oluşturmanız gerekecektir. Nesneleri dizilere dönüştürmenin büyük bir fark yaratmayacağından şüpheleniyorum.


Değerin genel bir değişken olacağını varsaydım, bu nedenle hash arama olmayabilirken kesinlikle O (1).
Filip Ekberg

2

Bunun eski bir gönderi olduğunu görüyorum, bu yüzden güncelleyeceğimi düşündüm. İşte Zend CE 5.3.21'de yapılan kodlarım ve istatistiklerim. Her şeyi test etmeye, bilgileri depolamaya ve geri çekmeye çalıştım.

V1: 0,83 saniye sürer

for ($i=1; $i<1000000; $i++) {
  $a = get_one();
  $b = $a[0];
  $b = $a[1];
}

function get_one() {
  return array(1,1);
}

V2: 3,05 saniye sürer

for ($i=1; $i<1000000; $i++) {
  $a = get_one();
  $b = $a->v;
  $b = $a->k;
}

function get_one() {
  $ret = new test();
  $ret->v = 1;
  $reb->k = 1;
  return $ret;
}

class test {
  public $v;
  public $k;
}

V3: 1,98 saniye sürer (yapıcının performansı artırdığını unutmayın)

for ($i=1; $i<1000000; $i++) {
  $a = get_one();
  $b = $a->v;
  $b = $a->k;
}

function get_one() {
  return new test(1,1);
}

class test {
  public $v;
  public $k;
  public function __construct($v, $k) {
    $this->v = $v;
    $this->k = $k;
  }
}

1

Bunun gibi mikro performans özellikleri için her zaman PHP kaynak kodunu kontrol edebilirsiniz.

Ancak ilk bakışta, ['değer'] yapmak daha hızlı olmayacaktır çünkü PHP'nin ['değer'] 'i nerede bulacağına dair bir Arama yapması gerekir, bir hashtable araması O (1) olması gerekse bile, bu garanti edilmez. Metin dizini kullandığınızda daha fazla ek yük vardır.

Nesne yalnızca değer olan erişmeniz gereken 1 değişken içeriyorsa, bir nesneyi kullanmanın daha fazla ek yükü vardır.


Ve sizce mülkler nerede aranır? Onlar da bir karma tablodadır ... (bu sadece az çok bagajda doğrudur).
Artefacto

1

Bugün @magallanes kıyaslamasına dayanarak merak ettim, bu yüzden biraz genişlettim. Şeyler arasındaki boşlukları gerçekten vurgulamak için bazı for döngülerini yükselttim. Bu, Apache 2.4, mod_php ve PHP 7.2 üzerinde çalışıyor.

Sonuçları daha kolay hale getirmek için aşağıda bir özet tablo verilmiştir:

+---------------------------+---------+-----------------+
|           Test            | Memory  |      Time       |
+---------------------------+---------+-----------------+
| Array                     | 2305848 | 9.5637300014496 |
| stdClass                  | 2505824 | 11.212271928787 |
| SomeClass                 |  164920 | 3.9636149406433 | <-- *
| AnotherClass              | 2563136 | 10.872401237488 |
| SetterClass               |  905848 | 59.879059791565 |
| SetterClassDefineReturn   |  905792 | 60.484427213669 |
| SetterClassSetFromParam   |  745792 | 62.783381223679 |
| SetterClassSetKeyAndParam |  745824 | 72.155715942383 |
+---------------------------+---------+-----------------+
* - Winner winner chicken dinner

Aşağıda değiştirilmiş komut dosyası verilmiştir. Ayar özelliklerini yöntemlerle ve türleri tanımlayarak test etmek istedim. Ayarlayıcı yöntemlerini kullanmanın koda önemli bir isabet eklediğini görünce çok şaşırdım. Şimdi bu, birçok uygulamanın buna bile ulaşmayacağı çok özel bir performans testidir. Ancak 1000 nesneyle kullanılan 1000 sınıfla 1000 / reqs / saniye işleyen bir siteniz varsa, bunun performansı nasıl etkileyebileceğini görebilirsiniz.

<?php

set_time_limit(500);

class SomeClass {
    public $aaa;
    public $bbb;
    public $ccc;
}
    
class AnotherClass {
}

class SetterClass {
    public $aaa;
    public $bbb;
    public $ccc;

    public function setAAA() {
        $this->aaa = 'aaa';
    }

    public function setBBB() {
        $this->bbb = 'bbb';
    }

    public function setCCC() {
        $this->ccc = $this->aaa.$this->bbb;
    }
}

class SetterClassDefineReturn {
    public $aaa;
    public $bbb;
    public $ccc;

    public function setAAA():void {
        $this->aaa = 'aaa';
    }

    public function setBBB():void {
        $this->bbb = 'bbb';
    }

    public function setCCC():void {
        $this->ccc = $this->aaa.$this->bbb;
    }
}

class SetterClassSetFromParam {
    public $aaa;
    public $bbb;
    public $ccc;

    public function setAAA(string $val): void {
        $this->aaa = $val;
    }

    public function setBBB(string $val): void {
        $this->bbb = $val;
    }

    public function setCCC(string $val): void {
        $this->ccc = $val;
    }
}

class SetterClassSetKeyAndParam {
    public $aaa;
    public $bbb;
    public $ccc;

    public function set(string $key, string $val): void {
        $this->{$key} = $val;
    }
}

function p($i) {
  echo '<pre>';
  print_r($i);
  echo '</pre>';
  echo '<hr>';
}

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<1000; $i++) {
    $z = new SomeClass();
    for ($j=0; $j<10000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z);

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = new AnotherClass();
    for ($j=0; $j<5000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z);

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = new SetterClass();
    for ($j=0; $j<5000; $j++) {
        $z->setAAA();
        $z->setBBB();
        $z->setCCC();          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z);

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = new SetterClassDefineReturn();
    for ($j=0; $j<5000; $j++) {
        $z->setAAA();
        $z->setBBB();
        $z->setCCC();          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z);

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = new SetterClassSetFromParam();
    for ($j=0; $j<5000; $j++) {
        $z->setAAA('aaa');
        $z->setBBB('bbb');
        $z->setCCC('aaabbb');          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';

p($z);

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = new SetterClassSetKeyAndParam();
    for ($j=0; $j<5000; $j++) {
        $z->set('aaa', 'aaa');
        $z->set('bbb', 'bbb');  
        $z->set('ccc', 'aaabbb');        
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z);

$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = new stdClass();
    for ($j=0; $j<5000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;          
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z); 


$t0 = microtime(true);
$arraysOf=[];
$inicio=memory_get_usage(); 
for ($i=0; $i<5000; $i++) {
    $z = [];
    for ($j=0; $j<5000; $j++) {
        $z['aaa'] = 'aaa';
        $z['bbb'] = 'bbb';
        $z['ccc'] = $z['aaa'].$z['bbb'];            
    }
    $arraysOf[]=$z;
}
$fin=memory_get_usage();    
echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>';
echo '<p>Memory: '.($fin-$inicio).'</p>';
p($z);

Ve işte sonuçlar:

Time Taken (seconds): 3.9636149406433

Memory: 164920

SomeClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

-----

Time Taken (seconds): 10.872401237488

Memory: 2563136

AnotherClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

----

Time Taken (seconds): 59.879059791565

Memory: 905848

SetterClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

----

Time Taken (seconds): 60.484427213669

Memory: 905792

SetterClassDefineReturn Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

----

Time Taken (seconds): 62.783381223679

Memory: 745792

SetterClassSetFromParam Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

----

Time Taken (seconds): 72.155715942383

Memory: 745824

SetterClassSetKeyAndParam Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

----

Time Taken (seconds): 11.212271928787

Memory: 2505824

stdClass Object
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)

----

Time Taken (seconds): 9.5637300014496

Memory: 2305848

Array
(
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)


0

Diziler ve Sınıflar aynı performanstaysa, iş verilerini depolamak / geçirmek için önceden tanımlanmış sınıfların nesnelerini kullanmanın programımızı daha mantıklı ve kodu daha okunabilir hale getireceğini düşünüyorum.

Bugün, Eclipse, Netbean gibi modern fikirlerle ... bir nesnenin (önceden tanımlanmış sınıftaki) hangi bilgiyi taşıdığını bilmek çok uygundur, ancak diziler öyle değildir

Örneğin: dizi ile

function registerCourse(array $student) {
    // Right here I don't know how a $student look like unless doing a print_r() or var_dump()
 ....
}

Nesne ile

class Studen {
    private $_name, $_age;
    public function getAge() {}
    public function getName() {}
    ..
}

function registerCourse(Studen $student) {
    // Right here I just Ctrl+Space $student or click "Student" and I know I can get name or age from it
    ...
}

Bu, diğer kanıtlanmış cevaplarla çelişiyor ve kanıtı yok. Yani bu gerçek bir cevaptan çok ideolojik bir inanç.
çörekler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.