【问题标题】:PHP: How to Create Object Variables?PHP:如何创建对象变量?
【发布时间】:2012-01-23 19:06:22
【问题描述】:

所以例如我有这个代码:

class Object{
    public $tedi;
    public $bear;
    ...some other code ...
}

现在你可以看到这个类中有公共变量。我想做的是以动态方式制作这些变量,其功能类似于:

private function create_object_vars(){

   // The Array what contains the variables
   $vars = array("tedi", "bear");

   foreach($vars as $var){
      // Push the variables to the Object as Public
      public $this->$var;
   }
}

那么我应该如何以动态的方式创建公共变量呢?

【问题讨论】:

  • 对不起@Pekka,我虽然很清楚,但我把它附在最后:)
  • 出于好奇,你为什么要这样做?

标签: php class variables object automation


【解决方案1】:
$vars = (object)array("tedi"=>"bear");

$vars = new StdClass();
$vars->tedi = "bear";

【讨论】:

【解决方案2】:

是的,你可以这样做。

你说得非常正确——应该这样做:

private function create_object_vars(){

   // The Array of names of variables we want to create
   $vars = array("tedi", "bear");

   foreach($vars as $var){
      // Push the variables to the Object as Public
      $this->$var = "value to store";
   }
}

注意这里使用了variable variable naming,它可以做一些疯狂和危险的事情!

根据 cmets,这样创建的成员将是公共的 - 我确信有一种创建受保护/私有变量的方法,但它可能并不简单(例如,您可以通过扩展中的 C Zend API 来实现) .

【讨论】:

  • 但是在你的 sn-p 中,没有 public ,它会默认为 public 吗?
  • @CIRK - 是的,以这种方式创建的成员变量默认是公共的(在 PHP 4 中所有成员都是公共的) - 我不确定是否有创建非公共变量的简单方法。
  • 那么变量变量呢?你在这下面是什么意思?
  • 好吧,如果你不分配任何东西,它就不是一个有效的 PHP 语句。如果您想创建变量但将其留空,您可以分配 null
  • 是的,在$this->$var 中,$var 是一个变量变量,因为它使用$var 作为变量名。请注意,您可以将其与 $$var 类似的局部变量一起使用。
【解决方案3】:

您也可以从ArrayObject 派生您的对象。所以它继承了array-behaviour和一些使注入属性更容易的方法。

class YourObject extends ArrayObject {

    function __construct() {
        parent::__construct(array(), ArrayObject::PROPS_AS_ARRAY);
    }

    function create_object_vars() {
        foreach ($vars as $var) {

            $this[$var] = "some value";

        }
    }

属性将同样以$this->var$this["var"] 的形式提供,这可能适合也可能不适合用例。设置属性的替代方法是$this->offsetSet("VAR", "some value");

顺便说一句,变量变量并没有什么坏处。它们是一种适当的语言结构,就像重用 ArrayObject 一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-13
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多