【问题标题】:Are Magic Methods Best practice in PHP? [closed]魔术方法是 PHP 中的最佳实践吗? [关闭]
【发布时间】:2010-04-23 10:53:29
【问题描述】:

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

【问题讨论】:

  • “最佳实践”是什么意思?你的问题对我来说真的没有意义。它们是工具,有些事情离不开它们。你到底想知道什么?
  • 我正在读一本书 n OOP 我遇到了 getter 和 setter,在那里我看到了魔术方法术语。但是一旦有人告诉我它们已被弃用,是这样吗??
  • 我的猜测是,要么他认为它们在偷偷摸摸/作弊(比如 i++goto,要么他担心它们被过度使用或不可靠。你知道,比如使用表格进行造型。
  • 哦,我猜这不是我们所说的属性重载吗?
  • @Parth 请添加一些关于哪些方法被视为已弃用的详细信息。

标签: php magic-methods


【解决方案1】:

缺点

  1. 文本搜索找不到函数

  2. 系统更难理解,尤其是新手

  3. 重构工具可能会更频繁地失败

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

当搜索函数(或其他符号)无法找到所有匹配项时,删除旧代码将成为一场噩梦,这种恐惧会导致死代码堆积在代码库中。如果删除死代码,可能会导致未知位置的损坏。

【讨论】:

    【解决方案2】:

    我不认为魔术方法是最好的或最差的做法:取决于你想要达到的目标,你可以使用或不使用它们...... 我的意思是你不必尽可能地调整你的代码来使用它们,但如果你必须这样做的话,完全没有问题。

    如果您有一个具有 3 个且只有 3 个属性的对象,则不需要使用魔法 setter/getter,但在某些高级情况下,它们是处理非常复杂的事情(ORM 系统等)的好方法

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

    【讨论】:

      【解决方案3】:

      至少,其中一些神奇的功能是谷歌推荐的:

      避免编写幼稚的 setter 和 getter

      在 PHP 中编写类时,您可以节省时间并加快您的 通过直接使用对象属性来编写脚本,而不是 编写幼稚的 setter 和 getter。在下面的例子中,狗 类使用 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

      无论如何,这些方法可能性能不佳,但根本不会被弃用。

      【讨论】:

      • 这个答案完全是题外话。 “谷歌”不反对使用本机 getter/setter 与魔术函数。如果他们只直接修改属性,他们建议不要使用本机 getter/setter。这不是一回事。
      • 他们反对使用“幼稚”的 getter/setter。当时对最初问题的流行回答(3 年前,顺便说一句,这是我给你的礼物:xkcd.com/386)暗示魔法方法已被弃用。我的回答只是表明这不一定是绝对真理。
      • IDE 支持应该得到改进,以防止在魔法函数存在时警告方法“x”不存在......
      【解决方案4】:

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

      我不喜欢使用它们,最好由我的 ide 生成所需的方法(如许多 setter 和 getter)。

      【讨论】:

      • 这可能适用于 getter 和 setter,但 __construct__clone 等不也被认为是“神奇的方法”吗? php.net/manual/en/language.oop5.magic.php没有他们怎么办?
      • 正确同意@Potter 我的意思是@Pekka :)
      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多