HipHop没有解析JSON定义的常量

时间:2013-03-24 15:27:00

标签: php json hiphop

我正在做一个使用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,我会收到此错误:
  3. Use of undefined constant JSON_ERROR_DEPTH - assumed 'JSON_ERROR_DEPTH'

    我试图修改代码注释$json_errors的所有初始化,并测试错误是否因为关联数组在HipHop中被禁止,但事实并非如此。在我的代码中将json常量放在任何地方后,它一直都失败了。

    如果所有的php常量都失败了,我也做了测试。我使用'XML_ERROR_PARTIAL_CHAR'常量进行测试,并且它没有失败!

    我真的不知道这里发生了什么,为什么HipHop非常讨厌JSON :(

    修改

    主要问题是:
    为什么hiphop不理解JSON_ERROR_DEPTH,但如果两者都使用define php函数以相同的方式定义,那么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);
    

3 个答案:

答案 0 :(得分:1)

确定。现在我知道为什么它没有解决。问题是HipHop支持的PHP版本!

如果你转到HipHop wikipedia,你会看到:
HipHop currently supports PHP version 5.2 and will be updated to support 5.3.

由于PHP 5.2中没有所有JSON常量,因此未解析这些常量。

答案 1 :(得分:1)

HipHop没有定义PHP所做的所有相同的常量。我的意思是,hiphop就像是PHP的重新实现,其中一些东西丢失了,其他的东西改变了。

例如,HipHop中的PDO::PARAM_INT等PDO常量是以旧方式定义的,即PDO_PARAM_INT

另外,如果我没记错的话,urlencode的hiphop实现就像php的raw_urlencode(即将%20编码为raw_urlencode的空格,而不是+,而不是将它们编码为urlencode作为PHP的<?php if (!is_defined('JSON_ERROR_NONE')) define('JSON_ERROR_NONE', 0); // same thing with other JSON_* constants )。

HipHop也没有真正实现PHP 5.2,因为对命名空间有一些支持(在PHP 5.3中出现),但是它们是错误的,不推荐使用。

简而言之,您可能必须修补代码中的某些内容。例如,您可以在引导代码中添加如下内容:

{{1}}

答案 2 :(得分:0)

我可能错了,但我不认为你可以这样做,你的例子在PHP 5.4中没有“编译”error_reporting(E_ALL);,它会发出通知,这意味着PHP认为你忘记了你的密钥周围的引号阵列。

您需要使用const

在类级别声明常量
class MyClass{
   const MY_CONST = "my value";
}

然后这样称呼

echo MyClass::MY_CONST ;