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

2023-12-02

我正在研究 PHP 的转换机制,在将数组转换为对象时遇到了一个奇怪的情况

$o = (object) array('1'=>'/foo/bar');   
$o = new stdClass();
var_dump($o);

据我了解,PHP 属性需要使用与 PHP 变量相同的规则来声明。那是有效的变量名称以字母或下划线开头,后跟任意数量的字母、数字或下划线。但是,上面的代码会产生以下输出

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, etc.

$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)

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

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

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

var_dump($y == $z);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将带有数字键的数组转换为对象 的相关文章

随机推荐

  • 如何控制活动流程 - 返回按钮与主页按钮

    我的申请中有 3 项活动 Activity1 gt Activity2 gt Activity3 在 Activity3 中 如果用户按 Back 我想返回到 Activity2 在Activity3的onPause事件中 我添加了一个fi
  • 找出两个长纪元值表示的两个日期之间的差异

    我的需要是我有一个 Long 值 它代表自纪元以来的毫秒值 我想找出那天和今天之间的天数差异 我正在使用Java8DAYS between inputDate currentDate 对于我使用过的 currentDateLocalDate
  • 如何让一个方法在后台持续运行直到程序结束?

    我想知道如何让方法在后台运行 IE 该方法在程序启动时启动 并持续执行其语句直到程序关闭 对于前 假设我有一个方法 gravity 它在程序运行时不断减少某个值 现在为了尝试这个 我使用以下程序 其中我试图在没有按下任何键时将公爵拉下来 重
  • pyspark 在一次加载中加载多个分区文件

    我正在尝试在一次加载中加载多个文件 都是分区文件 当我用 1 个文件尝试它时 它可以工作 但是当我列出 24 个文件时 它给了我这个错误 除了在加载后进行联合之外 我找不到任何有关限制的文档和解决方法 还有其他选择吗 下面的代码重现了问题
  • 解析 haskell 中的 Karva 表示法

    Karva 表示法在基因表达编程中用于表示数学表达式 看这里http www gene express programming com Tutorial002 asp 您可以通过读取基因并从左到右 从上到下填充节点来创建表达树 例如 在 1
  • 所有按钮都会触发表单验证语义 ui

    在我的语义 UI 表单中 div class ui form 似乎每个按钮都会触发表单验证 即使它不是提交按钮 下面是两种不同类型的按钮 div
  • python 如何对树视图列中的所有数字求和

    我需要对 Treeview 的 总和 列的所有数字求和 代码是 from tkinter import ttk import tkinter as tk from tkinter import def update listBox inse
  • python 中的 if 命令

    if aa or bb or cc or dd or ee or ff in attrs show self xx xxxx 我有这样的代码 检查 attrs show 是否包含这些字符串中的任何一个 然后为 self xx 分配一些值 但
  • 为什么 Stream.allMatch(在 Java 8 中)尝试计算所有表达式,即使可以在中途确定值?

    考虑这个片段 String a hello b null c guru boolean value Stream of a b b substring 2 c allMatch x gt x null System out println
  • 具有自定义字体和粗体样式的文本

    我正在开发一个应用程序 我正在使用自定义字体 ttf 文件用于自定义文本视图的字体 我使用的代码为 Typeface tfArchitectsDaughter Typeface createFromAsset getAssets fonts
  • 以 ELB 端点作为 dns 的 mongodb 集群

    我在这里问的不是技术问题 而是更多的架构问题 我已经关注了这个blog用于设置 mongodb 集群 我们有 2 个私有子网 我在其中配置了 3 个 mongodb 成员副本集 现在我想使用单个 dns 例如mongod some subd
  • OWL-DL 本体中的序列顺序建模

    默认情况下 OWL 本体中不维护序列顺序 如何在 OWL DL 本体中对序列进行建模 对序列建模并对其元素进行排序的一种方法是引入hasNext捕获序列顺序的属性 Class SequenceItem EquivalentTo hasNex
  • 如何使用正则表达式识别不以斜杠字符(“/”)结尾的字符串?

    我怎样才能匹配一个不以以下结尾的字符串 我知道我能做到 如果字符串确实以以下内容结束 它将匹配 但是我如何测试是否没有呢 您可以使用负数字符类 然而 这要求字符串至少包含一个字符 如果您还想允许空字符串 您可以使用替代 另一种方法是使用负数
  • 如何获取MySQL中所有表的所有列名?

    有没有一种快速方法可以从所有表中获取所有列名MySQL 而不必列出所有表 select column name from information schema columns where table schema your db order
  • 以编程方式将参数传递给 @kwdef 结构

    以编程方式将参数传递给 kwdef 结构 问题 我有这个结构 Base kwdef struct example struc Latitude Float64 9 9 Latitude degree Longitude Float64 83
  • 从另一个向量中排除向量的元素,不使用 setdiff

    我有一个字符向量 我想从中排除第二个向量中存在的元素 我不知道在这种情况下如何在仍然考虑整个向量的情况下进行否定 vector vector in vector2 我显然可以做到vector vector single character
  • ASP.NET MVC:使用 url 限制访问

    我网站的管理部分的 URL 始终以Admin ASP NET MVC 中是否可以使用 URL 的这一部分来限制用户的访问 显然我会保留 Authorize Roles Administrator 在适当的控制器和操作上 但我想知道如果应用程
  • 改造离线请求和响应

    我已经阅读了有关我的问题的许多问题和答案 但我仍然不明白如何解决它 我需要从服务器获取响应并将其存储在缓存中 之后 当设备离线时 我想使用缓存的响应 当设备在线时 我想从服务器准确获取响应 看上去没那么复杂 这是我尝试执行此操作的方式 代码
  • QMdiSubWindow 中的 qt 定位控件

    I have problem with positioning controls in QMdiSubWindow derivate I designed my window using QtDesigner and it looks li
  • 将带有数字键的数组转换为对象

    我正在研究 PHP 的转换机制 在将数组转换为对象时遇到了一个奇怪的情况 o object array 1 gt foo bar o new stdClass var dump o 据我了解 PHP 属性需要使用与 PHP 变量相同的规则来