php – 在构造函数VS上设置变量在类定义上
发布时间:2020-12-13 17:28:06 所属栏目:PHP教程 来源:网络整理
导读:最近我一直在想,是否在类定义上初始化构造函数VS上的默认值的变量之间有区别. 哪一个更好,考虑到优化: class TestClass{ private $test_var = 'Default Value'; function __construct() { }}class TestClass2{ private $test_var; function __construct() {
最近我一直在想,是否在类定义上初始化构造函数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: 使用第一个代码示例(temp-2.php): <?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. 而第二个例子代码(temp-3.php): <?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不能(或只是不)倾倒一切:-( (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |