Setting variables on Constructor VS on the class definition

六眼飞鱼酱① 提交于 2019-12-17 12:24:18

问题


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';
 }
}

回答1:


The advantage of initializing properties outside of the constructor is that someone reading your code will immediatly know its a default value.

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 ;-)


Still, purely for fun, using the Vulcan Logic Disassembler :

With the first example of code (temp-2.php) :

<?php
class TestClass {
    private $test_var = 'Default Value';
    function __construct() {
    }
}
$a = new TestClass();

You get these opcodes :

$ 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.

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();

You get those opcodes :

$ 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 ^^

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 :-(




回答2:


I think it mostly boils down to personal preferences. However, there are some values you can't set directly to the variable, such as new class instances, that you must assign in the constructor.



来源:https://stackoverflow.com/questions/1484265/setting-variables-on-constructor-vs-on-the-class-definition

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!