【问题标题】:Running a loop through object properties and assign value循环遍历对象属性并赋值
【发布时间】:2014-12-19 02:53:56
【问题描述】:

我有这门课,

class example {
    public $a;
    public $b;
    public $c;
    ....
}

我有一个包含与示例类中相同数量的公共变量的数组(在本例中为 3):

$arr[0] = 'Red';
$arr[1] = 'Green';
$arr[2] = 'Blue';

我想将这个数组的每个值一个一个地分配给类的公共属性(比如$a 得到Red,$b 得到Green 等等)。如何使用循环将数组中的这些值分配给类的公共属性?

我正在写类似下面的东西,但它不起作用:

$class = new example();
$i = 0;
foreach ($class as $key => $value) {
    $class->$$key = $arr[$i];
    $i++;
}

编辑:

只是为了解释为什么我不能在 example 类中使用任何 setter/getter 方法 - 实际上 example 类是通过反序列化数据库对象创建的。我对这门课没有任何控制权。我正在开发一个控制器类,它接收这个example 类和一个数组。我需要想办法将这个数组中的值分配给example 类的公共属性。

【问题讨论】:

  • 变量名不能以数字开头。您不能拥有 $class->0 或 $class->1 成员。有一些骇人听闻的方法来实现它,但我们会确定你做不到。但是,您的整个方法是错误的。为什么你的班级没有一个数组而不是一些公共成员?
  • 我同意@NB。 - 方法是错误的。它本质上是一种自省的黑客行为。一个更好的问题是为什么你需要在一个循环中做它,它真的需要吗。对我来说,这似乎是构造函数可以轻松处理的事情,即便如此,我也不完全确定它需要以这种方式完成。
  • @N.B. $key 不是数字,它是example 类的公共成员属性的名称。
  • 伙计们-感谢您告诉我的方法是错误的。现在请回答问题
  • 对不起,我误读了 foreach,我以为你在迭代数组 - 抱歉。

标签: php arrays class loops variable-assignment


【解决方案1】:

由于分配密钥时的双重$$,它不起作用:

$class->$$key = $arr[$i];

更改为单个$

$class->$key = $arr[$i];

Codepad demo

在没有变量的情况下访问对象属性时,不需要$,因此如果您的密钥存储在变量中,则需要单个$。

也就是说,可能有比这更好的方法来解决问题。好像是X Y Problem。

【讨论】:

  • 您的解决方案对我有用,下面@raidenace 的解决方案也是如此。感谢您提供 X Y 问题链接
  • 在我对@N.B. 的回答的评论中,我已经解释了为什么我无法使用“解决问题的更好方法”
  • 没问题 - 这就是为什么我没有提供任何其他建议的原因,因为您正在做的事情有太多的可能性。不要亲自投票,任何与“变量变量”远程相关的问题都不会在 SO 上得到很好的解决,因为很多初学者在不需要时使用它们。在你的情况下,听起来你可能是有道理的。
【解决方案2】:

给你:

<?php
class example {
    public $a;
    public $b;
    public $c;
}
$arr[0] = 'Red';
$arr[1] = 'Green';
$arr[2] = 'Blue';
$class = new example();
$i = 0;
foreach ($class as $key => $value) {
    $class->{$key} = $arr[$i];
    $i++;
}
var_dump($class);

基本思想是使用$class-&gt;{$key}而不是$class-&gt;$$key,因为$$key是variable variable。

【讨论】:

    【解决方案3】:

    嗯,正如我之前提到的 - 方法是错误的。有两个答案可以告诉您如何操作,但这不是最好的方法。

    这是一种更好的方法,而且更智能 - 因为您的代码更少,工作量更少,而且您可以添加任意数量的属性,而无需接触类。

    代码:

    class MyClass {
    
        protected $_data = array();
    
        public function setData(array $data)
        {
            $this->_data = $data;
        }
    
        public function __set($key, $value)
        {
            $this->_data[$key] = $value;
        }
    
        public function __get($key)
        {
            return isset($this->_data[$key]) ? $this->data[$key] : null;
        }
    }
    

    使用场景#1:

    $class = new MyClass;
    
    $class->red = 'My red value';
    $class->blue = 'My blue value';
    

    使用场景#2:

    $class = new MyClass;
    
    $class->setData( array('red' => 'Red', 'blue' => 'Blue', 'green' => 'Green') );
    

    该示例用于引导您使用魔术函数 __get() 和 __set()特性。这降低了复杂性。或者,如果它们以令人满意的方式适合您的方案,您可以使用给定的答案之一。

    【讨论】:

    • 在我的例子中,MyClass() 是通过 unserialize 创建一个数据库存储的对象。我无法控制这个MyClass,也无法添加任何魔术方法。我正在研究一个接收数组和MyClass 的控制器类,然后我应该将数组中的值分配给类。因此,我需要找出一种方法来遍历类属性并分配值。作为 PHP 新手,这对我来说有点棘手!这些天对于所有这些反对票来说,SO 很可怕 :)
    • 你看,当你包含所有细节时,你会更容易掌握你的问题。我了解有时您会受限于您能做什么或不能做什么,而您不得不求助于不良做法。我将作为示例留下答案,因为何时可以控制对象,如何动态添加属性。将序列化对象保存到数据库也很奇怪,但我想这也是有原因的。无论如何,祝你工作顺利:)
    • 谢谢。我相信您的回答对适用此解决方案的其他人很有价值
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 2021-07-16
    • 1970-01-01
    • 2021-11-20
    • 2016-09-09
    • 2017-10-27
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多