Đối tượng PHP vs Mảng - So sánh hiệu suất khi lặp lại


91

Tôi có một lượng lớn các đối tượng PHP cho một mạng nơ-ron mà tôi phải lặp lại và thực hiện một số phép toán trên đó. Tôi đã tự hỏi liệu tôi có nên sử dụng một mảng kết hợp tốt hơn trên các trường hợp của lớp không?

Tôi đang xử lý 3640các đối tượng xung quanh và lặp đi lặp lại 500nhiều lần (tốt nhất là) trên đó để mọi tối ưu hóa vi mô sẽ giúp ích rất nhiều. Nó chắc chắn sẽ nhanh hơn để làm $object['value']hơn $object->value?

Chỉnh sửa: Vì vậy, cả hai đều giống nhau. Nhưng tôi đoán sẽ có một chút chi phí cho nhà xây dựng? Dù thế nào thì tôi cũng không nghĩ là mình muốn đánh đổi những lớp học đẹp đẽ của mình để lấy những mảng bẩn: P

Câu trả lời:


65

Dựa trên mã của Quazzle, tôi đã chạy mã tiếp theo (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);  
?>

Và tôi nhận được kết quả tiếp theo:

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
)

Kết luận cho php 5.4

  1. Lớp nhanh hơn Mảng (nhưng không đáng kể).
  2. stdClass là ác.
  3. Lớp sử dụng ít bộ nhớ hơn Mảng. (giảm khoảng 30-40% !!)

ps: lưu ý, nếu lớp được định nghĩa nhưng các thành viên sau đó thì việc sử dụng lớp này sẽ chậm hơn. Nó cũng sử dụng nhiều bộ nhớ hơn. Rõ ràng bí mật là xác định các thành viên

Cập nhật

Tôi đã cập nhật từ php 5.4 lên php 5.5 (5.5.12 x86 windows).

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
)

Kết luận cho php 5.5

  1. Đối với mảng, PHP 5.5 nhanh hơn PHP 5.4, đối với đối tượng thì khá giống nhau
  2. Lớp chậm hơn Mảng nhờ sự tối ưu của PHP 5.5 và mảng.
  3. stdClass là ác.
  4. Lớp vẫn sử dụng ít bộ nhớ hơn Mảng. (giảm khoảng 30 - 40% !!).
  5. SplFixedArray tương tự như sử dụng một Class nhưng nó sử dụng nhiều bộ nhớ hơn.

Làm tốt lắm, thưa ngài. Sẽ rất thú vị nếu mở rộng điều này ra các mảng lồng nhau, v.v. Các trang web thú vị cho hiệu suất PHP khác: phpbench.com php-benchmark-script.com nhưng tôi thích rằng bạn cũng đã sử dụng bộ nhớ.
Heath N

2
Với PHP7, sự khác biệt giữa mảng và đối tượng trở nên đáng kể hơn. Tập lệnh của bạn cho thấy sự khác biệt giữa 30% thời gian chạy và 60% bộ nhớ. Đó chỉ là máy của tôi, nhưng theo quy tắc chung: Không sử dụng mảng làm cấu trúc. Sử dụng các đồ vật để thay thế :)
KingCrunch

Các đối tượng có khác với các lớp trong trường hợp này không?
Matt G

Đánh dấu trang này với hy vọng có bất kỳ bản cập nhật PHP7 nào. Và có lẽ là PHP8 sắp tới, khi có thể. @magallanes
s3c

8

Tôi đã sử dụng mã này để "lược tả" (1000 trường hợp, 1000.000 lần đọc / ghi):

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();

Nó xuất ra trong LINUX của tôi lưu trữ nội dung này:

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

vì vậy, kết luận: các đối tượng chậm hơn ngay cả trên PHP 5.2. Không sử dụng các đối tượng trừ khi bạn thực sự cần các tính năng oop của chúng.


7
từ người dùng levans stackoverflow.com/users/1473035/levans : Tôi chạy điều này với 5.3.8 và các đối tượng chậm hơn, 0,51839280128479 cho mảng so với 0,85355806350708 cho các đối tượng. Tôi cũng chạy nó vào ngày 5.4.13 và nhận được kết quả ngược lại, có thể là do tối ưu hóa lớp được thực hiện trong 5.4, 0.6256799697876 cho mảng so với 0.43650078773499. Vì vậy, có vẻ như các bảng đã chuyển và các đối tượng bây giờ là con đường để đi.
Jean-Bernard Pellerin

1
Câu trả lời hay, tôi vừa thử nghiệm trên XAMPP (Apache) và nhận được kết quả bên dưới: array: 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
Tôi cũng chạy trên 5.4.13, nhưng ngược lại với Jean-Bernard Pellerin: Mảng: 0.5020840167999 Đối tượng: 1.0378720760345 Vì vậy, tôi sẽ không cam kết với các đối tượng.
simontemplar,

Tôi đã thực hiện một số thay đổi trong mã và Lớp nhanh hơn Mảng cho php 5.4 (5.4.16 32bits Windows). Tôi đặt một câu trả lời mới giải thích lý do.
magallanes

PHP 5.5.11 Kết quả: Mảng: 0.17430, Đối tượng: 0.24183
Lex

3

Tôi sử dụng mã magallanes trong php 7.0.9:

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
)

Và người dùng php 7.1.3:

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
Và đừng quên stdClass có thể sử dụng khóa số chuỗi thực. ['1' => 1] sẽ được lưu trữ dưới dạng [1 => 1], nhưng chúng ta có thể sử dụng $a=new stdClass(); $a->{1} = 1; $b=(array)$a;get real ['1' => 1].
chariothy

