【问题标题】:Confusing PHP OO Scenario令人困惑的 PHP OO 场景
【发布时间】:2011-10-12 03:34:36
【问题描述】:

为什么允许这样做?当您继承使用此范例的代码时,这非常令人困惑……尤其是当所述代码甚至不打扰正式声明公共属性,而是以某种随机方法设置它时。有没有办法阻止它(更改设置、使用某些关键字或使用界面)?

class Collision
{
    public $Sort = "sort property";

    public function Sort()
    {
        print 'sort function called<br/>';
        return 'sort function return';
    }
}

$a = new Collision();
print $a->Sort . '<br/>';
print $a->Sort() . '<br/>';

输出:

sort property
sort function called
sort function return

【问题讨论】:

  • 此外,您可以使用魔术方法 __get 和 __set 封装 getter/setter,还可以使用 __call (php.net/manual/en/language.oop5.magic.php) - 但我也不会想到这种行为。
  • 这段代码没有任何意外。它有一个共享相同文本的属性和方法;没有规则反对。除了设置一些编码实践和代码审查以确保未知的公共属性不会蔓延之外,我认为您可能不走运。恐怕这就是 PHP 的工作原理。
  • 等等……什么……? :) 抱歉,我没有很好地阅读输出 - 是的,我同意,真的没有什么意外的! Sort() 调用一个函数,对属性进行排序,就像在大多数语言中一样,我猜...
  • 只有一个解决方案,就是将 $sort 定义为 protected 或 private... 或者,定义 __set() 函数,它为所有变量返回 null(所以 $a->whatever将调用这个 __get() 魔术方法并返回 null)... 但是,该代码没有任何问题
  • @Quasdunk 还有哪些语言?不是 C#,不是 C++,不是 JavaScript……

标签: php oop


【解决方案1】:

我想以一种可能不寻常的方式来说明这一点。

多年前,在苏联,有一双鞋 制造工厂。这家工厂用皮革制作鞋子。植物 有配额,做这么多鞋子。过了一会儿,工人们发现 没有规定说他们必须做这么多任何大小的 鞋,所以他们开始生产同样尺寸的鞋,这样他们就可以走了 早点回家。

一段时间后,当局发现并开始制作 规则。一条规则说他们必须创造如此多的特定尺寸; 然后工厂在相同尺寸的鞋子上贴上不同尺寸的印章。然后一个 制定了这么多鞋子必须用这么多的东西制作的规则 皮革。所以工厂生产的鞋子有 3 英寸的鞋底,同样的 大小不管。最终,工厂停产了。

故事的寓意?如果您的开发人员不明白遵循您精心制定的规则符合他们的最大利益,这些规则是有原因的,您可能会遇到问题。如果您的规则不是谨慎和必要的,那么您可能会遇到问题(在 PHP 中)。如果您讨厌 PHP 并且无法忍受它是如何做某些事情的,那么您可能会更好地使用其他语言。

正如我的评论所说,最谨慎和最便宜(就花费的时间而言)将是建立谨慎的规则,而不是创建许多错误的构造(如魔术 getter/setter 和其他杂乱无章),因为你狡猾的程序员可以并且可能会(有时甚至没有意识到,例如在函数中创建的公共属性)绕过它们。

制定有意义的规则,让每个人都理解并接受。这是我的建议,它本质上比任何东西都更具意见。但我希望它有所帮助。 :)

【讨论】:

    【解决方案2】:

    这是允许的,因为 PHP 区分属性和方法。访问它们时,PHP 使用函数括号 () 的存在(或不存在)来确定是否引用了属性或方法。因此,计算机没有歧义,即使它可能会让人类感到困惑 =)

    【讨论】:

    • 感谢您的解释!我收集没有办法像我一样限制定义类?如果属性定义不存在,我可以使用 __set 魔法来禁止它,但我必须使用反射进行打击,因为 gettype($this->Sort) 是 NULL 如果只定义了方法。
    • 嗯.. 不,不是 AFAIK。您可以在 __set 魔术函数中使用 method_exists 和 property_exists 并禁止两者都返回 true 的情况,但这并不漂亮...
    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2022-01-17
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多