親クラスのコンストラクタは自動実行されないから、明示的に呼び出す必要がある

PHP用語集

カテゴリー: クラスとオブジェクト  閲覧数:1027 配信日:2013-10-06 00:00


PHP仕様


・子クラスオブジェクト生成時に自動実行されるコンストラクタは、子クラスのものだけ
・これは、親クラスのコンストラクタが子クラスにとっては単なるメンバ関数に過ぎないため
・親クラスのコンストラクタを実行させたい場合は、子クラスのコンストラクタ内で実行させることが必要
・つまり、(子クラスコンストラクタ内で)明示的に呼び出さない限り、親クラスコンストラクタに記述された内容は、全無視される、ということ!


PHP4


「CHARACTER」クラスを「継承」した「派生クラス」「BOXER」クラスを定義

/*
「CHARACTER」クラス
「メンバ変数$punch」、「メンバ変数$kick」はそれぞれ、「パンチ数」、「キック数」の意。キャラクターのヒット(被ヒット)数を表す。ファイト(メンバ関数の「fight()」を実行する)たびに更新され、またスタミナ(「メンバ変数$stamina」)が減っていき、元のスタミナの6割を切ったら、そこで試合終了(メンバ関数の「gameover()」を実行する)。
*/
   class CHARACTER{
       var $first_stamina;//メンバ変数$first_stamina
       var $stamina;//メンバ変数$stamina
       var $judge = true;
       var $punch = 0;
       var $kick = 0;
       function CHARACTER($paramstamina){//④基底クラスコンストラクタ。引数$paramstamina(=60)を受け取る
           $this->first_stamina = $this->stamina = $paramstamina;//⑤$paramstamina(=60)をメンバ変数$staminaへ格納。メンバ変数$stamina(=60)をメンバ変数$first_staminaへ格納
           $this->old = $old;//利用していない
       }
       function fight($punch, $kick){//メンバ関数fightが呼び出される
           if(!$this->judge){//メンバ変数$judgeが真ではなければ
               return;//処理から抜ける
           }
           if($this->stamina < $this->first_stamina * 0.6){//メンバ変数$staminaが、「メンバ変数first_stamina * 0.6」より小さければ、
               $this->gameover();//メンバ関数gameover実行
               return;//処理終了
           }
           $this->punch += $punch;
           $this->kick += $kick;
           echo "攻撃... ヒットパンチ数 : [{$punch}], ヒットキック数 : [{$kick}]
";
           $this->stamina -= 20;
       }
       function gameover(){
           $this->judge = false;
           echo "試合終了...
";
       }
       function get_stamina(){//⑦メンバ関数get_stamina実行
           echo "現在のスタミナ... {$this->stamina} パワー
";//⑧メンバ変数staminaを呼び出す
       }
       function get_result(){
           echo "結果...  パンチ : {$this->punch}, キック : {$this->kick}"."
";
       }
   }
 
 class BOXER extends CHARACTER{//基底クラス(派生元クラス)CHARACTERの 派生クラス BOXERを 定義
       var $voice = "オラッ";//メンバ変数
       var $fouls = "elbow";
       var $stamina = 60;
       function BOXER($haseistamina){//②引数1のコンストラクタ。引数$haseistamina(=60)を受け取る
           $this->CHARACTER($haseistamina);//③派生クラスのコンストラクタ内で、基底クラスのコンストラクタを実行
       }
       function soundeffect(){//⑩メンバ関数soundeffectが呼び出される
           if(!$this->judge){//⑪メンバ変数judgeが真ではなければ、
               return;//処理を抜ける
           }
           echo $this->voice."
";//⑫メンバ変数voiceを呼び出す
       }
       function broadcasting($skill = ""){//⑭メンバ関数broadcastingが呼び出され、引数$skill(=elbow)を受け取る。$skill = ""の意味は、デフォルト引数は""の意
           if(!$this->judge){//⑮メンバ変数judgeが真ではないなら、
               return;//処理から抜ける
           }
           if($skill == $this->fouls){//⑯メンバ変数fouls変数が真なら
               $this->stamina += 2;//⑰メンバ変数staminaへ2追加
               $this->reaction(1);//⑱メンバ関数reaction(1)実行
           }else if($skill){//引数$skillが真であるなら、
               $this->reaction(2);//メンバ関数reaction(2)実行
           }else{
               $this->stamina -= 5;
               $this->reaction(3);
           }
           if($this->stamina > $this->first_stamina * 1.6){
               $this->gameover();
           }
       }
       function reaction($feel){//⑲メンバ関数reaction呼び出される。以下、略。
           $voice = "";
           switch($feel){
               case 1://⑳実行。以下、略。
                   $voice = "ウオッ!...
";
                   break;
               case 2:
                   $voice = "マジかよッ!...
";
                   break;
               case 3:
                   $voice = "...
";
                   break;
           }
           echo $voice;
       }
   }
   
