json_encode PHP 对象及其受保护的属性

2023-12-31

有什么方法可以设置 PHP 对象,以便当我尝试将它们转换为 JSON 时,它们所有受保护的属性都会显示出来?

我读过其他答案建议我添加一个toJson()函数到对象,但这可能并不能真正帮助我很多。在大多数情况下,我有一个对象数组,并对数组本身执行编码。

$array = [
    $object1, $object2, $object3, 5, 'string', $object4
];

return json_encode($array);

是的,我可以循环遍历这个数组并调用toJson()在每个具有此类方法的元素上,但这似乎并不正确。有没有办法可以使用魔法方法来实现这一目标?


您可以实施JsonSerializable http://php.net/manual/en/class.jsonserializable.php接口在你的类中,这样你就可以完全控制它的序列化方式。您还可以创建一个Trait http://php.net/manual/en/language.oop5.traits.php防止复制粘贴序列化方法:

<?php

trait JsonSerializer {
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

class Foo implements \JsonSerializable 
{
    protected $foo = 'bar';

    use JsonSerializer;
}

class Bar implements \JsonSerializable 
{
    protected $bar = 'baz';

    use JsonSerializer;   
}

$foo = new Foo;
$bar = new Bar;

var_dump(json_encode([$foo, $bar]));

或者你可以使用反射 http://php.net/manual/en/book.reflection.php做你想做的事:

<?php

class Foo
{
    protected $foo = 'bar';
}

class Bar
{
    protected $bar = 'baz';
}

$foo = new Foo;
$bar = new Bar;

class Seriailzer
{
    public function serialize($toJson)
    {
        $data = [];

        foreach ($toJson as $item) {
            $data[] = $this->serializeItem($item);
        }

        return json_encode($data);
    }

    private function serializeItem($item)
    {
        if (!is_object($item)) {
            return $item;
        }

        return $this->getProperties($item);
    }

    private function getProperties($obj)
    {
        $rc = new ReflectionClass($obj);

        return $rc->getProperties();
    }
}

$serializer = new Seriailzer();

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

json_encode PHP 对象及其受保护的属性 的相关文章

  • 如何将图像从 Android 应用程序上传到网络服务器的特定文件夹中

    如何将图像从 android 移动到 Web 服务器上的指定文件夹 这是我的安卓代码 package com example bitmaptest import java io ByteArrayOutputStream import ja
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv
  • Laravel Auth:attempt() 不会持久登录

    我在网上找到了许多有类似问题的资源 但似乎没有一个解决方案可以解决我的问题 当我使用以下代码登录用户时 一切看起来都很好 email Input get email password Input get password if Auth a
  • Ajax 没有将我重定向到下一页

    我正在尝试将单击的图像的 ID 传递到下一页 当我开发代码时 它没有将我重定向到下一页 当我单击 F12 并检查网络中的 POST 时 它显示变量已正确传递到下一页 如附图所示 但它没有将我重定向到下一页 所以现在我知道变量在下一页中正确传
  • 使用 ImageMagick 和 PHP 将 PNG 转换为 JPG 并将透明背景设置为白色

    将图像从 PNG 转换为 JPEG 时 如何使用 ImageMagick 带有 php 扩展 将透明背景设置为白色 在撰写本文时 您尚未指定正在使用哪个扩展 但如果您使用命令行 则命令将是 convert image png backgro
  • laravel - 使用请求类或输入类

    在宁静的控制器中 我应该使用哪个类来获取传递的变量 member gt email Input get email or member gt email Request get email 两种选择都适合我 但有什么区别 Input get
  • PHP 无法加载动态库“php_pdo_oci.dll”

    我在 Windows 8 上运行 Apache 2 4 7 和 PHP 5 5 9 我安装了 PHPUnit 并开始弹出此警告图像 警告 是的 我在 php ini 中启用了扩展加载以及 extension dir 以更正文件夹 并且该文件
  • 如何防止在 PHP 中使用超出“使用”范围的特征方法

    我想知道是否有任何方法可以防止在 PHP 的任何类上下文之外使用特征方法 让我用一个简短的例子来解释我想要什么 这是我当前的代码 File MyFunctions php trait MyFunctions function hello w
  • 使用 PHP PayPal REST API 退款?