2
Vì vậy, kết luận .. Mảng nhanh hơn 18% nhưng tiêu thụ bộ nhớ gấp 2,7 lần.
jchook

3

magallanes 'script @ PHP 7.3.5

  • SomeClass Object là nhanh nhất và nhẹ nhất.
  • Array Tốc độ 1,32x . Bộ nhớ 2,70x .
  • stdClass Object Tốc độ 1,65x . Bộ nhớ 2,94x .

Đầu ra thô:

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

Đối với bất kỳ ai vẫn quan tâm đến câu hỏi này :) Tôi đã chạy mã Quazzle trên PHP 7.1 Ubuntu x64 và nhận được câu trả lời sau:

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
)

Phần kết luận

Mảng chiếm 4 (!) Bộ nhớ hơn đối tượng lớp.
Đối tượng lớp nhanh hơn một chút.
stdClass vẫn xấu xa © magallanes :)


2

Bạn chưa cho chúng tôi xem mã về cách $object->valuehoạt động, vì có thể phần phụ trợ đó là một mảng, trong trường hợp về mặt lý thuyết, sử dụng một mảng sẽ nhanh hơn vì nó liên quan đến một lệnh gọi hàm ít hơn. Chi phí thực hiện tra cứu có thể sẽ rất lớn so với việc gọi hàm. Nếu nó là một biến, sẽ có rất ít sự khác biệt vì các đối tượng và mảng trong PHP có cách triển khai rất giống nhau.

Nếu bạn đang xem xét các tối ưu hóa, bạn sẽ cần phải lập hồ sơ để kiểm tra xem phần lớn thời gian đang được sử dụng ở đâu. Tôi nghi ngờ rằng việc thay đổi các đối tượng thành mảng sẽ không tạo ra sự khác biệt lớn.


Tôi đã giả định rằng giá trị đó sẽ là một biến công khai, do đó chắc chắn là O (1) trong khi tìm kiếm băm có thể không.
Filip Ekberg

2

Tôi thấy đây là một bài viết cũ nên tôi nghĩ tôi sẽ cập nhật nó. đây là mã và số liệu thống kê của tôi, được thực hiện trên Zend CE 5.3.21 Tôi đã cố gắng kiểm tra toàn bộ, lưu trữ thông tin và khôi phục thông tin.

V1: mất 0,83 giây

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

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

V2: mất 3,05 giây

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: mất 1,98 giây (lưu ý rằng hàm tạo cải thiện hiệu suất)

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

Bạn luôn có thể kiểm tra mã nguồn PHP để biết các tính năng vi mô như vậy.

Nhưng thoạt nhìn, không thực hiện ['value'] sẽ không nhanh hơn vì PHP cần thực hiện Tra cứu về nơi tìm ['value'] ngay cả khi tra cứu bảng băm phải là O (1), điều đó không được đảm bảo. Có nhiều chi phí hơn khi bạn sử dụng Text-index.

Nếu đối tượng chỉ chứa 1 biến mà bạn cần truy cập là giá trị, thì sẽ có nhiều chi phí hơn khi sử dụng một đối tượng.


Và bạn nghĩ tài sản được tra cứu ở đâu? Chúng cũng nằm trong bảng băm ... (mặc dù điều này ít nhiều đúng trong thân cây).
Artefacto

1

Hôm nay tôi rất tò mò dựa trên điểm chuẩn @magallanes, vì vậy tôi đã mở rộng nó một chút. Tôi đã thêm một số vòng lặp for để thực sự làm nổi bật khoảng cách giữa mọi thứ. Điều này đang chạy trên Apache 2.4, mod_php và PHP 7.2.

Dưới đây là bảng tóm tắt để làm cho kết quả dễ dàng hơn:

+---------------------------+---------+-----------------+
|           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

Dưới đây là kịch bản sửa đổi. Tôi muốn kiểm tra các thuộc tính thiết lập với các phương thức và kiểu xác định. Tôi rất ngạc nhiên khi thấy rằng việc sử dụng các phương pháp setter bổ sung một lượng truy cập đáng kể vào mã. Bây giờ được chấp nhận, đây là một bài kiểm tra hiệu suất rất cụ thể, nơi nhiều ứng dụng thậm chí sẽ không đạt được điều này. Nhưng nếu bạn có một trang web xử lý 1000 / reqs / giây với 1000 lớp được sử dụng với 1000 đối tượng, bạn có thể thấy điều này có thể ảnh hưởng đến hiệu suất như thế nào.

<?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);

Và đây là kết quả:

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

Nếu Mảng và Classs có cùng hiệu suất, tôi nghĩ rằng việc sử dụng các đối tượng của các lớp được xác định trước để lưu trữ / chuyển dữ liệu nghiệp vụ sẽ làm cho chương trình của chúng ta logic hơn và mã dễ đọc hơn.

Ngày nay, với các Ide hiện đại như Eclipse, Netbean ... rất tiện lợi để biết một đối tượng (thuộc lớp được xác định trước) đang mang thông tin gì nhưng các mảng thì không.

Vd: Với mảng

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

Với đối tượng

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
    ...
}

Điều này mâu thuẫn với các câu trả lời đã được chứng minh khác và không có bằng chứng. Vì vậy, đây là một niềm tin ý thức hệ, hơn là một câu trả lời thực tế.
bánh nướng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.