在类定义上设置Constructor VS上的变量 [英] Setting variables on Constructor VS on the class definition

查看:134
本文介绍了在类定义上设置Constructor VS上的变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

最近我一直在想,如果初始化的变量在类定义的构造函数VS上有一个默认值。

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


推荐答案

在构造函数之外初始化属性的优点是,读取代码的人将立即知道其默认值。

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

不便于您不能使用每种类型的数据 - 将不会使用对象方法,例如,或从我记得的heredoc语法。

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


$ b,在你的应用程序中有很多重要的事情$ b仍然,纯粹为了乐趣,使用Vulcan逻辑反汇编器:


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

使用第一个代码示例( temp-2.php ):

With the first example of code (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 ):

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

您得到这些操作码:

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

直到你解释操作码 - 但有趣的是没有跟踪'默认值'在第一个转储...有趣的,实际上^^

似乎VLD不能(或只是不)转储一切: - (

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

这篇关于在类定义上设置Constructor VS上的变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