PHP - Zend说避免魔术方法?

Rob*_*Rob 10 php performance magic-methods

我正在阅读这个页面 - http://deaduseful.com/blog/posts/50-php-optimisation-tips-revisited

其中一个建议是避免使用Zend Performance PDF引用的Magic Methods,它没有给出建议避免它们的理由.

经过一些谷歌搜索(并在这里结束一个不相关的问题),我想知道是否有人在这方面有任何推荐?

我在我的代码中使用了__get(),通常用于保存我并不总是使用的变量,例如

我可能有一个名为desc,category_id,time_added的表

我得到的东西会是这样的:

public function __get($name) {
    switch($name) {
        case 'name':
        case 'desc':
        case 'category':
        case 'time_added':
            $result = do_mysql_query();
            $this->name = $result['name'];
            $this->desc = $result['desc'];
            $this->category = $result['category'];
            $this->time_added = $result['time_added'];
            return $this->{$name};
        break;
        default:
            throw Exception("Attempted to access non existant or private property - ".$name);
    }
}

这似乎是一种很好的做事方式,因为我只需要从数据库中获取一些东西,如果需要的话,我可以为$ article-> time_added而不是摆弄数组.

这会被视为不良做法和服务器上的额外负载吗?

通常我会使用魔术方法扩展类,如果子类与get中的某些东西不匹配,则执行类似的操作.

public function __get($name) {
    switch($name) {
        case 'name':
        case 'desc':
        case 'category':
        case 'time_added':
            $result = do_mysql_query();
            $this->name = $result['name'];
            $this->desc = $result['desc'];
            $this->category = $result['category'];
            $this->time_added = $result['time_added'];
            return $this->{$name};
        break;
        default:
            return parent::__get($name);
    }
}

这会是不好的做法而且对性能有害吗?扩展魔术方法时的最大级别数为3.

Ash*_*ley 16

确实如此,它们的速度较慢......但差异非常小,速度与代码是一个因素.是否值得担心快速开发和维护的差异?

查看统计数据的魔术基准

  • +1:你不能高估这种情绪.请记住,"过早优化是所有邪恶的根源......"如果你把所有的时间都花在担心微小的速度差异上,那么你将永远不会做任何事情.以适合你的方式构建它,然后**如果**你有问题,从那里重构.但是,您可以实现的最大性能改进是从非工作状态转换为工作状态.其他一切都相形见绌...... (19认同)
  • 恕我直言可维护代码比高性能代码更重要.想一想.在一个问题上投入更多的硬件要比投入更多的开发人员更便宜.这是PHP如此受欢迎的一个原因......现在,总是需要权衡,所以我不建议忽略性能,但如果你不知道是否存在问题,不要尝试微优化. . (4认同)