我正在做一个使用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错误常量。
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);
答案 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 ;