【PHP日記】

自分の知識不足を悟った末、なるべく1日一回、Webに関する知識を書いていくだけのブログ。

PHP雑学④ 【15日目】

PHPを学び始めた素人目線での、大事だったり大事じゃなかったりする雑知識メモ、その④です。


define()とconstの違い

どちらも定数を定義する機能を持っていますが、お互い違った特徴を持っています。


define()
  • 関数として提供され、実行時に使用される

  • 変数や、関数の戻り値を使える

  • クラス定数を定義する際には使えない

  • 定義はグローバルスコープとして登録される


const
  • 構文であり、if文や関数の中では使えない

  • 変数や、関数の戻り値を使えない

  • クラス内でのみ使用できる定数を定義するために使用される

  • 定義は名前空間上で行われる



アクセス修飾子protectedの使い所

protectedPHPのクラス内におけるアクセス修飾子の一つで、指定したメンバが「クラス内またはサブクラス内からアクセス可能である」ことを明示するために使用します。

では実際にどのような場面で使われることになるのか見てみます。以下は親クラス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