php - 将带有数字键的数组转换为对象

标签 php arrays casting

我正在研究 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 中有一些小“陷阱”,例如在旧版本中,您可以将常量定义为数组,但永远不会访问其元素。即使现在,您也可以将常量定义为资源(​​例如,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;
}

编辑:刚刚对这个假设做了一次快速测试,是的,它们在对象上下文中正式“不存在”;数据被存储,但无法访问,因此是最终的私有(private)成员。这是测试:

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

输出是:

bool(false)
bool(false)

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

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

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

var_dump($y == $z);

关于php - 将带有数字键的数组转换为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1869812/

相关文章:

javascript - 在一定时间间隔后更新 react 状态

c# - 使用 LINQ 将 List<string> 与 List<object> 匹配?

php - 用 PHP 显示多张图片

c++ - 冒泡排序不传递数据或不起作用

PHP分层数组 - parent 和 child

Javascript 七段显示器不亮起或响应事件点击

c# - 使用在运行时定义类型的 'is'

android - ksoap2 类型转换 getResponse()

PHP/正则表达式 : simple regex for bbcode [s] or [strike] fails to work

php - mkdir 的权限将不起作用