diff --git a/src/pages/tips/object-oriented.mdx b/src/pages/tips/object-oriented.mdx index 5c78aa9..81b4071 100644 --- a/src/pages/tips/object-oriented.mdx +++ b/src/pages/tips/object-oriented.mdx @@ -394,6 +394,12 @@ 継承をすることにより、もとのクラスの一部分だけを変更したり、もとのクラスの機能を拡張したりすることができます。 +この、継承をするためのクラスを、**派生クラス (derived class)** と呼びます。 +逆に、もとになるクラスを、**基底クラス (base class)** と呼びます。 + +また、基底クラスに存在するメソッドを派生クラスで、同じ名前で再定義することができます。 +これを **オーバーライド (override)** と呼びます。 + ```php name}さん!"; } @@ -444,6 +451,7 @@ echo "おい、{$target->name}!"; } + // 基底クラスにはない、shout() というメソッドを独自に定義した public function shout(User $target) { echo "うるせぇ、{$target->name}!"; } @@ -710,9 +718,100 @@ これで、継承先のクラスからは `name` プロパティにアクセスすることができるようになりました。 `age`も同様に `protected` にしているので、継承先のクラスからはアクセスできますが、関係のない場所からはアクセスできないようになっています。 -### データを共有する (static 1) +### staticな変数 -### データに依存しない処理を定義する (static 2) +クラスは、基本的にはインスタンスごとにデータを持ちます。 +一方で、クラス全体で共有されるデータを定義することもできます。 + +これを **staticな変数** 、日本語では **静的変数** と呼びます。 + +staticな変数は、クラス名を使ってアクセスすることができます。 +またクラス全体で共有しているため、インスタンスを通してアクセスしても同じ値が見えるようになっています。 + +```php + 初期値 (MyClass) +// => 初期値 (instance) + +MyClass::$static_variable = "MyClassから値を変更"; + +echo MyClass::$static_variable . " (MyClass)" . PHP_EOL; +echo $instance::$static_variable . " (instance)" . PHP_EOL; +// => MyClassから値を変更 (MyClass) +// => MyClassから値を変更 (instance) + +$instance::$static_variable = "instanceから値を変更"; + +echo MyClass::$static_variable . " (MyClass)" . PHP_EOL; +echo $instance::$static_variable . " (instance)" . PHP_EOL; +// => instanceから値を変更 (MyClass) +// => instanceから値を変更 (instance) +``` + +
+ +このstaticな変数は、継承したクラスからもアクセスすることができます。 +ただし継承先で同じ名前のstaticな変数を定義している場合、それ以降は別の変数として扱われるようになります。 + +```php + 初期値 (MyClass1) +// => 初期値 (MyClass2) +// => MyClass3の初期値 (MyClass3) +// => MyClass3の初期値 (MyClass4) + +MyClass1::$static_variable = "MyClass1から値を変更"; +echo MyClass1::$static_variable . " (MyClass1)" . PHP_EOL; +echo MyClass2::$static_variable . " (MyClass2)" . PHP_EOL; +echo MyClass3::$static_variable . " (MyClass3)" . PHP_EOL; +echo MyClass4::$static_variable . " (MyClass4)" . PHP_EOL; +// => MyClass1から値を変更 (MyClass1) +// => MyClass1から値を変更 (MyClass2) +// => MyClass3の初期値 (MyClass3) +// => MyClass3の初期値 (MyClass4) + +MyClass3::$static_variable = "MyClass3から値を変更"; +echo MyClass1::$static_variable . " (MyClass1)" . PHP_EOL; +echo MyClass2::$static_variable . " (MyClass2)" . PHP_EOL; +echo MyClass3::$static_variable . " (MyClass3)" . PHP_EOL; +echo MyClass4::$static_variable . " (MyClass4)" . PHP_EOL; +// => MyClass1から値を変更 (MyClass1) +// => MyClass1から値を変更 (MyClass2) +// => MyClass3から値を変更 (MyClass3) +// => MyClass3から値を変更 (MyClass4) +``` + +### staticなメソッド ## よく見るコード例