对于PHP中的其他简单类型,__toString()方法是否相同?

时间:2013-10-27 21:25:00

标签: php function types magic-methods object-to-string

当对象用作字符串时,将调用

_toString()。我怎样才能为数值做类似的事情,比如__toInt()或__toArray()。这样的方法存在吗?有工作吗?使用类似的东西是不是一个坏主意,即使它有解决方法吗?

1 个答案:

答案 0 :(得分:1)

没有__toArray魔术方法(只是check the ones that exist here),但是,不应该,IMO。
虽然人们已经要求使用一种神奇的toArray方法,但这种方法似乎不会很快实现。

考虑到对象是什么以及我们如何使用它们,toInt方法没有多大意义,因为所有对象都可以强制转换为数组,并且可以迭代过来,无论如何,我看到使用__toArray的意义非常小 要将对象“转换”到数组,您可以使用以下任一方法:

$obj = new stdClass;
$obj->foo = 'bar';
var_dump((array) $obj);
//or
var_dump(json_decode(json_encode($obj), true));

这可以使用两个自定义对象完成,如同stdClass个实例一样 至于作为数组访问它们,我看不出重点。为什么要写一个魔术方法来做类似的事情:

$bar = 'foo';
$obj[$bar];

如果可以的话:

$obj->{$bar}

或者你可以这样做:

foreach($obj as $property => $value){}

或者,如果您需要更具体的内容,只需实现任何Traversable接口即可 对于极少数情况,您希望对象以特定方式从特定属性生成数组,只需为此编写一个方法并显式调用该方法。

class ComplexObject
{
    private $secret = null;
    private $childObject = null;
    public $foo = null;
    //some methods, then:
    public function toArray()
    {//custom array representation of object
        $data = array();
        foreach($this->childObject as $property => $val)
        {
            if (!is_object($this->childObject->{$property}))
            {
                $data[$property] = $val;
            }
        }
        $data['foo'] = $this->foo;
        return $data;
    }
    //and even:
    public function toJson()
    {
        return json_encode($this->toArray());
    }
}

好的,你必须自己明确地调用这些方法,但这并不难,真的......是吗?