PHPのクラスに関する質問

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 811
退会済みユーザー

退会済みユーザー

PHPの書籍を見て勉強している初心者です。
クラスのプロパティやメソッドなどに関してご教示ください。

<?php

class Test
{
    // No.1
    public $a = 9;
    
    // No.2
    public static $b = 8;

    // No.3
    public function count()
    {
        // No.4
        static $c = 0;
        echo $c;
        $c++;
    }

    // No.5
    public static function sum($d,$e)
    {
        echo $d + $e;
    }

}

Test::count();
Test::count();
Test::count();

Test::sum(3,3);

// No.6
print Test::$a;

// No.7
print Test::$b;

PHPマニュアルの「static キーワード」のページに下記のような記述があります。

このページでは、static キーワードを使って静的なメソッドやプロパティを定義する方法を・・・

クラスプロパティもしくはメソッドを static として宣言することで、 ・・・

上記の記述から静的プロパティと静的メソッド、クラスプロパティとクラスメソッドの4つがあるという認識でおります。

【質問1】
クラスプロパティとは、No.1のpublic $aのこと、
クラスメソッドとは、No.3のpublic function count()のこと、
静的プロパティとは、No.2のpublic static $bとNo.4のstatic $cのこと、
静的メソッドとは、No.5のpublic static function sum($d,$e)のことを指しているという認識でよろしいでしょうか?

【質問2】
クラスの外からクラスプロパティ($aのこと)、静的プロパティ($bのこと)へアクセスすることは可能でしょうか?
アクセス可能な場合、どのように記述するのでしょうか?
可能なら$a$bにアクセスしたいと考えております。

【質問3】
No.6とNo.7の記述は、私の環境では何も表示されません。
エラーも表示されませんが、実行結果も表示されません。
記述に問題があるのでしょうか?


初歩的な質問で恐縮ですが、ご回答いただけると幸いです。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

【質問1】
PHP上では、4を除いてその認識で問題ありません。ただし、他の言語で「クラスメソッド/プロパティ」と言うと、PHPで言う「静的メソッド/プロパティ」を指すので、他言語の文献を参考にする、あるいはPHPでもその流儀で書かれている可能性もあるので注意が必要です(なお、「インスタンスメソッド/プロパティ」という単語が、PHPでのstaticでないメソッド/プロパティを指します)。

4のstaticは少し意味が違いまして、「静的変数」と呼ばれます(オブジェクトのプロパティではありません)。

【質問2】
Test::$bはTestクラスについて1つの変数となっていますのでそのままアクセス可能ですが、$aはTestクラスのインスタンスごとに値が違いますので、$instance=new Test();とした変数から$instance->aとして参照します。

【質問3】
質問2の時と同様に、Test::count()というのがオブジェクトに基づかずに「クラスメソッド」を呼びだそうとしている結果、コンパイル段階でエラーになってNo.6の行まで実行が進んでいないものと思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/03 17:13

    ご回答ありがとうございます。

    今までstaticについていまいち理解できていなかったのですが、回答いただいて何となくわかった気がします。

    > クラスのインスタンス化の必要なしにアクセスすることができます。

    PHPマニュアルにはstaticはインスタンス化しなくてもアクセスできるという記述があったので、理解力のない私はpublicの意味なのかと勘違いしておりました。

    実際にはstaticを付けることで**クラスに属するプロパティまたはメソッド**になるということなんですね。

    だからstaticがある`$b`は外部からも`Test::$b`でアクセスできるんですね。
    逆にstaticがない`$a`はクラスに属していないのでインスタンス化してからアクセスできるということなんですね。

    お陰様で理解が深まりました。

    もし私のコメントで誤り等あればご指摘いただけると幸いです。
    ありがとうございました。

    キャンセル

  • 2015/03/03 19:33

    追加で質問がござます。
    質問欄に追記しておりますので、お手すきの時にご回答頂けると幸いです。
    よろしくお願いいたします。

    キャンセル

+1

【質問4】に関して
私の解釈であっているか定かではありませんが、調べたら何となくわかりました。
スコープ定義演算子「::」でstaticがないメソッドも呼び出せる仕様(下位互換性のため)になっているが、本来staticキーワードのないメソッドを呼び出すべきではないということなんですね。

http://3v4l.org/2mO3a

上記のPHPのバージョン別の実行結果を見るとわかりますが、PHP5では実行結果も表示されていますがStrict Standards: Non-static method Test::count()が表示されます。
厳密な基準だとstaticのないメソッドは呼び出すべきではないというメッセージですね。
このような記述はよくないということですね。

上記の理由からNo.3のpublic function count()はイレギュラーで表示されているということなんですね。

ちなみに本件とはあまり関係ありませんがfunction count()publicを追加してpublic function count()にするとPHP4では構文エラーになりました。
function count()とするとPHP4で構文エラーにはなりません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる