私はパーティーに遅れていますが、答えは実際に実際の問題を綴るません知っています。
問題は、PHPは関数/メソッドのオーバーロードをサポートしていないです。型指定されていない言語で関数のオーバーロードをサポートすることは困難です。
ヒントが役立ちます。 PHPでは非常に限られています。理由は分かりません。たとえば、変数がintまたはBooleanであるというヒントはできませんが、配列は問題ありません。 Go figure!
他のオブジェクト指向言語では、関数のオーバーロードを使用してこれを実装しています。つまり、関数のシグネチャは明らかに異なります。
は、次のことが可能であったならば、我々は問題
もちろん
class Foo
{
public function bar(Array $bar){
echo "Foo::bar";
}
}
class Baz extends Foo
{
public function bar(int $bar) {
echo "Baz::bar";
}
}
$foo = new Baz();
$bar = new Baz();
$ar = array();
$i = 100;
$foo->bar($ar);
$bar->bar((int)$i);
would output
Foo::bar
Baz::bar
それはコンストラクタに来ていないように、例えばPHP開発者は、彼らが好むと好まざるとにかかわらず、それを実装する必要が実現しました!したがって、彼らは単純にエラーを抑制するか、最初のケースでエラーを発生させません。
どちらが愚かですか。
知り合いはかつて、PHPが名前空間を実装する方法としてのみオブジェクトを実装していると言っていました。今私はそれほど重大ではないが、取られた決定のいくつかはその理論を支持する傾向がある。
コードを開発する際に常に最大限の警告がオンになっていますが、何を意味するのか、その意味が理解されていない限り、警告は出ません。個人的に私はこの警告を気にしません。私は何をしたいのか分かり、PHPはそれを正しく行えません。私はここでそれを選択的に抑制する方法を探しに来ました。私はまだ方法を見つけていない。
だから私はこの警告をトラップし、自分でそれを抑制する。恥を私はこれを行う必要があります。 STRICTについては厳格です。
私はここで2つのことに同意しなければなりません: "BarがFooのサブタイプである場合、Foo型のオブジェクトはBar型のオブジェクトに置き換えられます(逆も同様)。逆の部分は成立しません。サブクラスが使用されている場所でスーパークラスを使用することは期待していません。もう一つはLSPに関するものです:もしパラメータが反動的であれば、型は尊重されます。 PHPが純粋なオブジェクト指向であれば、ArrayはObjectよりも狭いので(宣言の型がオブジェクトを意味しないと仮定して)、問題はありません。したがって、bar()の実装はBazでより一般的になり、LSPに合うようになります。 –
@AndrésFortier私はFoo、Foo、Barの範囲で互換性があるべきであることを意味しました。しかし、第二の話題については、私はあなたに同意します。 Kaaseが与えた例は、Baz :: bar()が安全にFoo :: bar()を置き換えることができるため、LSPに違反しません。 – Tivie
非常に良い説明、ありがとう。それでは、なぜコンストラクタでLiskovの原理を破ることができますか? –