1

私は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エラー定数を独自のエラーメッセージにマッピングしています。

問題:

  1. HipHopを使用しない場合、これは正常に機能します。
  2. 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);
4

3 に答える 3

1

Ok。今、私はそれが解決しなかった理由を知っています。問題は、HipHopでサポートされているPHPバージョンです。

HipHopウィキペディアにアクセスすると、次のことがわかります。
HipHop currently supports PHP version 5.2 and will be updated to support 5.3.

PHP 5.2ではすべてのJSON定数が利用できなかったため、それらは解決されていません。

于 2013-03-24T16:46:11.940 に答える
1

HipHopPHPが行うのと同じ定数をすべて定義するわけではありません。つまり、ヒップホップはPHPの再実装のようなもので、失われたものや変更されたものがあります。

たとえばPDO::PARAM_INT、HipHopのようなPDO定数は、古い方法で定義されていPDO_PARAM_INTます。

また、私が正しく覚えていれば、のヒップホップの実装urlencodeはphpのようなものでしたraw_urlencode(つまり、スペースをPHP%20としてraw_urlencodeエンコードするのではなく、PHP+のようにエンコードしますurlencode)。

また、名前空間(PHP 5.3で提供された)がサポートされているため、HipHopは正確にPHP 5.2を実装していませんが、バグがあり、使用をお勧めしません。

つまり、コードにパッチを適用する必要があるかもしれません。たとえば、ブートストラップコードに次のようなものを追加できます。

<?php
if (!is_defined('JSON_ERROR_NONE')) define('JSON_ERROR_NONE', 0);
// same thing with other JSON_* constants
于 2013-03-24T17:49:14.770 に答える
0

私は間違っているかもしれませんが、私はあなたがそれを行うことができるとは思いません、あなたの例はPHP 5.4で「コンパイル」されませんerror_reporting(E_ALL);、それは通知を発行します、つまりPHPはあなたが配列のキーの周りの引用符を忘れたと思います。

constを使用してクラスレベルで定数を宣言する必要があります

class MyClass{
   const MY_CONST = "my value";
}

それをそのように呼びます

echo MyClass::MY_CONST ;
于 2013-03-24T15:56:11.210 に答える