21

PHPにタイプのオブジェクトがありますMyObject

$myObject instanceof MyObject

さて、にclass MyObjectは非静的関数があり、そこには、のように「私」への参照を使用しますが、そこに$thisは別のオブジェクトもあります。

を行わなくて$this = $myObjectも、ある種の何かのように、多かれ少なかれ同じ効果を達成することは可能set_object_vars($this, get_object_vars($myObject))ですか?

4

2 に答える 2

63
<?php

class MyObject
{
    public function import(MyObject $object)
    {   
        foreach (get_object_vars($object) as $key => $value) {
            $this->$key = $value;
        }
    }   
}

私が推測するあなたが望むことをしますが、あなたは次のことに注意する必要があります:

  1. get_object_vars非静的プロパティのみが検索されます
  2. get_object_varsスコープに応じてアクセス可能なプロパティのみが検索されます

スコープによる部分は非常に重要であり、もう少し説明する価値があるかもしれません。PHPでは、プロパティスコープがインスタンスに依存するのではなく、クラスに依存することをご存知ですか?

これは、上記の例では、にプロパティがある場合、クラスのインスタンスにいるため、プロパティが表示されることprivate $barを意味します。別のクラスのインスタンスをインポートしようとしている場合、これは明らかに機能しません。MyObjectget_object_varsMyObject

于 2012-01-03T13:36:17.267 に答える
1

@Geoffrey Bacheletこれを改善できます:

class MyObject
{
    //object or array as parameter
    public function import($object)
    {   
        $vars=is_object($object)?get_object_vars($object):$object;
        if(!is_array($vars)) throw Exception('no props to import into the object!');
        foreach ($vars as $key => $value) {
            $this->$key = $value;
        }
    }   
}

違いは、オブジェクトだけでなく通常の配列(ハッシュテーブル)も渡すことができることです。たとえば、データベースからのデータについて考えてみてください。

于 2015-10-31T12:02:17.377 に答える