3

どちらでも可能ですか

クラスの拡張を拡張します。例:

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

編集:

[または、クラス c が b でのみ定義され、a では定義されていない関数を使用できる他の方法。]

さて、私の質問がちょっとめちゃくちゃだったことに気づきました。c はすべての関数を使用できるはずなので、もちろん a の関数も同様です。

誰かがこれを検索した場合に備えて、存在しない問題を解決する答えを受け入れるだけです。

4

3 に答える 3

4

PHP 5.4以降では、役立つ可能性のある特性を使用できます。2つの特性を定義できます。1つはクラスaが持つ関数を含み、もう1つはクラスが持つ関数を含みますが、クラスbは含みません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 に答える