1

_toString() 在对象用作字符串时被调用。如何对数值执行类似的操作,例如 __toInt() 或 __toArray()。这样的方法存在吗?有解决办法吗?即使有解决方法,使用类似的东西是不是一个坏主意?

4

1 回答 1

1

没有__toArray魔术方法(只需检查此处存在的方法),但是,不应该有,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());
    }
}

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

于 2013-10-27T21:36:06.867 回答