如何制作动态变量

时间:2010-09-01 11:03:40

标签: php oop

<?php
    class test{
        function foo(){
            echo $this->abc;
        }
    }
    $test = new test;
    $test->abc = 'abc';
?>

记得我没有声明变量abc,但我想将$ abc设置为'abc'。这该怎么做 对不起,因为这是一个虚拟问题

5 个答案:

答案 0 :(得分:2)

我会使用PHP支持的魔术方法。基本上我会构建一个构造函数,它以字符串作为参数。

<?php
  class Test {
    public $abc;
    public function __construct($abc) {
      $this->abc = $abc;
    }

    public function __toString() {
      return $this->abc;
    }
  }

然后你可以调用这个类并像这样传递你想要的数据。

$myClass = new Test('abc');
echo $myClass;

当然你必须回应它,以便调用魔术方法__toString()。

答案 1 :(得分:1)

class test{ 
   public function __construct() {
      $this->abc = 'abc'; 
   }

   public function foo(){ 
      echo $this->abc; 
   } 
} 

$test = new test; 
$test->abc = 'abc'; 

当实例化对象时自动执行构造函数时,$ abc将被创建为类test的公共属性

OR

class test{ 
      $this->abc = 'abc'; 

   public function foo(){ 
      if (!isset($this->abc))
         $this->abc = 'abc'; 

      echo $this->abc; 
   } 
} 

$test = new test; 
$test->abc = 'abc'; 

当你调用foo方法时,如果它还不存在,会在类test的实例中创建一个名为$ abc的公共属性

答案 2 :(得分:1)

你测试过吗?虽然我不确定这是个好主意,但它确实有用。

答案 3 :(得分:1)

你可以通过重载php的一些神奇功能来'动态创建'属性和函数。有关详细信息,请参阅this链接。通常,在初始化类时会使用__construct函数来创建变量(如Mark Ba​​ker和MAINERROR已经建议的那样)。这是首选的方式。

但是,您可以覆盖(在您的情况下)__set函数来处理不可访问属性的设置。但请记住,覆盖和使用这些函数(除了__construct)可能会非常快速地混淆。

答案 4 :(得分:0)

实际上,这已经有效了。但这是一种不好的做法。

通常你应该这样做:

class test {
    private $abc;

    public function foo() {
        echo $this->abc;
    }

    public function getABC() {
        return $this->abc;
    }

    public function setABC($abc) {
        // You can also add some additionally checks
        $this->abc = $abc;
    }
}

这使得:

$bar = new test;
$bar->setABC('abc');
$bar->foo();

请记住使您的类属性($ abc)始终保持私有或受保护。它的封装使得OOP如此强大。

如果你想使用动态变量名,那么你要设置$ this-&gt; cba而不是$ this-&gt; abc,你应该使用魔术方法__set和__get

有关魔术方法的更多信息,请点击此处:

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