PHP\uuuuToArray()或\uuuuToObject()重写?
是否存在从普通类获得重新组织的标准化对象的等价物?它与PHP的_utoString()重写方法的工作原理相同 好的,我有一个方法,它获取一组站点,并返回一个对象模型,它处理一组其他方法来获取其他相关数据。因此,在本例中,当我调用包含位置“$locations”的对象时,我希望返回一个对象属性的平面关联数组,或者一个可以轻松编码为JSON的对象数组。如果我得到一个location对象数组,我只希望$location直接转换为JSON字符串。就像我引用$location作为包含_toString()的location对象一样,它会自动生成一个字符串表示。在本例中,我需要一个标准对象或数组,而不是字符串。有办法做到这一点吗 代码示例如下:PHP\uuuuToArray()或\uuuuToObject()重写?,php,class,tostring,overriding,Php,Class,Tostring,Overriding,是否存在从普通类获得重新组织的标准化对象的等价物?它与PHP的_utoString()重写方法的工作原理相同 好的,我有一个方法,它获取一组站点,并返回一个对象模型,它处理一组其他方法来获取其他相关数据。因此,在本例中,当我调用包含位置“$locations”的对象时,我希望返回一个对象属性的平面关联数组,或者一个可以轻松编码为JSON的对象数组。如果我得到一个location对象数组,我只希望$location直接转换为JSON字符串。就像我引用$location作为包含_toString()
public function stnSearch() {
$locations = DBO::getInstance()->query("
SELECT " . DBO_Location::COLUMNS . "
FROM " . DBO_Location::TABLE_NAME . " AS a
WHERE a.title LIKE '%" . $_REQUEST['query'] . "%'
")->fetchAll(PDO::FETCH_CLASS, DBO_Location::MODEL);
Util::debug($locations); // want this to produce a standard object for each model without having to do an additional loop
exit();
}
谢谢大家的反馈!最后,我不得不在每个类中创建一个标准方法(一个用于toArray(),一个用于toJSON())。这不是理想的解决方案,但必须这样做 toArray()方法将复杂类展平,使数组具有toObject()或toJSON()可用于摘要的属性。例如,我有一些方法可以将输出数据格式化为HTML,而这些方法不会自动设置为类中的本地属性,因此我需要手动设置。通过我上面提到的方法 toArray()示例: 要获取JSON对象,请执行以下操作:
public static function toJSON($logs) {
$b = self::toArray($logs);
return json_encode($b);
}
同样,这不是期望的结果,但它完成了任务。理想情况下,如果子类中存在需要处理的无关属性,我希望能够在父类中建立一个可以重写的方法。在PHP5.4及更高版本中,如果您的类实现了
JsonSerializable
,您可以添加一个将由json\u encode
调用的jsonSerialize
方法:
<?php
class MyClass implements JsonSerializable
{
public $foo;
public function jsonSerialize() {
return array(
"foo"=>$this->foo,
"name"=>"MyClass"
);
}
}
$x = new MyClass();
$x->foo = "hello";
echo json_encode($x);
显示所需行为的示例。您的意思是想从自定义类中获取一个
stdClass
对象,例如该自定义类实例集的所有属性?toString将帮助您将类中的任何内容转换为字符串返回。我有一个类中的选择性属性,我希望将其作为标准对象返回,因为我需要用于AJAX调用的JSON,并且我无法直接访问从Javascript返回此信息的PHP方法。@ChrisWalsh如果您试图从所选类属性生成JSON输出,为什么不只指定一个自定义的\uuu toString()
方法,该方法使用您感兴趣的属性构建一个stdClass
对象,然后返回该对象的JSON编码?或者只需实现自己的toJSON()
方法。@MikeBrant这是个好主意。我想避免使用uu-toString,因为它已经在做其他事情了,但是我想仅仅创建toJson对象是可行的。
<?php
class MyClass implements JsonSerializable
{
public $foo;
public function jsonSerialize() {
return array(
"foo"=>$this->foo,
"name"=>"MyClass"
);
}
}
$x = new MyClass();
$x->foo = "hello";
echo json_encode($x);
{"foo":"hello","name":"MyClass"}