最近我一直在想,如果有初始化是对类定义的构造VS默认值的变量之间的差异。
哪一个更好,考虑到优化:
class TestClass
{
private $test_var = 'Default Value';
function __construct()
{
}
}
class TestClass2
{
private $test_var;
function __construct()
{
$this->test_var = 'Default Value';
}
}
最近我一直在想,如果有初始化是对类定义的构造VS默认值的变量之间的差异。
哪一个更好,考虑到优化:
class TestClass
{
private $test_var = 'Default Value';
function __construct()
{
}
}
class TestClass2
{
private $test_var;
function __construct()
{
$this->test_var = 'Default Value';
}
}
构造函数初始化外特性的优点是,有人读你的代码会立刻知道它的默认值。
难以忽视的是你不能使用各种数据的这种方式 - 将与对象不instanciations工作,例如,或者定界符语法,从我记得。
我不认为,当涉及到性能有多大的差别 - 反正,大概有很多事情说事多了很多,在您的应用程序;-)
不过,纯粹是为了好玩,用火神逻辑反汇编:
随着代码(第一示例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.
所以,我猜有一点差别的......但是不是那么重要^^
由你来解释操作码-但有趣的是有没有“的痕迹Default Value
在第一个转储” ......有意思,居然^^
好像VLD不能(或者只是不)转储一切:-(
我认为这主要是归结为个人喜好。 不过,也有一些值不能直接设置成变量,如新的类的实例,你必须在构造函数中分配。