理解PHP中的类

时间:2010-06-26 17:30:40

标签: php inheritance class extends

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

直到今天,我从来没有真正给过课程和他们的关系。我试图找出一些看起来非常明显的东西但是因为我很蠢,所以我看不到它。

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

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

这不是最重要的事情或其他什么,但我想理解这一点。 我做了很多阅读,不要误解我的意思,这就是为什么我认为自己迟钝而不仅仅是懒惰。

帮帮我或者开枪!感谢

9 个答案:

答案 0 :(得分:2)

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

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();
}

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

  

帮帮我或开枪!!

邦!!! = 0)= 0)= O)

当你创建类的实例时,它只知道它的父节点s methods and method。 你无法判断是否还有其他类正在扩展同一个父类。

答案 4 :(得分:0)

正如kgb所说,你不能创建一个对象,它将让你“访问”兄弟类的行为。如果你实例化一个cOneChildOne,你会得到一些输出“来自一个孩子的东西”(*)的东西。你可以,如果你使用parent::functionOne(),复制cOne的行为,也许可以返回“来自孩子的东西\ nsomething”等等。

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

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

这使您可以编写功能,将它们输出到文件等。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

 child1.communicateWithAnotherChild(someOtherChild)

答案 8 :(得分:0)

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