10

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

其中一项建议是避免使用从 Zend Performance PDF 中引用的魔术方法,该 PDF 没有给出建议避免使用它们的理由。

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

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

我可能有一个带有名称、描述、类别 ID、添加时间的表

我的 get 看起来像这样:

公共函数 __get($name) {
    开关($名称){
        案例“名称”:
        案例“描述”:
        案例“类别”:
        案例“时间添加”:
            $result = do_mysql_query();
            $this->name = $result['name'];
            $this->desc = $result['desc'];
            $this->category = $result['category'];
            $this->time_added = $result['time_added'];
            返回 $this->{$name};
        休息;
        默认:
            throw Exception("试图访问不存在的或私有的属性 - ".$name);
    }
}

这似乎是一种很好的做事方式,因为我只会在需要时从数据库中获取一些东西,并且我可以引用诸如 $article->time_added 之类的东西,而不是摆弄数组。

这会被认为是不好的做法和服务器上的额外负载吗?

通常,如果子类与 get 中的某些内容不匹配,我会使用魔术方法扩展类并执行类似的操作。

公共函数 __get($name) {
    开关($名称){
        案例“名称”:
        案例“描述”:
        案例“类别”:
        案例“时间添加”:
            $result = do_mysql_query();
            $this->name = $result['name'];
            $this->desc = $result['desc'];
            $this->category = $result['category'];
            $this->time_added = $result['time_added'];
            返回 $this->{$name};
        休息;
        默认:
            返回父级::__get($name);
    }
}

这会是不好的做法并且对性能不利吗?扩展魔术方法时,我拥有的最大级别数是三个。

4

3 回答 3

17

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

查看统计数据的神奇基准

于 2010-09-03T10:16:20.267 回答
1

考虑使用数组访问器

class Record implements ArrayAccess {

    /**
     * @see ArrayAccess::offsetExists()
     *
     * @param offset $offset
     */
    public function offsetExists($offset) {

    }

    /**
     * @see ArrayAccess::offsetGet()
     *
     * @param offset $offset
     */
    public function offsetGet($offset) {
        //fetch and cache $result

        return $result[$offset];
    }

    /**
     * @see ArrayAccess::offsetSet()
     *
     * @param offset $offset
     * @param value $value
     */
    public function offsetSet($offset, $value) {

    }

    /**
     * @see ArrayAccess::offsetUnset()
     *
     * @param offset $offset
     */
    public function offsetUnset($offset) {

    }
于 2010-09-03T10:24:31.613 回答
1

我用 PHP 魔术方法和本机 get/set 操作(在公共财产上)做了一些测试

结果:

魔术方法比本机访问慢得多。但是访问时间仍然很短,在 99.9% 的情况下都不会产生影响。

即使你在一个请求中进行 100 万次魔法方法访问,它仍然只需要大约 0.1 秒......


“只读”意味着通过魔术方法访问。 该图显示了 PHP 5.5.9 和 PHP 7.0 结果。

基准测试结果

这是基准脚本: https ://github.com/stracker-phil/php-benchmark/blob/master/benchmark.php

于 2017-04-23T19:51:43.033 回答