変数/属性の型が間違っていると、よく問題が発生します。問題は、PHP (5.3) がクラッシュするだけで、エラーを出力せず、エラー ログ (*1) に書き込むことさえないため、トレースが難しいことです。クラッシュするだけです。
配列のような文字列へのアクセスは、追跡不可能であってはならないと思いますか? つまり、PHP は C ではありませんよね?
この動作を変更する方法や、この問題を回避するためのベスト プラクティスはありますか? いつでもどこでもすべての変数をチェックして、5 倍のコードを書くことは別として?
[更新] : わかりました。Zend の外部でコードを単純化すると、うまくいくようです。何らかの形で Zend に関連している必要があります。私はすべてのphpSettingsをapplication.iniに設定していますが:
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.error_reporting = "E_ALL|E_STRICT"
そして、エラーの原因となっているコード (私が試したようにサンドボックスで動作します) は次のとおりです。
$prefix = (strpos($obj[3][1], 'videometa') !== false) ? "http://www7.example.org" : "http://www.example.org";
$obj は json 文字列です。
[更新 2] : コードのすぐ上で ini_get を使用して php 設定をエコーしようとしたところ、error_reporting は E_ALL|E_STRICT にあり、display_error は ON などと表示されます。
したがって、この:
echo '<br/>ini_get = '.ini_get('display_errors').';';
echo '<br/>ini_get = '.ini_get('error_reporting').';';
echo '<br/>ini_get = '.ini_get('error_log').';';
echo '<br>$obj: ';
$obj = 'peter';
var_dump($obj);
echo '<br/>Now for the critical code:';
$prefix = (strpos($obj[MC_IMAGETYPE_VDT][1], 'videometa') !== false) ? "http://www7.example.org" : "http://www.example.org";
echo '<br/>It never shows this!';
これを出す:
ini_get = 1;
ini_get = E_ALL|E_STRICT;
ini_get = /Applications/MAMP/logs/php_error.log;
$obj: string(5) "peter"
Now for the critical code:
そして、停止します。何か案は?
*1. php.ini には、display_errors = On および error_reporting = E_ALL などがあります。すべて良い。