PHP 5.3のオブジェクトに特定の定数またはプロパティを含めることを要求することは可能ですか?PHPのインターフェースモデルについて少し読んだところ、抽象的なパブリックメソッドでしか機能しないようです。したがって、私が求めているのは、オブジェクトAとオブジェクトBの2つのオブジェクトを作成する方法があるかどうかです。オブジェクトBがオブジェクトAを拡張する場合は、特定の定数または変数が含まれている必要があります。このタイプのアーキテクチャをどのように設計しますか?ありがとう。
4 に答える
http://php.net/manual/en/language.oop5.interfaces.php#language.oop5.interfaces.constants
インターフェイスが定数を持つ可能性があります。インターフェイス定数は、それを継承するクラス/インターフェイスでオーバーライドできないことを除いて、クラス定数とまったく同じように機能します。
クラスを継承してインターフェイス定数をオーバーライドすることはできません。クラス定数はオーバーライドできますが、オーバーライドする必要はありません(抽象クラスで宣言されている場合でも)。抽象クラスは、実装ではなく、インターフェースを強制するように設計されています。定数は実装に該当しますが、メソッドはインターフェイスを定義します。したがって、定数は抽象クラスでデフォルト値を使用して宣言できますが、定数を使用するか再定義するかは子が決定します。
最善の代替策は、「より良い」メソッドを使用することです。例:
abstract class MyAbstract
{
abstract public function getPropertyA();
abstract public function getPropertyB();
}
これで、を使用するすべてのクラスでとextend MyAbstract
を定義する必要があります。これにより、値に常にアクセスできるようになります。getPropertyA()
getPropertyB()
はいといいえ。
いいえ、プロパティは実装の詳細であるためです。これはインターフェースの一部ではありません(メソッドがインターフェースを定義します)。プロパティ(クラス内)と定数(クラスまたはインターフェイス内)を定義できますが、それらを抽象としてマークして、派生クラスによって「実装」する必要はありません。
はい、インターフェースを使用すると、すべての派生クラスが持つ定数を定義できるためです(注意してください。 @ Gordonの質問を参照してください)。これにより、クラスはこれらの定数を持つように「強制」されます。抽象クラスまたは通常の継承を使用して、プロパティが派生クラスに渡されるように「強制」することもできます。
abstract class Foo {
public $foo = 'bar';
protected $bar = 'baz';
}
class Bar extends Foo {
public funciton getBar() {
return $this->bar;
}
}
$bar = new Bar;
echo $bar->foo; // bar
echo $bar->getBar(); // baz
オブジェクトAとオブジェクトBはクラスである必要があり、オブジェクトは拡張できない(クラスの)インスタンスです(私は間違っているかもしれませんが...)。
そのことを念頭に置いて、クラスBがクラスAを拡張するとし、クラスBに特定の定数を定義させたい場合は、クラスAがインターフェイスを実装する必要があります。phpインターフェースについてもっと読む。
うーん、オブジェクトBがオブジェクトAを拡張し、オブジェクトAに定数または変数が含まれている場合、変数がまたはの場合、オブジェクトBにもそれらが含まれprotected
ますpublic
。したがって、オブジェクトAで変数を定義すると、その値がであってもNULL
、オブジェクトBは定義上それも定義します。
オブジェクトAから継承されない定数をオブジェクトBに強制的に実装させることはできません。インターフェースと同じです。Bが定数を含むインターフェースCを実装する場合、それらを継承します。ただし、Bは、その親クラスまたはインターフェイスとは異なる定数値を定義できます。