gpt4 book ai didi

php - 在类定义的 Constructor VS 中设置变量

转载 作者:IT王子 更新时间:2023-10-29 00:09:58 24 4
gpt4 key购买 nike

最近我一直在想,在类定义的构造函数 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.

所以,我猜有一点不同......但不是那么重要 ^^

由您来解释操作码——但有趣的是,在第一个转储中没有“Default Value”的踪迹……实际上很有趣 ^^
似乎 VLD 不能(或只是不能)转储所有内容 :-(

关于php - 在类定义的 Constructor VS 中设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1484265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com