【PHP日記】

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

PHP雑学③ 【13日目】

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


子クラスは親クラスのコンストラクタを実行しない(限定的に)

親クラス(Super class)を継承した子クラス(Sub Class)に、独自のコンストラクタ(初期化処理)が設定されている場合、自動では親クラスのコンストラクタは実行されません。

そのため、子クラスが親クラスの初期化処理を引き継ぐには、明示的にparent::__construct()を呼ぶことで親クラスのコンストラクタを実行してあげる必要があります。

class ParentClass {
  public function __construct() {
      echo "親クラスが呼び出されました。";
  }
}

class ChildClass extends ParentClass {
  public function __construct() {
      parent::__construct();    // 親クラスのコンストラクタを呼ぶ
      echo "子クラスが呼び出されました。";
  }
}

$obj = new ChildClass();    // 親クラスが呼び出されました。子クラスが呼び出されました



echoを短縮形で書く

HTMLの文中にPHPechoを出力するというのはよくあるため、短縮形が用意されています。

<?php echo 'こんにちわ、今日もいい天気ですね' ?>
<?= 'こんにちわ今日もいい天気ですね' ?>

上の2つはどちらも全く同じ意味になります。



文字実体参照で悪意ある攻撃を防ぐ

PHPでは、クロスサイトスクリプティング*1(通称:XSS)からユーザーを守るために、特殊文字エスケープ*2する必要があります。

<?php $hello = "<script>alert('Hello Dark World');</script>"; ?>
<?= $hello ?>

例えば、上の行で言うところの <script> 部分をエスケープすることによって、アラートを起動させることなく無害なテキストとして表示させます。
エスケープするには htmlspecialchars() を用います。

<?php $hello = "<script>alert('Hello Dark World');</script>"; ?>
<?= htmlspecialchars($hello, ENT_QUOTES, 'UTF-8') ?>

ENT_QUOTESは、htmlspecialchars関数に設定するフラグで、クオーテーションをエスケープするための指定です。
UTF-8はそのWebページの文字コードを指定しています。


結果として、Webページでは以下の文字列が出力されます。

<script>alert('Hello Dark World');</script>

このように、攻撃者が埋め込んだ悪意のあるスクリプトが実行されないよう、どんな値であれHTMLへの埋め込みを行う際は、文字実体参照エスケープしたほうが良いでしょう。


以上です。


*1:悪意のあるコードをWeb閲覧者に実行する

*2:HTMLタグではなく文字として認識させるための処理。