繊細さ(奇妙な?)

interface%username%が何であるか知っていますか?

もしそうなら、このコードはあなたに質問を引き起こさないと思います。 PHPの微妙さ(奇異?)

interface someInterface{ public function someMethod(); } interface anotherInterface{ public function someMethod(); } class Foo implements someInterface,anotherInterface { public function someMethod(){ echo 'someMethod() was called'.PHP_EOL; } } $foo = new Foo(); $foo->someMethod();
      
      





そのため、スクリプトはその作業の結果として何を表示しますか。

答えは猫の下にあります。

トロルフェイス 正解は「致命的なエラー:抽象関数を継承できません...」ですが、なぜですか? -あなたは正しく尋ねます。 私が最初にこれに遭遇したとき、私は同じ質問をしました。 検索結果が示すように、これはPHPの癖、尊厳、不利、愚かさ、利点(下線)です。 このような恐ろしいことを書いているphp.net/manual/en/language.oop5.interfaces.phpチュートリアルを見ると、「注:クラスは関数名を共有する2つのインターフェイスを実装できません。曖昧さが生じるためです。」つまり、 PHPクラスは、同じメソッドを含む複数のインターフェイスを実装できません。これによりあいまいさが生じるためです。 停止、停止、停止...それを把握しましょう。 C ++での多重継承を思い出しましょう。

 class someClass { public: void someMethod(){ }; } class anotherClass { public: void someMethod(){ }; } class fooClass: someClass,anotherClass{ } int main () { fooClass foo; foo.someMethod(); return 0; }
      
      





C ++ どのメソッドが継承されるかは明確ではないので、これが不確実性が存在する場所です(まあ、ほとんど)。 インターフェイスは、複数のクラスの継承から生じる衝突を解決するためだけに考案されました。 結局のところ、大まかに言って、インターフェイスは、それを実装するクラスがそのようなメソッドを実装する必要があることを示す単なる「命令のセット」です。 インターフェイスにはメソッドの実装が含まれていないため、クラスは同じメソッドで多くのインターフェイスを実装する必要があるかどうかを気にしません。 繰り返しますが、これはこのメソッドを実装する必要があることをクラスに伝える単なる「命令」であり、これらの命令のほんの一部があります。 PHP開発者のロジックは完全に明確ではありませんが、なぜ他のどこでも動作しないものを手に入れたのはなぜですか? クラスが同じメソッドでインターフェースを実装できないのはなぜですか? なぜこれがあいまいさにつながるのですか?



UPD1:なんらかの理由で、コメントの2番目の人はen.wikipedia.org/wiki/Method_overloadingのメソッドのオーバーロードについて話している(メソッド名は同じであるが、呼び出しシグネチャが異なる:メソッドに渡されるパラメーターの種類、番号など)。 おそらく私は何かを正しく説明しなかったかもしれませんが、記事ではオーバーロードについては説明していません。 実際、PHPはこのメカニズムをサポートしていません。 ただし、この場合、インターフェイスの複数の実装に対して、このメカニズムには関係がありません。

繰り返しになりますが、PHPでは、クラスは同じメソッドを含む複数のインターフェイスを実装できません。Java/ C#/などでは可能です。

 public interface someInterface { public void someMethod(); } public interface anotherInterface { public void someMethod(); } public class fooClass implements anotherInterface,someInterface { /** * @param args */ public static void main(String[] args) { fooClass fooClass = new fooClass(); fooClass.someMethod(); } @Override public void someMethod() { System.out.println("someMethod() was called"); } }
      
      







UPD: C# habrahabr.ru/blogs/php/116916/ # comment_3808966の同じ問題の2つのソリューション

UPD:3はD en.wikipedia.org/wiki/D_%28programming_language%29で同じコードをチェックしました。まったく新しいOOP言語のようで、edファイルは正しく動作します:

 import std.stdio; import std.stream; interface D{ void foo(); } interface A{ void foo(); } class E : D, A{ void foo(){ writefln("foo() was called"); } } void main (string[] args){ E e = new E(); e.foo(); } alagar@home:~/d$ dmd -run ed foo() was called
      
      






All Articles