在类定义设置上构造VS变量(Setting variables on Constructor VS

2019-07-19 19:20发布

最近我一直在想,如果有初始化是对类定义的构造VS默认值的变量之间的差异。

哪一个更好,考虑到优化:

class TestClass
{
 private $test_var = 'Default Value';
 function __construct()
 {
 }
}

class TestClass2
{
 private $test_var;
 function __construct()
 {
  $this->test_var = 'Default Value';
 }
}

Answer 1:

构造函数初始化外特性的优点是,有人读你的代码会立刻知道它的默认值。

难以忽视的是你不能使用各种数据的这种方式 - 将与对象不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不能(或者只是不)转储一切:-(



Answer 2:

我认为这主要是归结为个人喜好。 不过,也有一些值不能直接设置成变量,如新的类的实例,你必须在构造函数中分配。



文章来源: Setting variables on Constructor VS on the class definition