php – 使用数字键将数组转换为对象

前端之家收集整理的这篇文章主要介绍了php – 使用数字键将数组转换为对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用 PHP的投射机制,并将一个数组作为一个对象抛出一个奇怪的情况
$o = (object) array('1'=>'/foo/bar');   
$o = new stdClass();
var_dump($o);

据了解,PHP属性需要声明与PHP变量相同的规则.那是A valid variable name starts with a letter or underscore,followed by any number of letters,numbers,or underscores.但是,上述代码产生以下输出

object(stdClass)#1 (1) {
  [1]=>
  string(8) "/foo/bar"
}

当它尝试访问对象中的信息时,它真的很奇怪.

var_dump($o->1);        // parse error
var_dump($o->{'1'});        // NULL 
var_dump(get_object_vars($o));  //array(0) { }

有没有得到var_dump报告在对象中的信息,还是只是被锁定在剩余的请求生命周期? (实际使用这个是零,我只是好奇)

是的,他们只是被锁定,除非被抛回阵列. PHP中有几个“Gotchas”,例如在旧版本中,您可以将常量定义为数组,但是不能访问其元素.即使现在你可以定义一个常量作为一个资源(例如,define(‘MysqL’,MysqL_connect());)虽然这导致相当不可预测的行为,并且应该避免.

一般来说,如果可能的话,最好避免数组到对象的转换.如果您真的需要这样做,请考虑创建一个新的stdClass实例,然后手动重命名所有变量,例如_0,_1等.

$a = array('cat','dog','pheasant');
$o = new stdClass;
foreach ($a as $k => $v) {
    if (is_numeric($k)) {
        $k = "_{$k}";
    }
    $o->$k = $v;
}

编辑:刚刚对这个假设做了一个快速测试,是的,他们在对象语境中正式地“不存在”数据被存储,但是不可能访问,因此是最终的私人成员.这是测试:

$a = array('one','two','three');
$o = (object)$a;
var_dump(property_exists($o,1),property_exists($o,'1'));

输出的是:

bool(false)
bool(false)

再次编辑:有趣的旁注,以下操作返回false:

$a = array('one','three','banana' => 'lime');
$b = array('one','banana' => 'lime');

$y = (object)$a;
$z = (object)$b;

var_dump($y == $z);

猜你在找的PHP相关文章