在类定义上设置Constructor VS上的变量 [英] Setting variables on Constructor VS on the class definition
问题描述
最近我一直在想,如果初始化的变量在类定义的构造函数VS上有一个默认值。
Lately I've been wondering if there's a difference between initializing the variables that have a default value on the Constructor VS on the class definition.
哪一个更好,考虑到优化:
Which one is better, taking into consideration the optimization:
class TestClass
{
private $test_var = 'Default Value';
function __construct()
{
}
}
class TestClass2
{
private $test_var;
function __construct()
{
$this->test_var = 'Default Value';
}
}
推荐答案
在构造函数之外初始化属性的优点是,读取代码的人将立即知道其默认值。
The advantage of initializing properties outside of the constructor is that someone reading your code will immediatly know its a default value.
不便于您不能使用每种类型的数据 - 将不会使用对象方法,例如,或从我记得的heredoc语法。
Inconvenient is you cannot use every kind of data this way -- will not work with object instanciations, for instance, or with heredoc syntax, from what I recall.
我不认为有很多 - )
I don't think there is much of a difference when it comes to performance -- anyway, there are probably lots of things that matter a lot more, in your application ;-)
$ b,在你的应用程序中有很多重要的事情$ b仍然,纯粹为了乐趣,使用Vulcan逻辑反汇编器:
Still, purely for fun, using the Vulcan Logic Disassembler :
使用第一个代码示例( temp-2.php
):
With the first example of code (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
):
While, with the second example of code (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.
所以,我猜想有一点区别...但不是那么重要^ ^
So, I'm guessing there is a bit of a difference... But not that important ^^
直到你解释操作码 - 但有趣的是没有跟踪'默认值
'在第一个转储...有趣的,实际上^^
似乎VLD不能(或只是不)转储一切: - (
Up to you to interpret the opcodes -- but the funny thing is there is no trace of 'Default Value
' in the first dump... interesting, actually ^^
Seems VLD cannot (or just doesn't) dump everything :-(
这篇关于在类定义上设置Constructor VS上的变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!