【PHP日記】

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

PHP雑学⑤ 【16日目】

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


require()とinclude()の違い

どちらもPHPにおいて外部ファイルを読み込むための似たような機能を提供しますが、主な違いはエラーの取り扱いにあります。


require()
  • ファイルを読み込んだときに、指定されたファイルが存在しないか読み込めない場合、致命的なエラー(Fatal Error)を返し、スクリプトの実行が中断されます

  • そのため、指定した外部コードが重要であり、プログラムが正しく動くためにどうしても必要不可欠なファイルの場合に使用されます。


include()
  • ファイルを読み込んだときに、指定されたファイルが存在しないか読み込めない場合、警告(Warning)を返し、スクリプトの実行は継続されます

  • 外部のコードがオプションである場合や、ファイルの存在が必要不可欠でない場合に使用されます。


そのため、一般的にはrequireを使用することが推奨されます。外部ファイルが存在しない時点でスクリプトの実行が中断され、プログラマがすぐに対処できるようになるからです。


onceキーワード

ちなみにどちらもonceというキーワードを付けることができ、指定したファイルがすでに読み込まれていたら「スキップ」してくれます。

require_once('partial.php');
include_once('partial.php');



ダブル"とシングル'の違い

ダブルクオーテーション"の場合、文字列中に変数を埋め込んでも、変数内の値を取り出して表示してくれます。

逆にシングルの場合は、文字列中に変数を埋め込むと変数名のまま表示されます。

$name = "太郎くん";
echo "こんにちわ、$name!";    // こんにちわ、太郎くん!
echo 'こんにちわ、$name!';    // こんにちわ、$name!

そのため、中の値を取り出すには.などのキーワードが必要になります。


その他にも、特殊文字の解釈が違います。例えばダブルクオーテーションでは特定のエスケープシーケンス(\n\tなど)が特殊文字として認識されます。

echo "こんにちわ!\tさようなら!";   // 結果『こんにちわ!  さようなら!』

しかしシングルクオーテーションでは、エスケープシーケンスは解釈されず、通常の文字列として表示されます。

echo 'こんにちわ!\tさようなら!';   // 結果『こんにちわ!\tさようなら!』

あとシングルクオーテーションの方が若干処理速度が速いため、一般的にはシングル'を使い、変数の展開などが必要な場合にダブル"を使うらしいですが、この速度の違いはほとんど無視できるレベルなのでどちらでも問題ないようです。



子クラスはデータ型も継承する

まず、クラス名はデータ型の一種です。PHPにおいて、クラスを元にして作られるオブジェクトは親クラスの型となります。

以下の場合、クラス名はMyClassであり、このクラスから生成されるオブジェクトは MyClass型のデータとなります。

class MyClass {
    public $property;
    
    public function myMethod() {
        echo "私はメソッドです。";
    }
}

つまりクラスは継承すると親クラスのデータ型も一緒に引き継ぎます。

例えばParentClassという親クラスを継承したChildClassがあったとして、ChildClassParentClass型も継承しているため、ParentClass型で型チェックを行われる場合でもエラーは起こらず、そのまま実行されます。

$child = new ChildClass('hello', 'world');

function helloWorld(ParentClass $child)
{
  $child->show();
}

helloShow($child);    // エラーは起こらない

このように親クラスの型も継承されるため、将来的にParentClass型を継承したクラスを多く作ったとしても、毎回クラスの型に合わせてコードを修正することが少なくなります。



以上です。