我在探讨PHP的构建机制,并在将数组作为对象进行投射时遇到了一个奇怪的情况
$o = (object) array('1'=>'/foo/bar');
$o = new stdClass();
var_dump($o);
Run Code Online (Sandbox Code Playgroud)
据我了解,PHP属性需要使用与PHP变量相同的规则声明.这是一个有效的变量名称,以字母或下划线开头,后跟任意数量的字母,数字或下划线.但是,上面的代码产生以下输出
object(stdClass)#1 (1) {
[1]=>
string(8) "/foo/bar"
}
Run Code Online (Sandbox Code Playgroud)
当你试图访问对象中的信息时,它变得非常奇怪.
var_dump($o->1); // parse error
var_dump($o->{'1'}); // NULL
var_dump(get_object_vars($o)); //array(0) { }
Run Code Online (Sandbox Code Playgroud)
无论如何都要获取var_dump报告的信息在对象中,或者它是否仅在请求生命周期的其余部分被锁定?(实际使用这是零,我只是好奇)
我的应用程序需要生成一个具有data类型数组的大属性的对象的json .数组需要在收集数据库输出时保留在内存中,并且只有在数组完成后才能确定某些属性.
复杂性:数组是基于数字的,并且必须在json输出中显示,因此直接json_encode()不是一个选项.
为了在像RasPi这样的低规格机器上实现这一点,我研究了修剪内存消耗:
SPLFixedArraystring和pack()这两种方法都会处理数组存储内存问题,但在使用JSON进行编码时会失败.
我已经研究了实现JsonSerializable但是因为它强制用户返回结果,然后在Json中编码我回到了
public function jsonSerialize() {
return $this->toArray();
}
Run Code Online (Sandbox Code Playgroud)
它有相同的记忆问题.
zendframework/Component_ZendJson看起来很有希望,因为它寻找具有toJson()提供自己的编码的方法的对象string而不是object.
我想知道是否有更好的选择不会给内存问题?