2

変数/属性の型が間違っていると、よく問題が発生します。問題は、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 などがあります。すべて良い。

4

1 に答える 1

3

エラー報告を設定するために使用している方法が正しいとは思いません。数値(または数値を持つ E_ALL などの定数)である必要があるときに文字列値に設定しています。ただ試してみてください:

phpSettings.error_reporting = E_ALL|E_STRICT

(つまり、引用符なし) または:

phpSettings.error_reporting = 32767

他のすべてが失敗した場合は、問題を引き起こしていると思われるコードの上にエラー報告値を一時的に設定できます。

error_reporting(E_ALL);

また、次のものがあります。

$prefix = (strpos($obj[MC_IMAGETYPE_VDT][1], 'videometa') !== false) ? "http://www7.example.org" : "http://www.example.org";

しかし$obj、ネストされた配列としてアクセスしようとしている文字列です。これによりFatal error: Cannot use string offset as an array、おそらくコードが失敗する理由がわかります。

于 2011-07-19T11:23:23.303 に答える