PHP 如何使用 JsonSerialized 接口?

2024-06-22

我很困惑如何JsonSerializable作品。让我更详细地阐述一下这个问题。通常我们使用这样的接口:

interface Countable {
    /* Methods */
    public function count();    
}

class MyThings implements Countable 
{
    public function count() {
        return count($this->arrayOfThings);
    }
}


$obj = new MyThings();

$obj->count();

所以我们有一个类并且它实现了接口。当我们打电话时count()方法,已经写在MyThings班级。这很容易理解。

但是当我们使用JsonSerializable界面如下:

class Thing implements JsonSerializable {
    public function jsonSerialize() {
        // do something 
    }
}
$obj = new Thing();

json_encode($obj);

jsonSerialize() inside Thing运行与json_encode()称呼。如果我们调用:

$obj->jsonSerialize();

然后有一个函数叫做jsonSerialize()班级内。但是,当我们运行时这是如何工作的json_encode()?这是如何在 php 中构建的?有人可以解释这里使用什么类型的模式吗?


对象implement Json可序列化 https://www.php.net/manual/en/class.jsonserializable.php然后实施一个json序列化() https://www.php.net/manual/en/jsonserializable.jsonserialize.php方法。那么,当json_encode() https://www.php.net/manual/en/function.json-encode.php正在将其输入序列化为 JSON,如果它正在序列化的值是JsonSerializable,它调用jsonSerialize()方法,以及result该方法的 被用作对象的序列化表示。

例如,来自 PHP 文档:

<?php
class IntegerValue implements JsonSerializable {
    public function __construct($number) {
        $this->number = (integer) $number;
    }

    public function jsonSerialize() {
        return $this->number;
    }
}

echo json_encode(new IntegerValue(1), JSON_PRETTY_PRINT);

将输出

1

哪一个是json_encoded 值代表数字 1。PHP 文档给出了另外三个这样的例子,从对象返回值,但是因为jsonSerialize()允许您指定要返回的实际数据,重要的是要意识到它可以返回anything。例如:

class JsonSerializeExample implements JsonSerializable {
    public function jsonSerialize() {
        return [
            'boolean' => true,
            'random_integer' => rand(),
            'int_from_object' => new IntegerValue(42),
            'another_object' => new stdClass,
        ];
    }
}
$obj = new JsonSerializeExample();
echo json_encode($obj, JSON_PRETTY_PRINT);

会输出

{
    "boolean": true,
    "random_integer": 1140562437,
    "int_from_object": 42,
    "another_object": {}
}

值得注意的是random_integer不是存储在任何地方的静态值;它在每次执行时都会改变;和int_from_object表明json_encode()将递归地评估JsonSerializable实例。

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

