Setting variables on Constructor VS on the class definition

后端 未结 2 1785
遥遥无期
遥遥无期 2020-12-03 14:42

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.

Whic

相关标签:
2条回答
  • 2020-12-03 15:24

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

    0 讨论(0)
  • 2020-12-03 15:28

    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.

    0 讨论(0)
提交回复
热议问题