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 に答える