2010/02/04 03:32:02
[PHP]requireとextendsの挙動について
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'));
なんでこうなるか、理由知っている人いたら教えてください。。
