PHP5.4のClass ‘Debugger’ not found in第二弾(憶測語り始めました)

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
第一弾もけいおんの画像使ったから合わせてみました

この記事を三行にまとめると

またしてもClass ‘Debugger’ not found in〜ってエラーが出た
PHP4と5ではコンストラクタの書き方が異なる
It's a piece of cake!!
これから書くことは、たぶんそーなんじゃないかなぁっていう、推測が多分に含まれてますが、よしなに。



ちょっと前に、CakePHP2系で開発してて、PHPのバージョンを5.4にしたらエラーが出て動かなくなったって話をしました。

PHPのバージョンを5.4にしたときのClass ‘Debugger’ not found inについて

このときは、メソッドのオーバーライドが原因だったってことで、一応解決したんですが、今度は別のところで、同じエラーが出たのよ。エラーの内容は全く一緒。DebuggerってクラスがねーぞこのやろうっていうFatalエラー。

結論から言うと、コンストラクタの書き方のところでエラーが出てたみたいなんですが、そこに行くまでに、ちょいと説明があるんで、今日はそれを聞いていただこうかなーと。

まあ、ごちゃごちゃといろんなこと書きますが、解決方法はマジ楽勝なんで、気楽に読んでもらえればと思います。



時代が変わればやり方も変わる

コンストラクタってのは、クラス(オブジェクト?)のインスタンスを生成するための関数です。クラスをnewすると、自動的に呼ばれる関数ですね。初期化用関数とかって言い方すれば良いのかしら? とりあえず、コンバインとトラクターを合体させた農業用機械の一種的なものでは断じてないってことだけは、確実です。

僕は基本的にPHP5世代なもんで、PHP4系のことはあまりよく分からないんですが、4と5では、このコンストラクタの書き方が少し違うみたいですね。

具体的に言うと、PHP4のときは、コンストラクタの関数名はクラス名と同じものを用いていたんですが、PHP5は、「__construct()」っていう関数でコンストラクタ関数が書けます。

コードにすると、こんな感じですね。

//PHP4
class Sample {
  function Sample() {

  }
}

//PHP5
class Sample {
  function __construct() {

  }
}

リファレンスを読む限り、PHP5でもクラス名でコンストラクタ関数を作成することはできるらしいんですが、バージョンが5.3.3以降は、条件次第では有効ではないとか何とか。

コンストラクタとデストラクタ

名前空間ってやつが、未だによく分からないんですよね、自分。



時代の移り変わりに生じる歪み

ちょうどPHP4から5に移行していた頃、たぶんソースコードは、両バージョンに対応したコードがくんずほぐれつしてたと思うんですよね。

実際、ちょっと古いライブラリファイルとかを見ると、4と5の両方に対応するためか、こんな風に書いてあるのを見かけることがあるんですよ。

class Sample {
  function Sample() {
    $this->__construct();
  }

  function __construct() {

  }
}

クラス名の方のコンストラクタ関数で、__construct()を呼び出してるんですね。

これと言って、大きな問題になることはないです。実際、こう書いてあってもエラーが出ることもなく、ちゃんと動いてたし。

そう。今までは……ね。



なうろーでぃんぐ……できず

普通にPHPを書いてクラスを読み込む場合には、特に問題はない。

でも、PHPのバージョンを5.4にして、更にCakePHP2系で開発していると、問題が発生することがあるみたい。もしかしたら1.3でも同じエラーが出るかもしれないけど、今回はそこまでは確認してないっす。

CakePHPでファイルを読み込む場合、普通にrequireとかincludeを使っても良いけど、「App::import()」ってやつで、ファイルを読み込むこともできる。

例えば、Libっていうフォルダの下にSampleクラスを記述したsample.phpってのを作って、そのファイルをコントローラーとかで読み込むなら、こんな風に書いて読み込める。

class SampleController extends AppController {
  function index() {
    App::import('Lib', 'sample');
    $obj = new Sample();
  }
}

普通なら、これでSampleクラスのインスタンスが生成できるんだけど、さっきみたいに、PHP4と5の場合の両方に対応したコンストラクタ関数の書き方をしていると、例の「Class ‘Debugger’ 〜」のエラーが出てしまう。

たぶん結果的には、コンストラクタ関数が二つあるってことで、オーバーライドっぽい感じになってて、前回同様、オーバーライドの仕方に問題がある的なことなのかな〜と思ったり思わなかったりするわけなんですが、とりあえず、エラーが出ます。

でも解決方法は簡単で、片方のコンストラクタ関数を消してしまえば問題は解決です。一応、PHP5の場合は__construct()の方が正式のようだから、クラス名の方の関数を消すのが良いですかね。






今時、こんな書き方をしているファイルを見かけることがあるのかどうかも怪しいもんですが、もし上記のエラーが出て、コンストラクタのところでつまづいてるっぽかったら、PHP4のやり方にはおさらばしていただきましょう。

なーに、焦ることはねーです。こんなの、指先一つで消せるエラーですから。

It’s a piece of cake!!
 もしかしたら何か関連しているかも? 
 質問や感想などお気軽にコメントしてください