3

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

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

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

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;创建了对象,但是来自子类之一的代码无法访问不直接在核心类中或本身中的任何内容。

谢谢

4

9 回答 9

2

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

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();
}
于 2010-06-26T17:54:32.740 回答
1

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

于 2010-06-26T17:37:10.597 回答
0

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

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

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

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

于 2010-06-26T17:38:14.103 回答
0

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

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

于 2010-06-26T17:40:33.320 回答
0

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

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

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

于 2010-06-26T17:48:39.883 回答
0

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

 child1.communicateWithAnotherChild(someOtherChild)
于 2010-06-26T17:49:51.993 回答
0

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

于 2010-06-26T18:04:55.910 回答
0

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

于 2010-06-26T17:34:23.280 回答
0

帮助我或射击我!

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

当您创建类的实例时,它只知道它s methods and method来自其父母。您无法判断是否有其他类正在扩展同一个父级。

于 2010-06-26T17:38:05.557 回答