【问题标题】:PHP trying to create dynamic variables in classesPHP试图在类中创建动态变量
【发布时间】:2012-09-02 01:25:47
【问题描述】:

我需要直接从数据库中构造一个包含大量变量的类,为简单起见,我们将它们命名为“userX”,我对 ORM 进行了一些研究,但它超出了我的想象。

基本上我认为我可以使用我的程序代码

for ($i=0; $i<100; $i++) {
public ${'user'.$i};
}

但是,在课堂上

class test() {

  private $var1;

  for ($i=0; $i<10000; $i++) {
  public ${'user'.$i};
  }

  function __constructor .....

}

显然不是......但它给我留下了同样的问题,我怎样才能添加 $user0、$user1、$user2 等,而不必输入所有 10k 个......

显然,仅从数据库中获取名称会容易 1000 倍,但同样,这看起来更难编码。我应该扣紧并抓住它们所有的 ORM 风格吗?

【问题讨论】:

  • 下载 Magento 开源项目并尝试阅读 Varien_Object 类中的代码。它会让你对如何实现你的目标以及谷歌的目的有一个很好的了解。

标签: php class variables dynamic


【解决方案1】:

您可以简单地使用魔法访问器来拥有任意数量的实例属性:

class test{

   private $data;

   public function __get($varName){

      if (!array_key_exists($varName,$this->data)){
          //this attribute is not defined!
          throw new Exception('.....');
      }
      else return $this->data[$varName];

   }

   public function __set($varName,$value){
      $this->data[$varName] = $value;
   }

}

然后你可以像这样使用你的实例:

$t = new test();
$t->var1 = 'value';
$t->foo   = 1;
$t->bar   = 555;

//this should throw an exception as "someVarname" is not defined
$t->someVarname;  

并添加很多属性:

for ($i=0;$i<100;$i++) $t->{'var'.$i} = 'somevalue';

您还可以使用一组给定的属性初始化新创建的实例

//$values is an associative array 
public function __construct($values){
    $this->data = $values;
}

【讨论】:

  • 我只是在补充@ibtarek 的答案。你应该实现这些神奇的方法__set()__get()。您应该阅读 __set() 和 __get() (出于某种原因,SO 仅显示一个下划线)。 __set() 在您第一次将值赋予不存在或不可访问的属性时被调用。 __get() 在您第一次尝试读取不存在或不可访问的属性的值时被调用。您可以在这个 [SO 线程](http:
  • 您从类外部分配值,我需要在类本身中实例化变量,您写的内容会为此工作吗?我试试看.. 不:解析错误:语法错误,意外的 T_FOR,期待 T_FUNCTION
  • 它也应该在类构造函数 $this->{'var'.$i} = 'value' 中使用 "$this" 来工作。
  • 困惑,也许我脑子有问题,但是在构造函数中,你调用的变量还不存在。我的印象是您必须在构造函数之前声明变量。
  • PHP 在设置类属性时并不要求存在类属性,但是当您尝试读取尚未定义的类属性时会触发错误。
【解决方案2】:

试试 $this->{$varname}

class test
{

    function __construct(){

       for($i=0;$i<100;$i++)
       {

         $varname='var'.$i;
         $this->{$varname}=$i;
       }
    }
}

【讨论】:

    【解决方案3】:

    您可以使用变量变量 ($$var) - 一个变量的内容用作另一个变量的名称 (double $$)

    因此不是 $this->varname 而是 $this->$varname

    class test
    {
       for($i=0;$i<100;$i++)
       {
         $varname='var'.$i;
         $this->$varname=$i;
       }
    }
    

    这将动态创建 100 个变量,名称为 $var0, $var1 ...

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-20
      • 2020-03-29
      • 2014-10-06
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多