PHPを学び始めた素人目線での、大事だったり大事じゃなかったりする雑知識メモ、その④です。
define()とconstの違い
どちらも定数を定義する機能を持っていますが、お互い違った特徴を持っています。
define()
関数として提供され、実行時に使用される
変数や、関数の戻り値を使える
クラス定数を定義する際には使えない
定義はグローバルスコープとして登録される
const
構文であり、if文や関数の中では使えない
変数や、関数の戻り値を使えない
クラス内でのみ使用できる定数を定義するために使用される
定義は名前空間上で行われる
アクセス修飾子protected
の使い所
protected
はPHPのクラス内におけるアクセス修飾子の一つで、指定したメンバが「クラス内またはサブクラス内からアクセス可能である」ことを明示するために使用します。
では実際にどのような場面で使われることになるのか見てみます。以下は親クラスHello
を継承した子クラスHelloWorld
の中で、親クラスが持つshow
メソッドをオーバーライド(親メソッドを新たに定義し直すこと)する例です。
class Hello { // private $text; // クラス内でしか利用できない protected $text; // 子クラスでの利用のみ可能にしている public function __construct($text) { $this->text = $text; } public function show() { printf('%s' , $this->text); } } class HelloWorld extends Hello { private $secondText; public function __construct($text, $secondText) { parent::__construct($text); $this->secondText = $secondText; } public function show() { // オーバーライド printf('%s %s' , $this->text, $this->secondText); } } $hello = new HelloWorld('hello', 'world'); $hello->show(); // 結果『hello world』
もし$text
が親クラスの中でprivate
として定義されている場合、子クラスHelloWorld
でオーバーライドしたshow
メソッドの中で$text
というメンバ変数を利用することはできません。
それに対し、アクセス修飾子をprotected
にして$text
を定義することで子クラスでも利用が可能になり、親クラスのメンバ変数を使用することができます。
因みにHelloWorld
のコンストラクタ内の$text
は、あくまで引数で親クラスの初期化処理をしているだけなので関係ありません。
finalキーワード
親クラスを継承した子クラスの中で、メソッドを新しく再定義することをオーバーライドと言いますが、親クラスの中で、final
キーワードを使ってメソッドを定義することでオーバーライド不可として設定することができます。
class Hello { protected $text; public function __construct($text) { $this->text = $text; } final public function show() { このメソッドは子クラスの中で再定義できない printf('%s' , $this->text); } }
以上です。
参考文献
https://dotinstall.com/lessons/basic_php_objects/54014