_toString() 在对象用作字符串时被调用。如何对数值执行类似的操作,例如 __toInt() 或 __toArray()。这样的方法存在吗?有解决办法吗?即使有解决方法,使用类似的东西是不是一个坏主意?
问问题
175 次
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 回答