【问题标题】:Understanding Classes in PHP了解 PHP 中的类
【发布时间】:2011-03-08 16:16:20
【问题描述】:

我是正式的智障。 [让我解释一下]

直到今天,我才真正考虑过课程及其关系。我试图找出一些似乎很明显的东西,但由于我很愚蠢,所以我看不到它。

假设我有一个从不同文件扩展而来的核心类。子类如何调用其他兄弟的函数(也就是说,如果那些被认为是子类)。 示例代码:(不要杀我)

class cOne { 
    public function functionOne(){
       echo "something";
    }
}

然后在另一个文件上,我说:

class cOneChildOne extends cOne { 
    public function functionOne(){
       echo "something from child one";
    }
}

我在另一个文件上说:

class cOneChildTwo extends cOne { 
    public function functionOne(){
       echo "something from child two";
    }
}

我将如何创建一个新对象以及何时创建一个新对象,以便我能够以类似于$newObject->Children->function(); 的方式访问子类和父类的函数我正在认真考虑我的选项今天我完全失去了我的大脑,无法思考。

我显然做错了,因为:$newObject = new cOne; 创建了对象,但是来自子类之一的代码无法访问不直接在核心类中或本身中的任何内容。

谢谢

【问题讨论】:

  • hmmm... 目前我更感兴趣的是问题 - 我应该帮助你,也许它会增强你的信心,或者只是让你脸朝下腐烂在你自己的低水坑里自尊?...(我不知道 php,如果我知道,事实是,我会尽力帮助 :)
  • hahahaha 显然我把整件事过度戏剧化了,这不像我要跳出窗外 ;) 感谢您的“本来会”有帮助的回答 gillyb
  • 您需要以这种方式执行此操作的事实似乎正在从面向对象的方法转向线性、杂乱的方法。
  • 我不需要以任何特定的方式去做,丹,我只是.. 试图理解它
  • 坏消息是您对核心 OOP 概念有一些误解;好消息是 OOP 比您想象的要容易。我的建议是在尝试将 OOP 应用到 php 中之前,先阅读有关 OOP 的一般知识(或者甚至使用具有更好 OOP 文献的不同语言)。

标签: php inheritance class extends


【解决方案1】:

您可以使用parent::functionOne(); 从子类调用父类的函数。 不能从父类调用子类的函数。

【讨论】:

  • 我正在尝试调用兄弟函数,不是来自父函数,而是来自子函数
【解决方案2】:

父类 cOne 不知道在 php 中扩展它的类,因此虽然您可以使用 parent::someFunction() 从子类调用父类,但不能从父类调用子类。您也不能从扩展 cOne 的类调用其他扩展 cOne 的类的函数,这也是因为 cOne 不知道扩展它的类。

【讨论】:

    【解决方案3】:

    帮我还是射我!!

    砰!!! =o)=o)=o)

    当你创建类的实例时,它只从它的父母那里知道它s methods and methods。 您无法判断还有其他类在扩展同一个父级。

    【讨论】:

      【解决方案4】:

      正如 kgb 所说,您不能创建 one 对象,该对象将使您“访问”两个兄弟类的行为。如果你实例化一个 cOneChildOne,你会得到一些输出“来自孩子的东西”(*)的东西。如果您使用parent::functionOne(),您可以复制 cOne 的行为,可能会返回“来自孩子的某事\n某事”或其他任何内容。

      (*) 不要这样做。而是返回一个字符串:

      public function functionOne(){
         return "something from child one";
      }
      

      这使您可以组合函数,将它们输出到文件等。

      【讨论】:

      • 因此,我可以创建一个包含先前创建的其他对象的对象,并使用该对象而不是其他对象。这些扩展了一个我不使用的核心对象,并且可以从它们的父级访问该函数,但是使用这个对象容器,我可以将它们全部调用。矫枉过正?方法?
      【解决方案5】:

      如果满足您的要求,您总是可以从 cOneChildOne 内部静态调用 cOneChildTwo。方法中的$this 始终指向被调用者对象(这就是 parent::__construct() 的工作方式),因此您可以在 cOneChildTwo 中使用被调用者的状态来扩展行为。

      但是,这可能意味着您需要为每个兄弟的方法使用包装方法。这不是反射无法解决的问题。

      【讨论】:

        【解决方案6】:

        你确实有一个根本性的误解。

        您的两个子类是具有共同祖先的不同类。每个孩子本质上都有父母的知识,但父母不了解孩子,孩子之间也不了解对方。

        如果您希望 child1 能够调用 child2 的方法,那么您的设计有问题。一种解决方案是将方法从 child2 移动到父类,以便 child1 也继承该方法。

        【讨论】:

        • 另一种方法是将第二个孩子的实例传递给第一个孩子的构造函数,但正如前面所说,这样做没有意义。
        • 对,如果child1和child2都需要调用methodA,那么methodA属于父类。
        【解决方案7】:

        我认为您以错误的方式看待对象继承、类及其关系。您所说的并不是面向对象编程中的继承如何工作。当您想调用某个其他对象的方法/函数时,无论它是否是同一类的实例,您需要的是对要调用的该对象的引用。这里的关键字是传递参考。想要调用的对象必须引用它想要与之通信的对象。

         child1.communicateWithAnotherChild(someOtherChild)
        

        【讨论】:

          【解决方案8】:

          您可以在master类静态数组中收集子实例

          class C1{  
            static public $childs=array();
            function __construct(){
              self::$childs[]=$this;    
            }
          }
          class C1C1 extends C1{
            function hi(){
              echo 'hi from C1C1 <br />';
            }  
          }
          class C1C2 extends C1{
            function hi(){
              echo 'hi from C1C2 <br />';
            }    
          }
          
          $c1 = new C1C2();
          $c2 = new C1C2();
          $c3 = new C1C1();
          $c4 = new C1C1();
          $c5 = new C1C1();
          $c6 = new C1C1();
          foreach(C1::$childs as $c){
            $c->hi();
          }
          

          【讨论】:

            【解决方案9】:

            为什么你不能在cOne 类中有一个static Array $children,而扩展它的类的__construct() 方法只调用cOne::addChild($this)?他们每个人都可以实现一个getChildren 函数,该函数将请求发送到超类——这不应该吗?

            【讨论】:

              猜你喜欢
              • 2014-12-31
              • 1970-01-01
              • 2011-04-16
              • 2021-09-14
              • 1970-01-01
              • 2012-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多