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ứ :-(
Họ đã mặc định giá trị ... không cần phải Init chúng AGAIN. –