>我认为我们都可以同意,编写较少的代码又需要更少的维护,而较少的错误是我们都希望实现的目标。在这篇文章中,我想向您介绍一个鲜为人知的界面,该界面是在PHP 5.4.0中引入的,称为Jsonserializable。 在可用jsonserializable接口之前,
返回json编码对象的json代表以进行消费服务。
钥匙要点PHP 5.4.0中的JsonSerializable接口
> 但是,由于我们一次或一次经历过,我们做出的假设可以在一会儿通知中被证明是错误的。我们可能需要要求我们在客户类中添加更多数据。这些新数据将需要返回到消费服务,我们希望在许多地方进行此操作。您可以想象,这种方法很快变得麻烦。我们不仅必须在我们的应用程序上复制此数组代码,而且还必须记住要更新所有这些实例时,当更多更改不可避免地进来时。但是,这有另一种方法,这将有助于我们无效这些问题。
不良
现在,如果还有更多更改请求,希望将更多数据添加到客户对象中并返回,我们可以更新tojson方法。
<span><span><?php </span></span><span> </span><span><span>class Customer </span></span><span><span>{ </span></span><span> </span><span> <span>private $email = null; </span></span><span> <span>private $name = null; </span></span><span> </span><span> <span>public function __construct($email, $name) </span></span><span> <span>{ </span></span><span> <span>$this->email = $email; </span></span><span> <span>$this->name = $name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getName() </span></span><span> <span>{ </span></span><span> <span>return $this->name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getEmail() </span></span><span> <span>{ </span></span><span> <span>return $this->email; </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe'); </span></span><span> </span><span><span>$data = [ </span></span><span> <span>'customer' => [ </span></span><span> <span>'email' => $customer->getEmail(), </span></span><span> <span>'name' => $customer->getName() </span></span><span> <span>] </span></span><span><span>]; </span></span><span> </span><span><span>echo json_encode($data);</span></span>
这种方法具有自己的缺点。随之而来的其他人想要使用我们的客户的人都需要意识到这一方法,因为这不是很容易检查的东西,因此我们需要准确的文档。我们还必须记住,现在此方法
现在返回JSON(尽管我们可以将序列化移到方法之外)。这使得将客户数据与其他数据源组合起来更加尴尬,因为我们必须小心不要再次编码此方法的结果,因为这会导致一些讨厌的错误。 好
最后,输入Jsonserializable界面。这为我们提供了丑陋场景的所有灵活性,并具有不良情况的可维护性优势。尽管要使用此界面,您仍需要运行PHP 5.4.0,无论如何您都应该这样做,因为对较旧版本有很多改进。如您所见,我们通过将界面添加到我们的类中,然后将JsonSerialize方法添加到同类的正文中以满足接口合同。 在JSonSerialize方法中,我们构建并返回对象数据的数组,就像对其他示例一样。如果有任何变化,我们可以再次更新此方法。您会注意到jsonserialize方法只是返回一个数组。
魔术是在您要触发此方法时出现的,我们现在要做的就是JSON编码此类实例,此方法将自动称为“返回的数据数组”,然后编码!现在,该类实现接口,我们可以从能够检查此类是否是JsonSerializable的实例中受益。如果您想要的话,您还可以在方法中键入提示,以确保传递Jsonserializable接口。
<span><span><?php </span></span><span> </span><span><span>class Customer </span></span><span><span>{ </span></span><span> </span><span> <span>public $email = null; </span></span><span> <span>public $name = null; </span></span><span> </span><span> <span>public function __construct($email, $name) </span></span><span> <span>{ </span></span><span> <span>$this->email = $email; </span></span><span> <span>$this->name = $name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getName() </span></span><span> <span>{ </span></span><span> <span>return $this->name; </span></span><span> <span>} </span></span><span> </span><span> <span>public function getEmail() </span></span><span> <span>{ </span></span><span> <span>return $this->email; </span></span><span> <span>} </span></span><span> </span><span> <span>public function toJson() </span></span><span> <span>{ </span></span><span> <span>return json_encode([ </span></span><span> <span>'customer' => [ </span></span><span> <span>'email' => $this->getEmail(), </span></span><span> <span>'name' => $this->getName() </span></span><span> <span>] </span></span><span> <span>]); </span></span><span> <span>} </span></span><span><span>} </span></span><span> </span><span><span>$customer = new Customer('customer@sitepoint.com', 'Joe'); </span></span><span> </span><span><span>echo $customer->toJson();</span></span>
>上面的示例当然是人为的,但是,我希望我设法证明了使用此界面的好处,并激发了您自己继续使用。
经常询问有关JSonserializable接口的问题(常见问题解答)> php?
是的,您可以将jsonserializizizizizable接口与私人属性一起使用。 jsonserialize()方法可以访问对象的私有和受保护的属性,从而使您可以将这些属性包含在返回的序列化数据中。当您想将对象的内部状态编码为JSON时,这可能很有用,但仍将属性保留在类中。 >如果在jsonserialize()方法中抛出异常,则不会被json_encode()捕获。相反,JSON_ENCODE()将返回false,并且需要单独捕获和处理例外。要处理jsonserialize()中的异常,您可以在方法本身中使用一个try-catch块,从而使您可以管理异常并返回有效的数据结构以序列化。
>如果您有一个包含其他对象的对象,并且要将整个结构编码到JSON中,则每个嵌套对象还必须实现jsonserialializizizizizizizizizizizizizizizizizizizizizizizizizizizizi面接口。当在父对象上调用JSON_ENCODE()时,它还将在每个嵌套对象上调用jsonserialize(),允许每个对象指定应如何序列化。
>>
>我如何使用JSON OUTPUTS自定义JSON OUTPUT ?您可以通过从jsonserialize()方法返回自定义数据结构来自定义JSON输出。这可能是带有自定义键,字符串,数字或其他对象的数组。您从jsonserialize()返回的数据结构将是编码为json的数据。我可以使用多维阵列使用jsonserializable界面吗?是的,您可以使用jsonserializable界面的接口多维阵列。如果数组包含对象,则每个对象都应实现JsonSerializable接口。当在多维阵列上调用JSON_ENCODE()时,它将在数组中的每个对象上调用JsonSerialize(),允许每个对象都可以决定如何序列化。
>是的,您可以使用具有非缔合数组的Jsonserializizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizizable界面。如果数组包含对象,则每个对象都应实现jsonserializable接口。当json_encode()在非求和数组上调用时,它将在数组中的每个对象上调用jsonserialize(),允许每个对象都决定如何序列化。
>以上是如何使用Jsonserializable界面的详细内容。更多信息请关注PHP中文网其他相关文章!