くまきち

山と旅と家族が大事。
でも激しい物欲が理性と財布のタガを飛ばす
最近は自転車も乗ってる

CakePHP on PHP 5.3系で Deprecated エラー多発

2011-01-08 16:25:23 | SEまわり
異なる環境で作ったモジュールを、PHP 5.3系に持ってきたところ、Deprecated: Assigning the return value of new by reference is deprecated 警告が沢山出るようになった。

 例:Deprecated: Assigning the return value of new by reference is deprecated in /www/cake/libs/cache/file.php on line 89

根本的な対策はそのとおりに、new の戻り値の取り扱いを書き換えてあげることなんだけど、CakePHP のコアライブラリをいじることはしたくない(管理が煩雑になる)ので、CakePHP 自身が対応して、そっちに更新するときまでは、この警告を表示しないようにすることにした。

変更箇所は、cake/libs/configure.php の、write()関数定義中、以下の赤字部分を追記。
エラー報告有無の判定レベルを変えている。

if (isset($config['debug'])) {
 if ($_this->debug) {
  error_reporting(E_ALL);
  if ( error_reporting() > 6143 ) {
   error_reporting(E_ALL & ~E_DEPRECATED);
  }

  if (function_exists('ini_set')) {
   ini_set('display_errors', 1);
  }

  if (!class_exists('Debugger')) {
   require LIBS . 'debugger.php';
  }
  if (!class_exists('CakeLog')) {
   require LIBS . 'cake_log.php';
  }
  Configure::write('log', LOG_NOTICE);
 } else {
  error_reporting(0);
  Configure::write('log', LOG_NOTICE);
 }
}

なお、この問題は CakePHP 1.3 系では解決済みだそうだ。
ということで、このあと早速更新した。影響を受けるアプリもほとんどなかったし。

1.2 系で動かす理由がある場合は上のやり方で対応するしかないと思う。
CakePHP を呼んでいる全てのアプリケーションに影響してしまうことが問題になるのなら、.htaccess でエラーレベルを変更すれば良い。