4

当人们处理扩展其他类并根据类中的某些设置提供功能的类时,我看到了两种不同的实现。

  • 变量用于存储设置。
  • 方法用于返回设置。

使用变量:

    class Model {
        var $fields = array();
        function getFields() {
            return array_keys($this->fields);   
        }
        function getRules() {
            return $this->fields;   
        }
    }
    class Person extends Model {
        var $fields = array(
            'name' => array('maxLength'=>10),
            'email' => array('maxLength'=>50, 'validEmail'=>true),
        );
    }

使用方法:

    class Model {
        function getFields() {}
    }
    class Person extends Model {
        function getFields() {
            return array('name','email');
        }
        function getRules() {
            return array(
                'name' => array('maxLength'=>10),
                'email' => array('maxLength'=>50, 'validEmail'=>true),
            );
        }   
    }

两个示例都实现了相同的结果,我可以执行类似$person->getFields()and的操作$person->getRules(),但是在方法示例中我不喜欢“重复”字段列表,因为字段实际上是在 and 中定义的,$person->getFields()并且$person->getRules()每次它都必须计算数组通过方法要求。另一方面,我不喜欢每个对象都将所有设置存储在一个变量中。这似乎是一种资源浪费。所以我只是想知道什么是更好的方法。

我的主要问题是:

  1. 是否有性能原因选择一种方式而不是另一种方式?2)
  2. 是否有面向对象逻辑/易于编程/其他原因选择一种方式而不是另一种方式?
4

2 回答 2

1

从一些基准测试中 - 时间非常相似 - 虽然例外

return array('name','email');

return array_keys($this->fields);

对每种方法运行 10,000 次操作会产生以下平均值:

Variable:
    getFields    0.06s
    getRules     0.05s
Method:
    getFields    0.04s
    getRules     0.05s

要回答您的第二个问题 - 这取决于您的用例 - 这些对象中存储的数据是静态的,还是来自另一个数据源/配置文件。

一个后续问题,为什么不使用对象属性?

class Person extends Model {
    protected $name
    protected $email

    public function getName() {
        return $this->name;
    }

    public function getEmail() {
        return $this->email;
    }

}
于 2012-08-01T16:29:28.403 回答
1

我的意见是选择你喜欢的东西,使用两者都没有太多的性能损失或性能提升。您可以更好地节省数据处理的性能节省工作。

对我来说,我使用对象属性,当你查看类时,它看起来很清楚,用于存储这些默认属性,如果你想覆盖它们,那么使用这个漂亮的语法:

array()+array()
于 2012-08-01T16:39:27.097 回答