【问题标题】:PHP5. Two ways of declaring an array as a class member [closed]PHP5。将数组声明为类成员的两种方法[关闭]
【发布时间】:2010-12-29 20:40:56
【问题描述】:

当声明一个数组为类成员时,应该怎么做?

class Test1 {
    private $paths = array();

    public function __construct() {
        // some code here
    }
}

class Test2 {
    private $paths;

    public function __construct() {
        $this->paths = array();
        // some code here
    }
}

就良好做法和性能而言,哪一个更好?你会推荐什么?

【问题讨论】:

    标签: php class constructor initialization


    【解决方案1】:

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

    【讨论】:

    • 是的,这很重要!正如 PHP5 文档所述:“如果子类定义了构造函数,则不会隐式调用父构造函数”。
    • “我建议这样做”当 OP 提出非此即彼的问题时?这是什么”?是在构造函数中还是作为声明的一部分?
    • @Adam:OP 很清楚这意味着什么。也许是因为他读了整句话。
    • 很清楚 OP 的意思是什么,但不是答案的意思。可以确定您可能指的是第一个替代方案,但在我看来,这还很不清楚,因此发表了评论。一般来说,如果问题是“我应该做 A 还是 B?”那么答案应该是“做 A 因为...”而不是“是因为...”,即使可以从您建议做 A 的“因为”中找出答案。
    • @Adam Dude,问题是“我应该在构造函数中还是在声明变量时这样做?”答案是“在声明变量的同时做”。
    【解决方案2】:

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

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

    // Function call is not valid here
    private $paths = get_paths();
    

    这里的性能不是一个真正的问题,因为每个都有自己的用例。

    【讨论】:

      【解决方案3】:

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

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

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

      现在,如果我只看这个类,我无法确定是否有可用的变量 foo。如果有,我不知道我是否可以从实例之外的任何地方访问它。

      如果我有:

      public $foo = array();
      

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

      【讨论】:

        【解决方案4】:

        没有性能影响。停止沉迷于无关紧要的事情 - 专注于存在的性能问题:首先衡量,只优化最严重的问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-09
          • 1970-01-01
          • 2012-06-22
          • 2011-09-29
          • 2019-04-05
          • 2014-07-17
          • 1970-01-01
          相关资源
          最近更新 更多