2009-09-27 9 views
11

Gần đây tôi đã tự hỏi nếu có sự khác biệt giữa việc khởi tạo các biến có giá trị mặc định trên Constructor VS trên định nghĩa lớp.Thiết lập các biến trên Constructor VS trên định nghĩa lớp

Cái nào là tốt hơn, có tính đến việc tối ưu hóa:

class TestClass 
{ 
private $test_var = 'Default Value'; 
function __construct() 
{ 
} 
} 

class TestClass2 
{ 
private $test_var; 
function __construct() 
{ 
    $this->test_var = 'Default Value'; 
} 
} 
+0

Họ đã mặc định giá trị ... không cần phải Init chúng AGAIN. –

Trả lời

25

Lợi thế của việc khởi tạo thuộc tính bên ngoài hàm tạo là ai đó đọc mã của bạn sẽ biết ngay lập tức giá trị mặc định của nó.

Không thuận tiện là bạn không thể sử dụng mọi loại dữ liệu theo cách này - sẽ không hoạt động với instanciation đối tượng, ví dụ, hoặc với cú pháp heredoc, từ những gì tôi nhớ lại.


Tôi không nghĩ rằng có nhiều sự khác biệt khi nói đến hiệu suất - dù sao, có lẽ rất nhiều điều quan trọng hơn rất nhiều, trong ứng dụng của bạn ;-)


Tuy nhiên, hoàn toàn cho vui, bằng cách sử dụng Vulcan logic disassembler:

với ví dụ đầu tiên của mã (temp-2.php):

<?php 
class TestClass { 
    private $test_var = 'Default Value'; 
    function __construct() { 
    } 
} 
$a = new TestClass(); 

Bạn sẽ có được những opcodes:

$ php -d extension=vld.so -d vld.active=1 temp-2.php 
Branch analysis from position: 0 
Return found 
filename:  /home/squale/developpement/tests/temp/temp-2.php 
function name: (null) 
number of ops: 11 
compiled vars: !0 = $a 
line  # op       fetch   ext return operands 
------------------------------------------------------------------------------- 
    2  0 EXT_STMT 
     1 NOP 
    7  2 EXT_STMT 
     3 ZEND_FETCH_CLASS         :1  'TestClass' 
     4 EXT_FCALL_BEGIN 
     5 NEW            $2  :1 
     6 DO_FCALL_BY_NAME        0 
     7 EXT_FCALL_END 
     8 ASSIGN             !0, $2 
     9 RETURN             1 
     10* ZEND_HANDLE_EXCEPTION 

Class TestClass: 
Function __construct: 
Branch analysis from position: 0 
Return found 
filename:  /home/squale/developpement/tests/temp/temp-2.php 
function name: __construct 
number of ops: 4 
compiled vars: none 
line  # op       fetch   ext return operands 
------------------------------------------------------------------------------- 
    4  0 EXT_NOP 
    5  1 EXT_STMT 
     2 RETURN             null 
     3* ZEND_HANDLE_EXCEPTION 

End of function __construct. 

End of class TestClass. 

Trong khi, với ví dụ thứ hai của mã (temp-3.php):

<?php 
class TestClass2 { 
    private $test_var; 
    function __construct() { 
     $this->test_var = 'Default Value'; 
    } 
} 
$a = new TestClass2(); 

bạn có được những opcodes:

$ php -d extension=vld.so -d vld.active=1 temp-3.php 
Branch analysis from position: 0 
Return found 
filename:  /home/squale/developpement/tests/temp/temp-3.php 
function name: (null) 
number of ops: 11 
compiled vars: !0 = $a 
line  # op       fetch   ext return operands 
------------------------------------------------------------------------------- 
    2  0 EXT_STMT 
     1 NOP 
    8  2 EXT_STMT 
     3 ZEND_FETCH_CLASS         :1  'TestClass2' 
     4 EXT_FCALL_BEGIN 
     5 NEW            $2  :1 
     6 DO_FCALL_BY_NAME        0 
     7 EXT_FCALL_END 
     8 ASSIGN             !0, $2 
    9  9 RETURN             1 
     10* ZEND_HANDLE_EXCEPTION 

Class TestClass2: 
Function __construct: 
Branch analysis from position: 0 
Return found 
filename:  /home/squale/developpement/tests/temp/temp-3.php 
function name: __construct 
number of ops: 7 
compiled vars: none 
line  # op       fetch   ext return operands 
------------------------------------------------------------------------------- 
    4  0 EXT_NOP 
    5  1 EXT_STMT 
     2 ZEND_ASSIGN_OBJ           'test_var' 
     3 ZEND_OP_DATA            'Default+Value' 
    6  4 EXT_STMT 
     5 RETURN             null 
     6* ZEND_HANDLE_EXCEPTION 

End of function __construct. 

End of class TestClass2. 

Vì vậy, tôi đoán có có một chút khác biệt ... Nhưng điều đó không quan trọng ^^

Tối đa bạn giải thích các opcodes - - nhưng điều buồn cười là không có dấu vết của 'Default Value' trong bãi chứa đầu tiên ... thú vị, thực sự ^^
Có vẻ VLD không thể (hoặc không) đổ tất cả mọi thứ :-(

+3

+1 cho php tháo rời – elcuco

+0

Câu trả lời Excel :) Cảm ơn bạn – MarioRicalde

+0

Bạn được chào đón :-) Hãy vui vẻ! –

3

Tôi nghĩ rằng nó chủ yếu là nắm để sở thích cá nhân. Tuy nhiên, có một số giá trị bạn không thể đặt trực tiếp cho biến, chẳng hạn như các cá thể lớp mới, mà bạn phải gán trong hàm tạo.