PHP 如何使用 JsonSerialized 接口? 的相关文章

  • YouTube API 观看私人视频

    我有一个具有草稿模式的网站 有人可以登录并查看该网站的外观 以便在公众看到该网站之前批准该网站 我在一个帐户上有一些 YouTube 视频 但我将其设为私人帐户 因为我不想让全世界看到它们 不过 我确实希望登录草稿模式的人能够观看私人嵌入内
  • PHP 会话混乱

    好吧 我已经很困惑了 我有一个存储在会话中的对象 我可以向该对象添加项目 到目前为止非常简单 我像这样初始化对象 template new Template mysqli SESSION template serialize templat
  • 在cakephp中调用函数

    public function data if old status prev lat lat prev long long if status Village Unknown exec query else if status Town
  • PayPal REST API:通过重定向 URL 或 Webhook 调用履行订单/付款?

    我正在致力于将 PayPal REST API 集成到我的 Symfony 2 Web 应用程序中 我不确定完成订单 付款的正确时间 地点 与金额 客户数据等其他参数一起 我将两个 URL 传输到 PayPal API 一个是接受付款时用户
  • php SimpleXML 属性丢失

    我这里有以下 xml 文档 编辑 示例见下文 我正在使用 php SimpleXML 将其转换为对象来读取它 xmlContent file get contents path test xml tablesRaw new SimpleXM
  • ImagickException 并显示消息 Postscript delegate 在 MAMP 3.0.5 上失败

    我正在尝试使用 MAMP 3 0 5 将 PDF 转换为 png 文件 我知道我的 PHP 代码可以在我们的 Linux 服务器上正常运行 我在 Mac OSX 10 8 5 上安装了 MAMP 3 0 5 当我运行脚本将 PDF 转换为
  • 在 codeigniter 中找不到我的核心类 My_head

    我正在尝试在 codeigniter 中创建核心类 在 application core 中 我创建一个名为 MY head php 的文件 MY head php 的代码是 class MY head extends CI Control
  • 是 header('Content-Type:text/plain');有必要吗?

    我还没有看到有或没有这个头部信息有什么区别 定义 必要 如果您希望浏览器这样做 这是必要的know文件的类型是什么 PHP 自动设置Content Type标头至text html如果您不覆盖它 那么您的浏览器会将其视为不包含任何 HTML
  • 开源在线 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何使用 preg_match 在数组中搜索?

    如何使用 preg match 在数组中搜索 Example 在这篇文章中 我将为您提供三种不同的方法来完成您的要求 我实际上建议使用最后一个片段 因为它最容易理解并且代码非常简洁 如何查看数组中哪些元素与我的正则表达式匹配 有一个函数专门
  • 请求参数和 phpdoc [重复]

    这个问题在这里已经有答案了 可能的重复 是否有记录 GET POST 参数的标准 https stackoverflow com questions 2121710 is there a standard for documenting g
  • Zend DB Select 具有多个表联接

    尝试使用复制以下查询Zend Db Select 有什么指点吗 SELECT compounds id as compounds id reactions id as reactions id reaction compound numbe
  • 通过 WooCommerce 注册时将完整的电子邮件地址设置为用户名

    设置 帐户下的 WooCommerce 有一个名为 根据客户电子邮件自动生成用户名 但它生成的用户名不是完整的电子邮件地址 email protected cdn cgi l email protection becomes myemail
  • 在 Apache 虚拟主机之间传输会话数据

    如何将 PHP 会话数据从一个 Apache 虚拟主机传递到另一台 我当前正在运行 Apache 2 2 17 和 PHP 5 3 3 并且我已经设置了一台主机来管理单点登录应用程序 我需要将其传递给运行单独应用程序的另外两台虚拟主机 这是
  • 当用户使用 Internet Explorer 时重定向到新页面

    我使用下面的代码将使用 Internet Explorer 的用户重定向到新页面 但显然代码有问题 因为当我使用 Internet Explorer 时该网站不再加载 这是代码 由于我不知道我做错了什么 如果有人可以发布使用正确编码的正确方
  • MVC:我应该在哪里格式化数据?

    我从模型 带有数据的数组 获取数据 并且需要以特定格式显示 我需要迭代数组 格式化数据然后显示它 我应该在哪里格式化数据以显示 在模型 控制器还是视图中 谢谢 对数组的迭代并显示数据是在视图中完成的 因此我也会在视图中进行格式化 如果格式化
  • 在 MySQL 中使用 LIKE 子句优化表以进行搜索

    我正在为我的网站的消息部分构建一个搜索功能 并且有一个略多于 9 000 000 行的消息数据库 以及索引sender subject and message字段 我希望在查询中使用 LIKE mysql 子句 例如 ex SELECT s
  • 如何对 bcmath 数字进行向上、向下和舍入?

    我需要模仿的确切功能ceil http php net manual en function ceil php floor http www php net manual en function floor php and round ht
  • php 字符串与通配符 * 匹配?

    我想提供将字符串与通配符匹配的可能性 Example mystring dir folder1 file pattern dir file stringMatchWithWildcard mystring pattern gt Return
  • 以同样的方式根据编号对数组进行洗牌

    我正在运行一个测验制作网站 我希望以打乱的顺序向用户显示问题的答案 我试图avoid如果我要随机打乱答案 则存储向用户呈现答案的顺序 我想以可预测的方式打乱答案 这样我以后就可以用同样的方式重复随机播放 显示结果时 我认为我可以按某个数字对

随机推荐