こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

「static宣言されているメンバ関数」は、「インスタンスメソッド」な

「static宣言されているメンバ関数」は、「インスタンスメソッド」なのでしょうか? それとも、「クラスメソッド」なのでしょうか?

先日、下記内容で質問して、その時は分かったつもりだったのですが、
やっぱり分かってなかったようなので、教えてください。
▽「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。
  http://okwave.jp/qa/q5858806.html

例)
▽前提
・Aクラスのインスタンスa
・static宣言されたpublicメソッド「static_public_method」
・static宣言されていないpublicメソッド「public_method」

▽メンバ関数呼び出し
・$a->static_public_method()
・A::static_public_method()
・A::public_method()

このとき、「$a->static_public_method()」は、インスタンス経由でアクセスすることになるので、
「インスタンスメソッド」になるのでしょうか。それとも、static(静的)宣言しているので、「クラスメソッド」になるのでしょうか? また、「A::static_public_method()」や、「A::public_method()」は、どちらになるのでしょうか?

※現在、頭の中がこんがらがっているのは、下記3点です。どれかひとつでも構わないので、分かりやすい考え方等あれば、ぜひ教えてください。
・「static宣言したメンバ関数」は、「インスタンスメソッド」? 「クラスメソッド」?
・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由
・「A::static_public_method()」と「A::public_method()」の違い

投稿日時 - 2010-05-09 11:28:29

QNo.5882465

暇なときに回答ください

質問者が選んだベストアンサー

> ・「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 になる

---------------------------------------------------

投稿日時 - 2010-05-10 01:00:54

お礼

回答ありがとうございました。大変、勉強になりました。

>原則的に、クラス関数へはアロー演算子でアクセスしない方が良いと思います。(可読性の点などで)
言われてみれば、確かにそうですね。「できる」ということと、「そうした方がいい」というのは、別であることに気が付きました。

>「A::public_method()」は static でないメソッドを静的呼出ししているので、限りなくまちがいに近いと思います。(PHPでは static でないメソッドを静的呼出しすると警告が出るだけの様ですが)
意味合い的に整合性がとれないと思っていたのですが、はっきりそう言っていただけると、自分の認識で間違いなかったことが確認できたので、助かりました。

>ちなみに Java ではインスタンスメソッドに静的にアクセスした場合はコンパイルエラーになります。
他の言語 の例を出していただいたので、大変分かりやすかったです。要は、PHPの仕様なのだと理解しました。

投稿日時 - 2010-05-10 05:50:58

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問