【问题标题】:php object child using other child's functionphp对象子使用其他子函数
【发布时间】:2012-09-04 13:52:49
【问题描述】:

有没有可能

扩展类的扩展,例如:

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

编辑:

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

我只是注意到我的问题有点混乱。 c 应该可以使用所有功能,当然 a 也可以。

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

【问题讨论】:

  • 那么您的实际问题是什么?
  • 是否可以扩展"extends"
  • 啊,好吧。是的,它是:)

标签: php oop class


【解决方案1】:

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

所以:

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

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

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

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 请记住,您必须注意不同特征之间的函数名称。两个特征中不能有相同的函数名,否则会发生冲突。

【讨论】:

  • 该死的你比我先到!
  • 遗憾的是我的主机没有 php 5.4
  • 特征看起来很可怕。适当的班级组织没有错。看起来像拙劣的多重继承。会创建一些令人困惑的代码。
  • 我自己不确定是否会使用它。我已经习惯了它们的外观,但我也花了很长时间......到目前为止,我还没有遇到过它们有用的情况。
【解决方案2】:

这是不可能的。根据定义,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 */ }

【讨论】:

    【解决方案3】:

    我不确定您为什么需要这样做,但是...

    除非方法和属性定义为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
    {
    
    }
    

    【讨论】:

    • 按照你的做法,C 类仍然包含 A 类的东西。
    • 是的,我只是快速将一个示例放在一起。我自己从未使用过它们,而且可能不会,至少暂时不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 2017-11-30
    • 1970-01-01
    相关资源
    最近更新 更多