「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で質問しましょう!
似たような質問が見つかりました
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
PHP4、PHP5 1ファイル複数クラ...
-
phpのクラスメソッドの定義が長...
-
クラス設計の良い参考書を教え...
-
PHPのWARNINGをcatchするには
-
フォントの色を変えるには?
-
phpでPEAR::DBを使っているので...
-
別ファイルの変数を呼び出した...
-
onedrive にexcelファイルをア...
-
PHPのif文でその処理を途中で抜...
-
バッチを用いたフォルダの自動移動
-
現在位置より2つ上のディレク...
-
CSV出力にHTMLが入ってしまう
-
phpでメール送信できません 原...
-
one drive のアップロード失敗...
-
さくらサーバーにて、phpからメ...
-
index.phpに入るには、どうすれ...
-
php.ini を設定を変更すると再...
-
index.phpって何ですか? 具体...
-
query、prepare、executeの違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
phpのクラスメソッドの定義が長...
-
class定義のphpをファイル分割...
-
PHP4、PHP5 1ファイル複数クラ...
-
phpのクラスにて別ファイルの変...
-
'_'(アンダースコア)の使い方...
-
コンストラクタで参照渡しをす...
-
データベースで値をインクリメ...
-
クラス
-
【PHP】クラス と 関数 の違い
-
ユーザ定義関数にデフォルト引...
-
PHPのフレームワークの中でSmar...
-
phpのオブジェクトの使用方法に...
-
phpでクライアントのブラウザの...
-
配列とオブジェクトの違い
-
POSTとGET
-
Codeigniter コアクラスの継承
-
外部ファイルのクラスのインス...
-
class.upload.phpの戻り値(返...
おすすめ情報