【问题标题】:Is there equivalent for __toString() method for other simple types in PHP?PHP 中其他简单类型的 __toString() 方法是否有等价物?
【发布时间】:2013-11-06 13:47:15
【问题描述】:

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

【问题讨论】:

  • 简单地说,没有

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


【解决方案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 实例一样。
至于将它们作为数组访问,我看不出重点。为什么要编写一个 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之后添加右括号,因为它缺少一个——以防有人按照这个例子学习:)
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 2010-11-15
相关资源
最近更新 更多