【问题标题】:How to set class variables dynamically?如何动态设置类变量?
【发布时间】:2013-05-15 09:31:49
【问题描述】:

考虑以下代码:

class Project
{
    public $ProjectID;
}    
class Work
{
    public $WorkID;
}    

public function insert($pData, $tableName)
{
//generate insert here
    $pData->{$tableName . 'ID'} = $result->getId();
}

$p = new Project();
$w = new Work();
insert($w, 'Work');
insert($p, 'Project');

echo $p . ' -- ' . $w;

现在我将如何以 动态 方式设置变量?我正在构建一个数据层。 $pData->{$tableName . 'ID'} 似乎不起作用...

【问题讨论】:

  • 那会是哪个变量?
  • 对于$w,它将是$w.WorkID = 7,对于$p,它将是$p.ProjectID = 7。
  • 我不认为你所说的“动态”是什么意思,或者你在哪里/为什么想出这个函数 setToSeven,或者你需要用“动态”解决什么问题。
  • 我会更倾向于使用interfaces 并标准化属性的名称...这样我就可以让setToSeven() 只对$object->id 进行操作,而不是使用不同的属性名字。
  • OP 希望在运行时动态创建属性(ala 反射)。可能重复:stackoverflow.com/questions/829823/…

标签: php


【解决方案1】:

那么,你想动态调用setter吗?

$y = new stdClass();
$y->prop1 = "something";

$targetProperty = "prop1";
$y->$targetProperty = "something else";
echo $y->prop1;

//Echos "something else"

这就是你要找的东西?

【讨论】:

    【解决方案2】:

    这就是你要找的东西:

    public function set_to_seven($p_data, $name)
    {
        $name = $name . 'ID';
        $p_data->$name = 7;
    }
    

    属性名称可以是变量。就像函数一样:

    $p = 'print_r';
    $p('StackOverflow');
    

    供将来参考:如果您需要这个静态的,您正在寻找可变变量,

    public function set_to_seven($p_data, $name)
    {
        $name = $name . 'ID';
        $p_data::$$name = 7;
    }
    

    【讨论】:

      【解决方案3】:

      您可以像访问类中的任何其他定义一样通过访问公共属性来设置它们。

      $p = new Project();
      $p->ProjectID = 5;
      echo $p->ProjectID; // prints 5
      

      http://php.net/manual/en/language.oop5.visibility.php

      【讨论】:

      • 是的,我知道,但我需要动态设置属性。所以我不知道对象的类型,我想要一个设置键的通用函数。我正在构建一个对象关系映射器:)
      • 啊,这样的话,这个问题是重复的。请参阅我对您的问题的评论。
      【解决方案4】:

      这对我有用。

      class Project {
          public $ProjectID;
      }
      
      function setToSeven($pData, $name) {
          $pData->{$name . "ID"} = 7;
      }
      
      $p = new Project();
      setToSeven($p, 'Project');
      
      echo $p->ProjectID;
      

      您只需要回显变量或在类上设置一个 toString 函数来回显该类。 To String 是这样工作的

      class Project {
          public $ProjectID;
          public function __toString(){
              return (string)$this->ProjectID;
          }
      }
      
      function setToSeven($pData, $name) {
          $pData->{$name . "ID"} = 7;
      }
      
      $p = new Project();
      setToSeven($p, 'Project');
      
      echo $p;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-28
        • 2016-10-23
        • 1970-01-01
        • 2019-01-29
        • 2019-08-31
        • 1970-01-01
        • 2017-01-12
        • 2017-08-08
        相关资源
        最近更新 更多