相关疑难解决方法(0)

PHP中的数组到Object和Object to Array - 有趣的行为

你能解释下一个有趣的行为吗?

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 arrays casting object

18
推荐指数
1
解决办法
2234
查看次数

什么是整数属性,'\ 0A\0A'的含义是什么?

我从PHP手册中读到了这个:

如果将对象转换为数组,则结果是一个数组,其元素是对象的属性.键是成员变量名,有一些值得注意的例外:整数属性是不可访问的 ; 私有变量的类名前置于变量名; 受保护的变量在变量名前面加上'*'.这些前置值在任一侧都有空字节. 这可能会导致一些意外行为:

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()); 
Run Code Online (Sandbox Code Playgroud)

上面看起来有两个名为'AA'的键,虽然其中一个 实际命名为'\ 0A\0A'.

我不太明白与像字样那些部分的含义.

什么是整数属性?

"这些前置值在两侧都有空字节.这可能会导致一些意外行为"的含义是什么?

"上面的内容似乎有两个名为'AA'的键,虽然其中一个实际命名为'\ 0A\0A'"

php

6
推荐指数
1
解决办法
392
查看次数

如何使用ArrayIterator或ArrayObject使用implode?

我在使用ArrayIterator时遇到了一些问题(实际上,与ArrayObject相同的问题).

对于99%的所有内容,我的扩展ArrayIterator表现得像一个阵列,并且运行良好.

不幸的是,implode()不喜欢被赋予ArrayIterator(或ArrayObject).

我无法在文档中找到任何建议通过扩展ArrayIterator实现任何其他类的文档,也没有任何其他方法可以覆盖.

任何人都可以建议如何使这个工作?(注意:每次使用implode时都要转换为数组不是解决方案,因为我希望这个类似数组的对象能够完全作为一个数组工作,并且不需要使用它来代码知道/关心/强制转换)

php implode arrayiterator

6
推荐指数
1
解决办法
1719
查看次数

session_start()php中的UnexpectedValueException导致SPLObjectStorage序列化失败

为什么会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()内部处理这个问题.

php spl serialization splobjectstorage

5
推荐指数
1
解决办法
1025
查看次数