最近我一直在想,是否在类定义上初始化构造函数VS上的默认值的变量之间有区别.
哪一个更好,考虑到优化:
class TestClass { private $test_var = 'Default Value'; function __construct() { } } class TestClass2 { private $test_var; function __construct() { $this->test_var = 'Default Value'; } }
初始化构造函数之外的属性的优点是,读取代码的人将立即知道其默认值.
不方便的是,您不能以这种方式使用各种数据 – 不会使用对象实例,例如或使用heredoc语法,从我记得.
我认为在性能方面有很大的不同 – 反正在你的应用程序中,可能还有很多事情会变得更重要;-)
仍然,纯粹为了乐趣,使用Vulcan Logic Disassembler:
<?PHP class TestClass { private $test_var = 'Default Value'; function __construct() { } } $a = new TestClass();
你得到这些操作码:
$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.
<?PHP class TestClass2 { private $test_var; function __construct() { $this->test_var = 'Default Value'; } } $a = new TestClass2();
你得到这些操作码:
$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.
所以,我猜想有一点区别…但不是那么重要^^
直到你解释操作码 – 但有趣的是,在第一个转储中没有“默认值”的痕迹…有趣,实际上是^^似乎VLD不能(或只是不)倾倒一切:-(