【问题标题】:Variablename as $this-> value?变量名作为 $this-> 值?
【发布时间】:2011-07-11 10:06:52
【问题描述】:

我目前正在开发我的 PHP 类。 我有一个包含值的数组,我想将数组字段名用作 $this 引用。让我告诉你我得到了什么:

<?php
class Server {    
    private $playlist;
    private $mp3;
    private static $ressourceFolder;
    private static $sudoUser;

在我的数组中它包含:

  array(6) {
    ["playlist"]=>
    int(8002)
    ["mp3"]=>
    int(1024)
    ["ressourceFolder"]=>
    bool(true)
    ["sudoUser"]=>
    bool(true)
  }

所以我想在我的 foreach 中使用一些东西来将数组字段的值放入类全局变量中,数组字段名与变量相同,所以这“应该”工作,但它没有:(

foreach($ressourceArray as $ressourceField=>$ressourceValue) {    
    $this->$ressourceField = $ressourceValue;
}

如果有人能告诉我为什么这行不通以及如何使它“可行”,我将不胜感激......

提前致谢!

【问题讨论】:

  • 静态变量应使用self关键字进行赋值
  • 您在这里混合了静态变量和实例变量。这就是为什么它不起作用。您需要分隔数组。

标签: php oop class variables foreach


【解决方案1】:

确实有效,见Demo:

<?php

$array = array("playlist"=> 8002, "mp3"=>1024);

class Mix {
   public function __construct($array) {
    foreach($array as $key => $value) {
        $this->$key = $value;
      }
   }
}

$class = new Mix($array);
var_dump($class);

它将根据数组的键/值对为对象$this分配新的公共成员。

处理数组中的错误命名键

如果键包含的值不是有效的变量名,则稍后访问属性可能很重要 ({property-name}),请参阅PHP curly brace syntax for member variable

在添加之前将数组转换为对象将有助于防止那些完全无效的键名出现致命错误:

$object = (object) $array;
# iterate over object instead of array:
foreach($object as $key => $value) {
  $this->$key = $value;
}

这些键只是被演员丢弃了。

【讨论】:

  • 实际上它确实有帮助,所以它似乎可以工作,但为什么不在我的代码中,mhh我会重新检查所有内容,不过感谢您的证明!
  • @yes123:这就是 OP 要求的。您可能会发现答案很简单,因为您是真正的专业编码人员,但请注意,并非所有用户都像您一样有经验,他们也有问题。
  • @all 我很抱歉,它工作正常,但我的变量名编码错误,羞耻 哈哈对不起,但我的意思是也许其他人会寻找一些这样回答...谢谢
  • @Sebsian:有一个技巧可以解决这个问题。在遍历数组之前,将其强制转换为对象。我将添加一些代码来说明如何操作。
【解决方案2】:

您可以使用魔术方法__set__get 让它工作。见:http://php.net/manual/en/language.oop5.magic.php

【讨论】:

    【解决方案3】:

    在我的数组中它包含:

    什么数组?这看起来像是类实例的数组转储。

    进入类全局变量

    什么全局类变量?类不是变量。变量可能包含对对象或类名的引用。

    假设你想遍历一个对象的属性,并且

    $ressourceArray = new Server();
    

    代码将按预期工作。

    如果循环在类方法中,那么循环应该是....

    foreach($this as $ressourceField=>$ressourceValue) {    
       $this->$ressourceField = $ressourceValue;
    }
    

    如果您的意思是尝试从数组中初始化对象属性...

    class Server {
    ...
    function setValues($ressourceArray)
    {
       foreach($ressourceArray as $ressourceField=>$ressourceValue) {    
          $this->$ressourceField = $ressourceValue;
       }
    }
    

    (顺便说一句,“资源”中只有一个“s”)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多