問題のコード
a.php
<?php
require_once('b.php');
class A {
public function __construct(){
echo("A construct call\n");
}
}
// この順番でコールしないと落ちる
$a = new A();
$b = new B();
$c = new C();
// この順番でコールすると落ちる
//$a = new A();
//$c = new C();
//$b = new B();
b.php
<?php
class B {
public function __construct(){
require_once('c.php');
echo("B construct call\n");
}
}
c.php
<?php
class C {
public function __construct(){
echo("C construct call\n");
}
}
実行結果
$ php a.php
A construct call
B construct call
C construct call
$ php a.php
A construct call
Fatal error: Uncaught Error: Class 'C' not found in a.php:16
Stack trace:
#0 {main}
thrown in a.php on line 16
解説
Bのコンストラクタにcのrequireが入っているのでBのインスタンスを立てないとCが呼び出せないようになっている。
今回の例で言うと関係のある3ファイルを見ればすぐ分かるが、実際のコードになり呼び出し関係が複雑になると状況が掴めず
「順番通りにnewしないと落ちる謎コード」
となる。
回避策
- オートロードを使いましょう
- 正しい位置・分かりやすい位置でrequireしましょう