PHP5.将数组声明为类成员的两种方法

ezp*_*sso 22 php constructor initialization class

将数组声明为类成员时,应该采用哪种方式?

class Test1 {
    private $paths = array();

    public function __construct() {
        // some code here
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

class Test2 {
    private $paths;

    public function __construct() {
        $this->paths = array();
        // some code here
    }
}
Run Code Online (Sandbox Code Playgroud)

在良好实践和绩效方面哪一个更好?你会推荐什么?

Mch*_*chl 10

我建议在声明一个类变量时这样做.构造函数可以在扩展类中重写,如果你的任何函数依赖于这个变量是一个数组(甚至是一个空数组),这可能会导致E_NOTICEs甚至E_WARNINGs

  • 当OP询问一个/或者问题时,"我建议这样做" 这是什么"?在构造函数中或作为声明的一部分执行此操作? (11认同)
  • 很清楚OP意味着什么,但答案意味着什么.可能会发现你可能意味着第一种选择,但在我看来,它远非明确,因此评论.一般来说,问题是"我应该做A还是B?" 然后答案应该是"做一个因为......"而不是"是因为......",即使你可以从"因为"你的建议做出来做事. (4认同)
  • @Adam:OP很清楚这意味着什么。也许是因为他读了整个句子。 (2认同)
  • @Adam Dude,问题是'我应该在构造函数中还是在声明变量时执行此操作?' 答案是"在声明变量时执行此操作". (2认同)

Bol*_*ock 6

如果要在初始化期间动态填充数组,请在构造函数中执行此操作.如果它包含固定值,请在属性声明中执行.

尝试在声明中动态填充数组(例如,通过使用某个函数或方法的返回值)会导致解析错误:

// Function call is not valid here
private $paths = get_paths();
Run Code Online (Sandbox Code Playgroud)

由于每个都有自己的用例,因此性能不是真正关注的问题.


sbe*_*rry 6

一般来说,因为除了PHP之外我主要用其他语言编写,我喜欢在构造函数之外声明我的实例变量.这让我看一下类的顶部,并了解所有属性及其访问修饰符,而无需阅读代码.

例如,我真的不喜欢这样的方法

// ...
// whole bunch of code
// ...
public function initialize() {
    $this->foo = array();
    // some other code to add some stuff to foo
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我只是看一下这个类,我不能确定有一个变量foo甚至可用.如果有,我不知道我是否可以从实例外的任何地方访问它.

如果相反,我有:

public $foo = array();
Run Code Online (Sandbox Code Playgroud)

在我的班级顶部,我知道foo是一个实例属性,我可以从其他地方访问它.