【发布时间】:2013-11-06 13:47:15
【问题描述】:
_toString() 在对象用作字符串时被调用。如何对数值执行类似的操作,例如 __toInt() 或 __toArray()。这样的方法存在吗?有解决办法吗?即使有解决方法,使用类似的东西是不是一个坏主意?
【问题讨论】:
-
简单地说,没有
标签: php function types magic-methods object-to-string
_toString() 在对象用作字符串时被调用。如何对数值执行类似的操作,例如 __toInt() 或 __toArray()。这样的方法存在吗?有解决办法吗?即使有解决方法,使用类似的东西是不是一个坏主意?
【问题讨论】:
标签: php function types magic-methods object-to-string
没有__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 实例一样。
至于将它们作为数组访问,我看不出重点。为什么要编写一个 slow 魔术方法来执行以下操作:
$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());
}
}
好的,您必须自己显式调用这些方法,但这并不难,真的……是吗?
【讨论】:
$data[property之后添加右括号,因为它缺少一个——以防有人按照这个例子学习:)