3

マシンを PHP 5.3 から PHP 5.4 に更新しましたが、CakePHP (バージョン 2.1.1) アプリで次のエラーが発生し続けます。

致命的なエラー: クラス 'String' が .../Behavior.php の行に見つかりません ...

Fatal Error: Class 'Debugger' not found in .../Component.php on line ...

等。

エラーの LINE と FILE は常にクラス宣言の終了ブラケットを示しているため、エラーは実際には役に立ちません。

多くの検索の後、適切なパブリック/プライベート関数宣言と強力なパラメーターの型付けを追加することで、いくつかのエラーを解決することができました。別名:

function beforeSave($Model) {}

//becomes
public function beforeSave(Model $Model){}
4

2 に答える 2

8

PHP5.4 に移行した後、コード内の多くの「悪い習慣」をクリーンアップする必要があります。

拡張メソッドでの厳密に型指定されたパラメーターの定義

これは、変数名の直前にメソッドが受け取るオブジェクトのクラスを記述する必要があることを意味します。これは、すべてのメソッドではなく、親のクラス メソッドを置き換えるメソッドにのみ必要です。不明な場合は、コア ファイルまたは API の親クラスのメソッド宣言を確認してください。

// Behavior code
public function afterSave(Model $model, $created) //GOOD 
function aferSave($model) //NOT GOOD
// Component code
public function shutdown(Controller $Controller) // GOOD
function shutdown($Controller) // BAD

「呼び出し時の参照渡し」を削除

私は多くの人がコントローラーとモデルオブジェクトを参照によって関数で渡しているのを見てきました:

function beforeSave(&$Model)

これはエラーをスローし、間違っています。変数の前のアンパサンドを削除するだけです。オブジェクトはすでに PHP で参照によって渡されているため、機能を壊すことはありません。私が理解しているように、これは PHP 5.4 で削除されました

メソッドの拡張ですべてのメソッド パラメータを宣言する

親クラスのメソッドを上書きする場合は、関数定義ですべての関数パラメーターを宣言する必要があります。パラメータが欠落している場合、エラーが発生します。

例:

SomeBehavior extends ModelBehavior
public function afterSave(Model $Model){ } //WRONG, but works in 5.3
public function afterSave(Model $Model, $created){ } //RIGHT, works everwhere :)

App::load() を追加して依存関係をロードします

クラスが実際に利用可能かどうかを常に確認することをお勧めします。そのため、依存するすべてのクラスがファイルの先頭にあるApp::load()でロードされているかどうかを再確認してください。

于 2012-09-04T16:39:26.763 に答える
4

別の解決策は、Core.php のエラー報告レベルを次のように変更することです。

Configure::write('Error', array(
    'handler' => 'ErrorHandler::handleError',
    'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
    'trace' => true
));

これは理想的な解決策ではないことに注意してください。コードを修正してください。

于 2012-11-07T10:15:18.283 に答える