【问题标题】:php multiple classes and methods with same namephp多个具有相同名称的类和方法
【发布时间】:2011-11-26 20:03:18
【问题描述】:

如果我从“workingCLass”中调用“myClass::getItems()”,将调用哪个 getId 方法?呼应“你好”或“再见”的那个?谢谢你。

class myClass extends otherClass {
   function getId(){
      echo "hello";
   }
}


class otherClass{
   function getItems(){
      $this->getId();
   }
   function getId(){
      echo "bye";
   }
}


class workingClass extends myClass {
   function __construct(){
      $this->getItems();
   }
}

【问题讨论】:

    标签: php class methods naming


    【解决方案1】:

    带有"hello" 的那个,因为您明确指定了要调用的那个。

    不过,问题在于它不是静态的,而是在静态上下文中调用它。

    编辑:使用$this,它不会调用任何东西,因为workingClass 中没有getItems()。如果 workingClass 扩展了 otherClass 它会做 "bye" 的事情。

    【讨论】:

    • 你说得对,应该是 $this->getItems()。如果我在“myClass”中没有“getId”方法,会不会回显“bye”?
    【解决方案2】:

    这将导致致命错误,因为您正在静态调用此方法 (::) 并且在此方法中您使用的是 $this 特殊变量,它引用 workingClass(调用它的对象) 和workingClass 没有 getId 方法。

    好的,现在在修复示例之后,我可以说它将输出“hello”,因为当从对象 ($this->) 调用方法时,PHP 将始终运行在最新子类中定义的方法。

    【讨论】:

    • 是的,你说得对,我在示例中搞砸了,我正在查看某人的代码,不想复制粘贴大量内容。
    • 它仍然是致命错误...如果 workingClass 将扩展 myClass 那么它将起作用并从 myClass 调用 getId()(你好)。
    • @milan - 现在这个例子很有意义,我已经用一些解释更新了我的答案。
    • “PHP 将始终运行在最新的子类中定义的一个”,这是我不知道的。谢谢。
    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2013-01-21
    • 1970-01-01
    • 2013-06-13
    • 2011-07-02
    相关资源
    最近更新 更多