3

是否有可能

扩展类的扩展,例如:

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

编辑:

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

好吧,我只是注意到我的问题有点混乱。c 应该能够使用所有功能,当然还有 a 的功能。

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

4

3 回答 3

4

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

所以:

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

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

然后你可以定义一个a只使用TraitA的类,一个b同时使用这两个特征的类,以及一个c只使用的类TraitB

class a {
    use TraitA
    // contains a1 and a2
}

class b {
    use TraitA, TraitB
    // contains a1, a2, b1 and b2
}

class a {
    use TraitB
    // contains b1 and b2
}

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

于 2012-09-04T14:04:11.847 回答
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 */ }
于 2012-09-04T14:02:32.167 回答
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
{

}
于 2012-09-04T14:04:36.643 回答