2010-04-23 49 views
31

魔术方法PHP中的最佳实践?魔术方法PHP中的最佳实践?

+1

“最佳实践”是什么意思?你的问题对我来说并不合适。他们是工具,有些事情离不开他们。你想知道什么? – 2010-04-23 10:56:57

+0

我正在读一本书n OOP我遇到了吸气和安装员,在那里我看到了神奇的方法术语..但是一旦有人告诉我他们已被弃用,是这样吗? – 2010-04-23 10:58:28

+2

我的猜测是要么他认为他们是偷偷摸摸/作弊(像'我++'和'goto',或者他担心他们被过度使用或不可靠,你知道,就像使用表格造型 – Anthony 2010-04-23 10:59:52

回答

21

我不认为神奇的方法是最好的或最坏的做法:取决于你想达到什么你可以使用它们或不... 我的意思是,你不必调整你的代码尽可能使用它们,但是如果你必须这样做,那完全没有问题。

如果你有一个拥有3个属性但只有3个属性的对象,你不需要使用魔术设置器/获取器,但是在某些高级的情况下,它们是一个很好的方法来完成非常复杂的事情(ORM系统等)

也许其中一些已被弃用,我不知道,但大多数都不是。

3

我不这么认为。我的IDE无法向魔术设置者和获取者显示“提示”。尽管代码有时难以调试。

我更喜欢不使用它们,bette通过我的IDE生成所需的方法(像许多setters和getters)。

+2

这可能适用于getter和setter,但不是'__construct','__clone'等也被认为是“神奇的方法”?http://php.net/manu al/en/language.oop5.magic.php没有他们的人会如何工作? – 2010-04-23 11:02:53

+0

正确同意@Potter i平均@Pekka :) – 2010-04-23 11:06:28

6

至少,其中的一些神奇的功能,建议由谷歌:

避免写天真getter和setter方法

当PHP编写的类,可以节省时间和加快您的 通过直接使用对象属性而不是 编写简单的制定者和获得者。在以下示例中,狗 类使用setName()和getName()方法来访问名称 属性。

class dog { 
    public $name = ''; 

    public function setName($name) { 
    $this->name = $name; 
    } 

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

注意的setName()输出,getName()什么都不做比商店越来越 分别返回name属性。

$rover = new dog(); 
$rover->setName('rover'); 
echo $rover->getName(); 

设置和调用name属性直接可以运行 up to 100% faster,以及削减开发时间。

$rover = new dog(); 
$rover->name = 'rover'; 
echo $rover->name; 

原文链接:http://code.google.com/speed/articles/optimizing-php.html

存档版本:https://web.archive.org/web/20120208060457/http://code.google.com/speed/articles/optimizing-php.html

无论如何,这些方法可能不是高性能,但他们不会被弃用的。

+2

在这里,另一种意见:http://www.garfieldtech.com/sites/default/files/benchmarks.png:D (请参阅http://www.garfieldtech .com/blog/magic-benchmarks) – Rolf 2010-04-23 12:01:30

+1

这个答案完全是题外话。 “Google”并不反对使用本地getter/setter与魔术功能。他们建议不要使用本地getter/setter,如果他们只是直接修改属性。这不是一回事。 – 2013-08-26 10:28:08

+0

他们反对使用“天真”的getter/setter。当时最初问题的流行答案(3年前,btw,这里是我给你的:http://xkcd.com/386/)建议不要使用魔术方法。我的回答只是指出,这不一定是绝对的事实。 – Rolf 2013-08-27 09:05:49

39

利弊

  1. 文本搜索没有找到该功能

  2. 系统是很难理解,尤其是对于新手

  3. 重构工具威力更经常失败

一般来说,魔术方法做事情的幕后程序员可能没有意识到它的发生,这使得调试困难。

当搜索功能(或其他符号)找不到所有匹配时,它将成为一个噩梦来删除旧代码,这种恐惧会导致死代码堆积在代码库中。如果移除了死码,它可能会导致未知地方发生破损。