PHP __toArray()或__toObject()覆盖?

cj5*_*cj5 1 php overriding class tostring

是否有相当于从正常类中获取重组的标准化对象?与PHP的__toString()覆盖方法相同的行.

好的,所以我有这个抓取一堆工作站的方法,并返回一个对象模型,它处理一堆其他方法来获取其他相关数据.所以在这种情况下,当我调用包含位置"$ locations"的对象时,我想要返回一个对象属性的平面关联数组,或者我可以轻松编码为JSON的对象数组.如果我得到一个位置对象数组,我只想将$ 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();
}
Run Code Online (Sandbox Code Playgroud)

rjm*_*nro 9

在php 5.4及以上版本中,如果你的类是impliments JsonSerializable,你可以添加一个jsonSerialize将被调用的方法json_encode:

<?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);
Run Code Online (Sandbox Code Playgroud)

将打印:

{"foo":"hello","name":"MyClass"}
Run Code Online (Sandbox Code Playgroud)