以前staticメソッドを定義したときに、記法がインスタンスメソッドの呼び方でも呼べてしまうことがあったので、これを機にインスタンス・クラス×変数・メソッドちょっと調べてみました。
言葉で書くよりコードを見たほうがわかりやすいかも。
ソース
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
<?php $sca = new SampleClass(); $scb = new SampleClass(); $sca->staticMethod1();//1 SampleClass::staticMethod1();//2 $sca::staticMethod1();//3 $sca->instanceMethod1();//4; $scb->instanceMethod1();//5; //クラスからインスタンス変数はよべない エラーになる //$sca::instanceMethod1();//4; $sca->instanceMethod2();//1; $scb->instanceMethod2();//1; $sca->instanceMethod2();//2; $scb->instanceMethod2();//2; class SampleClass { //クラス・インスタンス間で共有される private static $num1 ; //特定インスタンスのみ private $num2; public static function staticMethod1(){ $num = self::$num1; $num++; self::$num1 = $num; echo $num .PHP_EOL; //下記はエラーになる。staticメソッドからインスタンス変数は呼べない(クラスからインスタンスは呼べない) //echo $this->num2; //クラスメソッドからインスタンスメソッドはよべない エラーになる //$this->instanceMethod1(); } public static function staticMethod2(){ echo 'static method2'. PHP_EOL; } public function instanceMethod1(){ //インスタンスメソッドからクラス変数は呼べる $num = self::$num1; $num++; self::$num1 = $num; echo $num .PHP_EOL; //下記の処理はundefinedになる $this->num1 とself::$num1は当然別物! //echo $this->num1 . PHP_EOL; echo $this->num2 . PHP_EOL;//空白 //通常はstaticはこの呼び方 self::staticMethod2(); //この方法でも呼べる $this->staticMethod2(); } public function instanceMethod2(){ //インスタンスメソッドからクラス変数は呼べる(通常の使い方) $num = $this->num2; $num++; $this->num2 = $num; echo $num .PHP_EOL; } } |
メモ
- クラスメソッドとインスタンスメソッドの違いはメモリの確保のされ方
- クラスメソッドは当然インスタンスから独立しているので、どのインスタンスからよんでも同一のデータにアクセスする
- インスタンスはインスタンスごとにメモリ上に置かれるため、クラスメソッド(static)からは基本的にアクセスできない
- インスタンスの中にはクラスメソッドが入っているのでインスタンスからクラスメソッドを呼ぶことは当然できる
- 上記の場合(インスタンスからクラスメソッドを呼ぶ場合)、記法は正確にはインスタンス::クラスメソッドだがインスタンス->クラスメソッドという呼び方でもOK