类构造函数创建具有变量名称的新类字段?

时间:2015-05-31 19:59:18

标签: php oop properties

我试图通过PHP 5.5.13的构造函数初始化一个类,但是得到了一些奇怪的结果。设置如下:

class foo{
     public $bar;
     public $top;
     public $bot = array();

     function __construct($bar, $top){
        $this->$bar = $bar;
        $this->$top = $top;
     }
}

$phonebook = array();
$user_input = $_POST['query'];
if(/* regex match */){
   foreach($valid_input[0] as $arr){
      $name_and_number = explode(" ", $arr);
      $phonebook[] = new foo($name_and_number[0], (int) $name_and_number[1]); //e.g. Bob, 123
      var_dump($phonebook[count($phonebook)-1]);
   }
}

现在是奇怪的部分,但是电话簿的var_dump返回:

object(foo)#1 (5) { ["bar"]=> NULL ["top"]=> NULL ["bot"]=> array(0) { } 
["Bob"]=> string(3) "Bob" ["123"]=> int(123) }

运行:

echo "$phonebook[0]->$bar";
echo "$phonebook[0]['Bob']"; //Since a Bob field apparently exists?
echo "$phonebook[0]->$Bob";  //Just to test if maybe a $Bob variable has been declared?

全部返回空白页面。我在这里不知所措。我的构造函数设置是否很奇怪?或者我尝试访问变量的方式?

2 个答案:

答案 0 :(得分:3)

你需要做的就是摆脱第二个$符号

class foo{
     public $bar;
     public $top;
     public $bot = array();

     function __construct($bar, $top){
        $this->bar = $bar;
        $this->top = $top;
     }
}

您看到“怪异”结果的原因是因为$bar$top的值是动态评估的,并将用于创建新的命名属性。在您的情况下,导致名为“Bob”和“123”的属性

答案 1 :(得分:2)

问题在于以下几点:

$this->$bar

Bob指的是以的名称命名的属性。因此,如果您传递名称Bob,则实际上将属性'Bob'设置为bar

您的意图当然是设置属性$。为此,请删除$this->bar = $bar; 符号。属性必须省略:

echo "$phonebook[0]->$bar"

所以它与构造函数无关,它只是你在任何地方使用属性的方式。在构造函数中甚至是类外的方法。 echo "$phonebook[0]->bar";也应为NetworkImageView

就我个人而言,我认为这是一种奇怪而反直觉的语法,但我曾经用PHP afficionado对它进行了严肃的斗争,所以我不敢再提起它了。忍住吧。 ;)