    我正在开发一个集成到 PayPal 的 REST API 中的 PHP 应用程序 我正确处理了事务并将事务 ID 保存到 MySQL 数据库中 我现在正在尝试退款 但无法让它停止给出 传入 JSON 请求未映射到 API 请求 错误 有人对
  • 通过 URL 指定控制器类与为每个控制器编写一个脚本相比,有何优缺点?

    今年夏天我安装了两个不同的 PHP 系统 每个都使用两种不同的方法 方法 1 每个任务一个 PHP 文件 该方法需要一个PHP为每个主要任务创建文件 例如 我的上传脚本可以通过http www domain com upload php O
  • 如何将我的 init 函数中的代码集中到所有控制器中?

    public function init this gt view gt user Zend Auth getInstance gt getIdentity this gt view gt siteName Zend Registry ge
  • 如何在多次尝试后延迟登录尝试 (PHP)

    我正在开发一个用 PHP 构建的相当大的网站 该网站可能会有很多用户 我正在寻找一种方法来保护登录屏幕免受自动尝试的影响 我已经在注册表中添加了验证码检查 但还想进一步强化网站 据我所知 StackOverflow 上也有类似的问题 而且我
  • 使用 Instagram Basic Display API 时出现“无效平台应用程序”错误

    我正在尝试使用 Instagram Basic 显示 API 但是当我发布授权代码以获取访问令牌时 我不断收到以下错误 error type OAuthException 代码 400 error message 平台应用无效 我正在遵循此
  • 重写 URL,将 ID 替换为查询字符串中的标题

    我对 mod rewrite 很陌生 但我做了一些搜索 但找不到这个问题的答案 我有一个网站 它只有一个 PHP 页面 根据查询字符串中传递给它的 ID 提供数十页内容 我想重写 URL 以便此 ID消失并替换为从数据库中提取的页面标题 例
  • Mysqli 更新抛出 Call to a member function bind_param() 错误[重复]

    这个问题在这里已经有答案了 我有一个 70 80 字段表单 需要插入到表中 因此我首先根据表单中的输入名称在数据库中创建了一个表 而不是手动创建一个巨大的插入语句 这是我使用的代码创建 更改表 function createTable ar
  • 如何在 Zend MVC 中实现 SSL

    我之前已经通过使用特定的安全文件夹 例如服务器上的 https 文件夹与 http 文件夹 实现了安全页面 我已经开始使用 Zend Framework 并希望应用程序的某些部分 例如登录 使用 https 我在谷歌上搜索过 甚至在这里搜索
  • 如何从 Laravel 执行存储过程

    我需要在表单提交数据后执行存储过程 我让存储过程按照我想要的方式工作 并且我的表单正常工作 我只是不知道从 laravel 5 执行 sp 的语句 它应该是这样的 执行 my stored procedure 但我似乎在网上找不到类似的东西
  • 如何使用 php 在 sql 查询中转义引号?

    我有一个疑问 sql SELECT CustomerID FROM tblCustomer WHERE EmailAddress addslashes POST username AND Password addslashes POST p
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function

随机推荐

  • reinterpret_cast 能否将无效的指针值转换为有效的指针值?

    考虑这个联盟 union A int a struct int b c c and a不是布局兼容 https timsong cpp github io cppwp n4659 basic types 11类型 因此无法读取其值b通过a
  • 如何在不排序的情况下选择表中的最后 5 行?

    我想从 SQL Server 中的表中选择最后 5 条记录 而不按升序或降序排列表 这几乎是我写过的最奇怪的查询 但我很确定它会从表中获取 最后 5 行 而无需排序 select from issues where issueid not
  • 准备学习html5

    我是一名桌面应用程序开发人员 我计划学习 html5 但由于它尚未发布 几乎 没有出版的书籍 并且网络上没有太多适合初学者的信息 我觉得我应该从 html4 开始当前的网络开发技能 我想我应该从 html4 css 和 javascript
  • 从层次结构中的顶级类调用方法而不是覆盖

    假设我有课Base object and Derived Base 这两个都实现了一个功能foo with Derived foo覆盖版本Base 然而 在其中一种方法中 说Base learn to foo 我想打电话Base foo而不
  • 如何创建交互式选择?

    我想在Python中创建一个 交互式选择 不确定我的措辞是否正确 请看下面的示例 让用户按向上和向下键选择一个选项并返回确认它 然后继续脚本 终端中的示例输出如下所示 python script py Please select an op
  • MVC 5 未将名为“action”的参数设置为传递的值

