【问题标题】:PHP copy all object properties to thisPHP 将所有对象属性复制到此
【发布时间】:2012-01-03 13:09:31
【问题描述】:

我在 PHP 中有一个对象,类型为 MyObject

$myObject instanceof MyObject

现在,在class MyObject 中,有一个非静态函数,在其中,我使用了对“我”的引用,例如$this,但我还有另一个对象。

是否有可能在不使用$this = $myObject 的情况下达到或多或少相同的效果,例如set_object_vars($this, get_object_vars($myObject)) 之类的东西?

【问题讨论】:

  • 你是什么意思“使用对'我'的引用,比如$this”,你是不是在方法中别名$this
  • 我认为您的问题需要稍作审查。即使我们有一个 set_object_vars() 函数,效果真的一样吗?您将复制对象,而不是引用它。有关更多信息,请参阅 PHP 中的复制与引用。
  • 你的问题对我来说没有多大意义。 '我使用对“我”的引用,例如$this' - 特别是。也许这就是你要找的东西,也许不是:PHP Clone class
  • 很抱歉让您感到困惑。我不需要相同的引用,只有属性必须相同。

标签: php properties this assign


【解决方案1】:
<?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 中?

这意味着在上面的示例中,如果您在 MyObject 中有一个 private $bar 属性,get_object_vars 会看到它,因为您在 MyObject 类的实例中。如果您尝试 import 另一个类的实例,这显然不起作用。

【讨论】:

  • 谢谢!没想到是这样!现在,我只需要将属性复制到实例中,静态属性无关^^
【解决方案2】:

@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;
        }
    }   
}

不同之处在于您可以传递普通数组(哈希表)以及对象。想想一些来自数据库的数据的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2021-02-06
    • 2011-10-16
    相关资源
    最近更新 更多