PHPのrequireで良く判らない挙動をしたのでブログで取り上げてみます。
ちなみに原因も解決策もハッキリしていません。。
誰か知ってたら教えて下さいまし。。

Hoge.php


<?php

// クラス定義の前に、クラスの有無を判定する。
// 結果:true
var_dump(class_exists('Hoge'));

// クラスの定義
class Hoge {}

上記の様にクラス定義の前にクラスの有無を判定した場合、
そのクラスは存在すると解釈されておるのですが、
サブクラスを作成した場合は、そうでもなさそうなのです。。

SuperClass.php


<?php

// クラス定義の前に、クラスの有無を判定する。
// 結果:true
var_dump(class_exists('SuperClass'));

// 親クラスの定義
class SuperClass {}

SubClass.php


<?php

// 親クラスが定義されているファイルを読み込む。
require_once 'SuperClass.php';

// クラス定義の前に、クラスの有無を判定する。
// 結果:false
var_dump(class_exists('SubClass'));

// 小クラスの定義
class SubClass extends SuperClass {}

なんとまあ、サブクラスが定義されていない事になってるじゃありませんか。。
何なんだろうと思ったので、ひとまず親クラスの継承を取っ払ってみる事に。

SuperClass.php


<?php

// 結果:true
var_dump(class_exists('SuperClass'));

class SuperClass {}

SubClass.php


<?php

require_once 'SuperClass.php';

// 結果:true
var_dump(class_exists('SubClass'));

class SubClass {}

なんだかやっぱり継承すると駄目になるみたいです。
そこで、上記のファイルを1つのファイルにまとめてみました。


<?php

// 結果:true
var_dump(class_exists('SuperClass'));

class SuperClass {}

// 結果:true
var_dump(class_exists('SubClass'));

class SubClass extends SuperClass {}

これだと、両方とも定義されている事になっている様です。
なんでだろう。。

requrireって記述した所にごっそり書き加えられるイメージ(飽くまでイメージ)
で使ってたんだけどこの挙動を見る限りでは、そうではないみたいですね。

ちなみに、小クラスの定義の後にクラスの有無を判定すると、クラスは存在している様です。

SuperClass.php


<?php

// 結果:true
var_dump(class_exists('SuperClass'));

class SuperClass {}

SubClass.php


<?php

require_once 'SuperClass.php';

class SubClass extends SuperClass {}

// 結果:true
var_dump(class_exists('SubClass'));

なんでこうなるか、理由知っている人いたら教えてください。。