你能解释下一个有趣的行为吗?
class test {
//Class *test* has two properties, public and private.
public $xpublic = 'x1';
private $xprivate = 'x2';
}
$testObj = new test();
Run Code Online (Sandbox Code Playgroud)
让我们转换$testObj为数组.
settype($testObj, 'array');
var_dump($testObj);
Run Code Online (Sandbox Code Playgroud)
结果:
array(2) {
["xpublic"]=> string(3) "x1"
["testxprivate"]=> string(4) "x2"
}
好的,xprivate财产变成了testxprivate
让我们将这个数组转换为object.
$newObj = (object)$testObj;
var_dump($newObj);
Run Code Online (Sandbox Code Playgroud)
结果:
object(stdClass)#1 (2) {
["xpublic"]=> string(3) "xxx"
["xprivate":"test":private]=> string(4) "xxx3"
}
$newObj是一个stdClass对象.
问题是:
为什么testxprivate成为新对象的私有财产xprivate(而不是testxprivate)?PHP如何知道该$testObj数组是一个对象?
如果我定义相等的数组:
$testArray = array('xpublic'=>'x1', 'testxprivate'=>'x2'); …Run Code Online (Sandbox Code Playgroud) 我从PHP手册中读到了这个:
如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的 ; 私有变量的类名前置于变量名; 受保护的变量在变量名前面加上'*'.这些前置值在任一侧都有空字节. 这可能会导致一些意外行为:
Run Code Online (Sandbox Code Playgroud)class A { private $A; // This will become '\0A\0A' } class B extends A { private $A; // This will become '\0B\0A' public $AA; // This will become 'AA' } var_dump((array) new B());上面看起来有两个名为'AA'的键,虽然其中一个 实际命名为'\ 0A\0A'.
我不太明白与像字样那些部分的含义此.
什么是整数属性?
"这些前置值在两侧都有空字节.这可能会导致一些意外行为"的含义是什么?
"上面的内容似乎有两个名为'AA'的键,虽然其中一个实际命名为'\ 0A\0A'"
我在使用ArrayIterator时遇到了一些问题(实际上,与ArrayObject相同的问题).
对于99%的所有内容,我的扩展ArrayIterator表现得像一个阵列,并且运行良好.
不幸的是,implode()不喜欢被赋予ArrayIterator(或ArrayObject).
我无法在文档中找到任何建议通过扩展ArrayIterator实现任何其他类的文档,也没有任何其他方法可以覆盖.
任何人都可以建议如何使这个工作?(注意:每次使用implode时都要转换为数组不是解决方案,因为我希望这个类似数组的对象能够完全作为一个数组工作,并且不需要使用它来代码知道/关心/强制转换)
为什么会UnexpectedValueException被抛入session_start()?
我有具有属性的对象SPLObjectstorage.该对象被分配给会话
$_SESSION['foo'] = $barObject;
Run Code Online (Sandbox Code Playgroud)
我怀疑内部会话序列化面临问题解码它.我将会话存储在数据库中,看起来它正在序列化objectStorage但无法对其进行解码.
会话数据示例
self|O:4:"User":8:{s:5:"?*?id";N;s:7:"?*?nick";N;s:13:"?*?reputation";i:1;s:11:"?*?password";N;s:8:"?*?email";N;s:7:"?*?crud";O:10:"CRUDobject":2:{s:13:"?*?fieldCache";a:0:{}s:13:"?*?dependency";r:1;}s:7:"?*?auth";N;s:11:"?*?roleList";C:11:"RoleStorage":23:{x:i:1;N;,r:13;;m:a:0:{}}}
Run Code Online (Sandbox Code Playgroud)
RolestorageSPLObjectstorage
session_decode()在上面的字符串的延伸也返回false任何想法?
删除roleList属性使其正确序列化.
如果我单独做
$sr = serialize($roles); // $roles is RoleStorage object
var_dump($sr);
var_dump(unserialize($sr));
Run Code Online (Sandbox Code Playgroud)
它string 'C:11:"RoleStorage":22:{x:i:1;N;,r:3;;m:a:0:{}}' (length=46)在反序列化时打印然后失败并显示相同的消息.我不知道为什么会这样.
注意:在将对象附加到RoleStorageI时,将对象本身用作数据.表示它存储为参考.我不知道(if)如何在serialize()内部处理这个问题.