$boxer = new BOXER(60);//①インスタンス作成。コンストラクタ実行。コンストラクタへ引数60を渡す
$boxer->get_stamina();//⑥メンバ関数get_stamina実行

   $boxer->soundeffect();//⑨メンバ関数soundeffect実行
   $boxer->broadcasting("elbow");//⑬引数1つ渡して、メンバ関数broadcasting実行
   $boxer->broadcasting("head");
   //$boxer->broadcasting("xxx","yyy");//引数2つ渡して、エラーとなるか検証
   $boxer->broadcasting();
   $boxer->soundeffect();
   
   $boxer->fight(5, 2);//メンバ関数fight実行。引数2渡す
   $boxer->fight(-10, 20);
   $boxer->fight(2, 0);
   $boxer->fight(-50, 21);
   $boxer->fight(-11, -20);
   $boxer->fight(2, 0);
   $boxer->fight(20, 30);
   
   $boxer->broadcasting("elbow");
   $boxer->soundeffect();
   
   $boxer->get_stamina();//メンバ関数get_stamina実行
   $boxer->get_result();

// 処理結果 
// 現在のスタミナ... 60 パワー
// オラッ
// ウオッ!...
// マジかよッ!...
// ...
// オラッ
// 攻撃... ヒットパンチ数 : [5], ヒットキック数 : [2]
// 攻撃... ヒットパンチ数 : [-10], ヒットキック数 : [20]
// 試合終了...
// 現在のスタミナ... 17 パワー
// 結果...  パンチ : -5, キック : 22


週間人気ページランキング / 6-25 → 7-1
順位 ページタイトル抜粋 アクセス数
1 PHPで定数を定義する方法は2種類ある / 配列定数の定義 7
2 エラー | エラーメッセージ 5
3 ブラウザを閉じたらセッションデータはどうなるの? | セッション 4
3 PHPにおけるメソッドのオーバーライドについて /「引数の数や型は、親クラスのメソッドと完全に一致していなければなりません。」とは具体的にどういう意味ですか? 4
3 オブジェクト関係マッピング | データベース関連 4
4 「POSIX正規表現」と「PCRE正規表現」の違い 3
4 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 3
4 register_shutdown_function | 関数処理 関数 3
4 Notice(エラーメッセージ) カテゴリー 3
4 _FILE__ | 定数 3
4 PHP用語 3
5 Fatal error(エラーメッセージ) カテゴリー 2
5 session_start() | セッション 2
5 You currently have Essential access which includes access to Twitter API v2 endpoints only. If you need access to this endpoint, you’ll need to apply for Elevated access via the Developer Portal. | Twitter API(エラーメッセージ) 2
5 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 2
5 Warning: PDO::query(): LOAD DATA LOCAL INFILE forbidden | Warning(エラーメッセージ) 2
5 Mailer Error: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting | エラーメッセージ 2
5 Propel | データベース関連 2
5 syntax error | エラーメッセージ 2
5 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2
2025/7/2 1:01 更新
指定期間人気ページランキング / 2020-5-28 → 2025-7-1
順位 ページタイトル抜粋 アクセス数
1 PHP用語 6690
2 ブラウザを閉じたらセッションデータはどうなるの? | セッション 2489
3 Parse error: syntax error, unexpected 'public' (T_PUBLIC) | Parse error(エラーメッセージ) 2430
4 ブラウザを閉じたらセッションデータはどうなるの? | セッション 1655
5 【テスト投稿】テスト | 1133
6 セッション管理が必要な理由は、HTTPプロトコルには状態を保持する機能がないため | セッション 1053
7 PHPで定数を定義する方法は2種類ある / 配列定数の定義 964
8 Fatal error: Access level to ▲::$△ must be protected (as in class ●) or weaker | Fatal error(エラーメッセージ) 874
9 Fatal error: Uncaught Error: Call to a member function modify() on string | Fatal error(エラーメッセージ) 833
10 コード例 … 「例外処理」はネストすることができる 829
11 curl で Cookie を使用する 826
12 Fatal error: require_once(): Failed opening required 'PEAR.php' | Fatal error(エラーメッセージ) 818
13 Fatal error: Uncaught RuntimeException: SplFileObject::__construct(): failed to open stream: Permission denied in | Fatal error(エラーメッセージ) 722
14 定数 718
15 インターフェイス | クラスとオブジェクト 694
16 Fatal error: Uncaught HeadlessChromium\Exception\OperationTimedOut: Operation timed out (3sec) in | Fatal error(エラーメッセージ) 680
17 メンバー | クラスとオブジェクト 645
18 Warning: include() [function.include]: Failed opening '**.php' for inclusion (in | Warning(エラーメッセージ) 627
19 ( ! ) Fatal error: Uncaught PDOException: SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column | Fatal error(エラーメッセージ) 599
20 Warning: strlen() expects parameter 1 to be string, array given in ○○.php on line △△ | Warning(エラーメッセージ) 570
2025/7/2 1:01 更新