php对象孩子使用其他孩子的功能

时间:2012-09-04 13:52:50

标签: php oop class

是否可以

扩展类的扩展名,例如:

class a {
}
class b extends a {
}
class c extends b {
}

编辑:

[或者c类可以使用仅在b中定义但不在a。中定义的函数的其他方式。]

嗯,我只是注意到我的问题有点搞砸了。 c应该能够使用所有功能,当然还有那些功能。

我会接受解决我不存在问题的答案,以防有人搜索。

3 个答案:

答案 0 :(得分:4)

从PHP 5.4开始,您可以使用可能对您有所帮助的特征。您可以定义两个特征,一个具有类a具有的函数,另一个包含类b具有的函数,但不包含类a

所以:

trait TraitA {
    function a1() { }
    function a2() { }
}

trait TraitB {
    function b1() { }
    function b2() { }
}

然后,您可以定义仅使用a的班级TraitA,使用这两个特征的班级b以及仅使用{{1}的班级c }:

TraitB

有关特征的更多信息:http://php.net/manual/en/language.oop5.traits.php 请记住,您必须注意不同特征之间的函数名称。您不能在两个特征中使用相同的功能名称,否则会发生冲突。

答案 1 :(得分:3)

这是不可能的。根据定义,类B是类A的“扩展”。这意味着类如果类a具有方法method_in_class_a(),那么类B将在您配置类之前将method_in_class_a()作为BASE。

你需要做的就是反过来做这件事:

class b { ... }

class a extends b { /* has methods from b and a */ }

class c extends b { /* can only use methods from b */ }

答案 2 :(得分:1)

我不确定你为什么要这样做但是......

除非将方法和属性定义为private方法,否则所有扩展类都可以访问它们并可以扩展,除非父方法声明为final

但是,自PHP5.4起,您可以使用Traits

<?php

trait BOnly 
{
    function getReturnType() { /* 1 */ }
    function getReturnDescription() { /* 2 */ }
}

class A 
{

}

class B extends A
{
    use BOnly;  
}

class C extends B
{

}
相关问题