- ベストアンサー
「static宣言されているメンバ関数」は、「インスタンスメソッド」なのか?「クラスメソッド」なのか?
- 「static宣言されているメンバ関数」は、「インスタンスメソッド」なのか?それとも、「クラスメソッド」なのかについて説明します。
- 「static宣言されているメンバ関数」は、「インスタンスメソッド」として呼び出すこともできますし、「クラスメソッド」として呼び出すこともできます。
- 「static宣言されているメンバ関数」は、クラスのインスタンスを作成する必要なく呼び出すことができるため、「クラスメソッド」として扱われることが一般的です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
> ・「static宣言したメンバ関数」は、「インスタンスメソッド」?「クラスメソッド」? 「クラスメソッド」になります。 「$a->static_public_method()」は、オブジェクト経由でクラスメソッドにアクセスしたことになります。 > ・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由 オブジェクトはどれか一つのクラスのインスタンスですので、インスタンスを通してもどのクラスの関数が呼出されるのかは明確です。 ですので、そのような言語仕様になっているだと思われます。 下記のページの最初に、インスタンスから static なメソッドにはアクセスできるとの記述が有ります。(static なプロパティへはNG) http://www.php.net/manual/ja/language.oop5.static.php ただし、原則的に、クラス関数へはアロー演算子でアクセスしない方が良いと思います。(可読性の点などで) ちなみに Java でもスタティックメソッドにオブジェクト経由でアクセスした場合はエラーになりませんが、警告が出ます。 > ・「A::static_public_method()」と「A::public_method()」の違い 両者ともメソッドの静的な呼出しをしている点で、違いは有りません。 が、「A::public_method()」は static でないメソッドを静的呼出ししているので、限りなくまちがいに近いと思います。(PHPでは static でないメソッドを静的呼出しすると警告が出るだけの様ですが) ちなみに Java ではインスタンスメソッドに静的にアクセスした場合はコンパイルエラーになります。 下記の様に public_method() 内で(staticでない)プロパティを参照していた場合は Fatalエラーになります。 --------------------------------------------------- class A { private $name; function __construct($arg_name) { $this->name = $arg_name; } public static function static_public_method() { print "static_public_method\n"; } function public_method() { print "public_method : " . $this->name . "\n"; } } $a = new A('aaa'); $a->static_public_method(); A::static_public_method(); $a->public_method(); A::public_method(); // public_method() 内で Fatal error になる ---------------------------------------------------
お礼
回答ありがとうございました。大変、勉強になりました。 >原則的に、クラス関数へはアロー演算子でアクセスしない方が良いと思います。(可読性の点などで) 言われてみれば、確かにそうですね。「できる」ということと、「そうした方がいい」というのは、別であることに気が付きました。 >「A::public_method()」は static でないメソッドを静的呼出ししているので、限りなくまちがいに近いと思います。(PHPでは static でないメソッドを静的呼出しすると警告が出るだけの様ですが) 意味合い的に整合性がとれないと思っていたのですが、はっきりそう言っていただけると、自分の認識で間違いなかったことが確認できたので、助かりました。 >ちなみに Java ではインスタンスメソッドに静的にアクセスした場合はコンパイルエラーになります。 他の言語 の例を出していただいたので、大変分かりやすかったです。要は、PHPの仕様なのだと理解しました。