![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
「static宣言されているメンバ関数」は、「インスタンスメソッド」なのでしょうか? それとも、「クラスメソッド」なのでしょうか?
先日、下記内容で質問して、その時は分かったつもりだったのですが、
やっぱり分かってなかったようなので、教えてください。
▽「クラス関数」「メンバ関数」「メソッド」の違いを教えてください。
http://oshiete.goo.ne.jp/qa/5858806.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()」の違い
No.1ベストアンサー
- 回答日時:
> ・「static宣言したメンバ関数」は、「インスタンスメソッド」?「クラスメソッド」?
「クラスメソッド」になります。
「$a->static_public_method()」は、オブジェクト経由でクラスメソッドにアクセスしたことになります。
> ・「スタティック」宣言してるのに、メンバ関数へ、「->(アロー演算子)」(オブジェクト経由)でアクセスできる理由
オブジェクトはどれか一つのクラスのインスタンスですので、インスタンスを通してもどのクラスの関数が呼出されるのかは明確です。
ですので、そのような言語仕様になっているだと思われます。
下記のページの最初に、インスタンスから static なメソッドにはアクセスできるとの記述が有ります。(static なプロパティへはNG)
http://www.php.net/manual/ja/language.oop5.stati …
ただし、原則的に、クラス関数へはアロー演算子でアクセスしない方が良いと思います。(可読性の点などで)
ちなみに 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の仕様なのだと理解しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
外部ファイルのクラスのインス...
-
phpのクラスにて別ファイルの変...
-
'_'(アンダースコア)の使い方...
-
違法アップロードについて
-
onedrive にexcelファイルをア...
-
MySQLのベースに書かれたプログ...
-
トランザクションが原因?DBに...
-
バッチを用いたフォルダの自動移動
-
データベースにアクセスして結...
-
VBSの「MsgBox」について
-
ダウンロードファイル名の文字...
-
動画共有サイトの作り方
-
拡張子php画像をjpg画像等に変...
-
PHPでファイルをダウンロードさ...
-
php.ini を設定を変更すると再...
-
ヒアドキュメントの中で演算子...
-
PHPで、エラーがない場合のみ画...
-
jpgraphで表示されない
-
.phpファイルが、表示されない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
・オブジェクト指向のメリット...
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
phpのクラスにて別ファイルの変...
-
配列とオブジェクトの違い
-
class定義のphpをファイル分割...
-
phpのクラスメソッドの定義が長...
-
POSTとGET
-
【PHP】クラス と 関数 の違い
-
require_onceについて
-
'_'(アンダースコア)の使い方...
-
EC-CUBEの管理画面内に円グラフ...
-
クラス設計の良い参考書を教え...
-
フォルダ関連のライブラリにつ...
-
クラス内でメソッド呼ぶ際、thi...
-
PHP4、PHP5 1ファイル複数クラ...
-
WEBシステム作成でのオブジェク...
-
php インスタンスとオブジェク...
-
正規表現について
-
PHP5 コンストラクタや初期化の...
おすすめ情報