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属性 in MyObjectget_object_vars将会看到它,因为您在一个MyObject类的实例中。如果您尝试导入另一个类的实例,这显然不起作用。

于 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 回答