2010-06-26 67 views
3

我正式智障。 [让我解释]了解PHP中的课程

我从来没有真正给过类和他们的关系任何想法直到今天。我试图找出一些似乎很明显的事情,但因为我很愚蠢,所以我看不到它。

比方说,我有一个核心类,将从不同的文件扩展。儿童课堂如何从其他兄弟姐妹调用功能(也就是说,如果这些被视为孩子)。 示例代码:(不杀我)

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

这不像它是非常重要的,但我想了解这一点。 我做了大量的阅读,不要误会我的意思,这就是为什么我认为自己被推迟了,而不是懒惰。

帮我或拍我!谢谢

+0

嗯......此刻我更感兴趣的是这个问题 - 我应该帮助你,也许它会增强你的信心,或者让你在自己的低自尊水坑中腐烂? 。(我不知道PHP,如果我这样做,事实是,我会尝试帮助:) – gillyb 2010-06-26 17:35:42

+0

haha​​haha我显然过度戏剧化整个事情,这不像我要跳出窗口;)谢谢对于你的“会一直”有帮助的答案gillyb – johnnyArt 2010-06-26 17:38:15

+0

你需要这样做的事实似乎正在从面向对象的方法转向更多的线性,混乱的方法。 – 2010-06-26 17:41:43

回答

0

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

+0

我试图调用兄弟功能,而不是从父母,但从孩子 – johnnyArt 2010-06-26 17:35:51

1

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

0

帮我或拍我!

Bang! = o)= o)= o)

当您创建类的实例时,它仅从它的父母知道它s methods and method。 您无法判断是否有其他班级正在扩展相同的家长。

0

正如kgb所说,你不能创建一个对象,它可以让你“接入”两个兄弟类的行为。如果你实例化一个cOneChildOne,你会得到一些输出“从孩子的东西”(*)的东西。如果您使用parent::functionOne(),则可以复制cOne的行为,也许可以返回“something \ nsomething from child one”或其他任何内容。

(*)不要这样做。相反,返回一个字符串:

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

这可让您构图功能,并将其输出到文件等

+0

因此,我可以创建一个对象,其中包含以前创建的其他对象,并使用该对象而不是其他的对象。这些扩展了一个我不使用的核心对象,并且可以从父级访问该函数,但是使用这个对象容器我可以将它们全部调用。矫枉过正?途径? – johnnyArt 2010-06-26 17:45:39

0

你总是可以只调用cOneChildTwo从内cOneChildOne静态如果这足够您的要求。一个方法中的$this总是指向被调用对象(这就是parent :: __ construct()的工作方式),所以你可以在cOneChildTwo中使用被调用者的状态来扩展行为。

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

0

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

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

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

+0

另一种方法是将第二个孩子的实例传递给第一个孩子的构造器,但正如前面所说,这里没有任何意义。 – Eugene 2010-06-26 17:57:35

+0

对,如果child1和child2都需要调用methodA,则methodA属于父级。 – timdev 2010-06-26 18:18:52

0

我认为你正在寻找对象继承,类和他们的关系错误的方式..你所说的并不是真正的面向对象编程如何继承。当你想调用某个其他对象的方法/函数时,它可能是同一个类的一个实例,你需要的是你要调用的那个对象的引用。这里的关键字是传递参考。想要调用的人必须具有对要传达的对象的引用。

child1.communicateWithAnotherChild(someOtherChild) 
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(); 
} 
0

为什么不能你在cOnestatic Array $children,并__construct()方法扩展它的类只需要调用cOne::addChild($this) ?他们每个人都可以实现一个将请求发送给超类的getChildren函数 - 不应该这样工作吗?