    我有以下方法 public void Service int id string action 当我将其作为网址时 http localhost home service id 24 action updated 无论我传递给参数什么 MV
  • C# 中将 char 转换为 int

    我在 C 中有一个 char char foo 2 现在我想把 2 变成一个 int 我发现 Convert ToInt32 返回 char 的实际十进制值 而不是数字 2 以下内容将起作用 int bar Convert ToInt32
  • Android EditText 监听光标位置变化

    我有一个包含 EditText 的对话框 EditText 在创建时已被填充 当用户将光标放在文本的某些部分上或附近时 将会弹出一个 Toast 我的问题是监听光标位置的变化 其他post http stackoverflow com qu
  • 通过 Dagger 将演示者注入到 Activity 中

    我想知道如何使用代码在 Activity 中注入 Presenter 以下是详细信息 以下是错误信息 Error 12 46 error cannot find symbol class DaggerCategoryPresenterCom
  • 为什么 Twitter 和 Google API 文档不对 URL 中的 & 符号进行编码?

    I 已读过 https stackoverflow com questions 3705591 do i encode ampersands in a href我应该将我的 符号编码为 amp 在 HTML 中 然而numerous来自受人
  • 如何使用 Eclipse (CDT) 将现有项目用作新项目的模板?

    我想使用我的一个项目 其中所有内容都配置良好 以及如何开始作为 模板 工作 以便使用 CDT 在 eclipse 中创建新项目 因此可以节省配置和编写工作项目的时间 因为它已经在其他地方制作了 有什么提示吗 您始终可以右键单击该项目 选择
  • 在 React Native 中将 props 传递到外部样式表?

    我是 React 和 React Native 的新手 目前 对于每个组件 我将代码分成两个单独的文件 index js对于所有 React 代码 以及 styles js对于样式表 有没有办法将 props 传递到外部样式表中 例子 in
  • 与重复的组合

    我正在使用 Mathematica 7 和 Combinatorica 包函数 我可以从元素列表中获取特定数量的所有组合 其中顺序无关紧要并且没有重复 例如 in KSubsets a b c d 3 out a b c a b d a c
  • 如何检查仅当鼠标位于特定位置时才存在的元素

    如果您需要检查元素的悬停状态 可以按照描述完成here https stackoverflow com questions 17602611 inspect a hover element问题是如果移动鼠标就会失去状态 就我而言 它的 ja
  • 绑定Vuejs的两个组件

    如何完美地组织两个 vuejs 组件之间的数据和交互 例如 1 我有一个组件 item v for item in items a item name 2 和第二个 card v for item in items div content
  • 如何停靠弹出窗口?

    我有一个包含 3 个主要小部件的应用程序 我也有一个弹出窗口QDockWidget 我正在尝试获取QDockWidget停靠到底部小部件的右半部分 但正如您在下图中看到的 我可以停靠窗口的唯一位置是应用程序的边缘 我怎样才能做到这一点QDo
  • 闪亮的传单地图弹出窗口正在提取错误的数据

    由于某种原因 Shiny传单应用程序上分配给多边形的弹出窗口提取了应分配给多边形的错误信息 似乎多边形已放置在地图上 然后以不同的顺序分配多边形属性 任何想法将不胜感激 server lt function input output ses
  • Google Cloud Load Balancer - 子域重定向到存储桶中的特定文件夹

    目前我们有以下需求 每个用户都可以在 Google 存储桶下拥有自己的子域和文件夹 其中包含应通过此子域提供的内容 例如 domain user1 example com gt bucket example com user1 index
  • 如何将表中的某些列复制到另一个mysql

    我有两张桌子 例如 table 1 A B C D E F G H I J table 2 A C D E G H J K L M N O P 我必须将一些列从表 2 复制到表 1 我尝试的是 INSERT INTO table 1 C D
  • json_encode PHP 对象及其受保护的属性

    有什么方法可以设置 PHP 对象 以便当我尝试将它们转换为 JSON 时 它们所有受保护的属性都会显示出来 我读过其他答案建议我添加一个toJson 函数到对象 但这可能并不能真正帮助我很多 在大多数情况下 我有一个对象数组 并对数组本身执