Setting variables on Constructor VS on the class definition

后端 未结 2 1793
遥遥无期
遥遥无期 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) :

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

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

提交回复
热议问题