私はjsonを使用するアプリケーションを実行しています。テスト容易性のために、私はJsonWrapperを作成しました。
<?php
class JsonWrapper {
private $json_errors;
public function __construct() {
$this->json_errors = array(
JSON_ERROR_DEPTH => ' - Maximum stack depth exceeded',
JSON_ERROR_STATE_MISMATCH => ' - Underflow or the modes mismatch',
JSON_ERROR_CTRL_CHAR => ' - Unexpected control character found',
JSON_ERROR_SYNTAX => ' - Syntax error, malformed JSON',
JSON_ERROR_UTF8 => ' - Malformed UTF-8 characters, possibly incorrectly encoded'
);
}
public function decode($json, $toAssoc = false) {
$result = json_decode($json, $toAssoc);
$errorIndex = json_last_error();
if (isset($this->json_errors[$errorIndex])) {
throw new RuntimeException('JSON Error: ' . $this->json_errors[$errorIndex]);
}
return $result;
}
}
ご覧のとおり、すべてのjsonエラー定数を独自のエラーメッセージにマッピングしています。
問題:
- HipHopを使用しない場合、これは正常に機能します。
- HipHopを使用すると、次のエラーが発生します。
Use of undefined constant JSON_ERROR_DEPTH - assumed 'JSON_ERROR_DEPTH'
のすべての初期化をコメント化するコードを変更し$json_errors
、HipHopで連想配列が禁止されているためにエラーが発生したかどうかをテストしようとしましたが、そうではありませんでした。コードのどこかにjson定数を配置した後も、失敗し続けました。
また、すべてのphp定数が失敗しているかどうかをテストしました。'XML_ERROR_PARTIAL_CHAR'定数でテストしましたが、失敗しませんでした。
ここで何が起こっているのか、なぜHipHopがJSONをそれほど嫌っているのかは本当にわかりません:(
編集
主な質問は次のとおりです。
両方がdefinephp関数で同じように定義されている場合、ヒップホップはJSON_ERROR_DEPTHを理解しないが、XML_ERROR_PARTIAL_CHARをそれほど労力をかけずに解決するのはなぜですか。
json.php:170行目
/**
* The maximum stack depth has been exceeded.
* Available since PHP 5.3.0.
* @link http://php.net/manual/en/json.constants.php
*/
define ('JSON_ERROR_DEPTH', 1);
xml.php:行559
define ('XML_ERROR_PARTIAL_CHAR', 6);