Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何制作动态变量_Php_Oop - Fatal编程技术网

Php 如何制作动态变量

Php 如何制作动态变量,php,oop,Php,Oop,请记住,我没有声明变量abc,但我想将$abc设置为'abc'。如何做到这一点 抱歉,因为这是一个愚蠢的问题 <?php class test{ function foo(){ echo $this->abc; } } $test = new test; $test->abc = 'abc'; ?> 当实例化对象时自动执行构造函数时,$abc将被创建为类测试的公共属性 或 当您调用f

请记住,我没有声明变量abc,但我想将$abc设置为'abc'。如何做到这一点 抱歉,因为这是一个愚蠢的问题

<?php
    class test{
        function foo(){
            echo $this->abc;
        }
    }
    $test = new test;
    $test->abc = 'abc';
?>
当实例化对象时自动执行构造函数时,$abc将被创建为类测试的公共属性

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

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


调用foo方法时,将在类test的实例中创建一个名为$abc的公共属性,如果它不存在,我将使用PHP支持的神奇方法。基本上,我会构建一个以字符串作为参数的构造函数

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

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

      echo $this->abc; 
   } 
} 

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

当然,您必须回显它,以便调用magic方法uu toString()。

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

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

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

      echo $this->abc; 
   } 
} 

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

当然,您必须回显它,以便调用神奇的方法uu toString()。

您测试过它吗?虽然我不确定这是否是一个好主意,但它确实有效。

你测试过它吗?虽然我不确定这是否是一个好主意,但它仍然可以工作。

您可以通过重载php的一些神奇函数来“动态创建”属性和函数。有关更多信息,请参阅链接。在初始化类时,通常会使用_构造函数来创建变量(如Mark Baker和MAINERROR已经建议的)。这是我的首选方式


但是,您可以覆盖uu set函数来处理不可访问属性的设置。但是请记住,覆盖和使用这些函数(除了_构造)会很快变得非常混乱。

您可以通过重载php的一些神奇函数来“动态创建”属性和函数。有关更多信息,请参阅链接。在初始化类时,通常会使用_构造函数来创建变量(如Mark Baker和MAINERROR已经建议的)。这是我的首选方式


但是,您可以覆盖uu set函数来处理不可访问属性的设置。但是请记住,覆盖和使用这些函数(除了_构造)可能会很快变得非常混乱。

实际上,这已经起作用了。但这是一种糟糕的做法

通常你应该这样做:

$myClass = new Test('abc');
echo $myClass;
这使得:

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;
    }
}
记住要使类属性($abc)始终是私有的或受保护的。正是封装使OOP如此强大

如果您想使用动态变量名,那么您不需要设置$this->abc而是要设置$this->cba,您应该使用神奇的方法\uuuu set和\uu get

有关魔术方法的更多信息,请访问:

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

实际上,这已经起作用了。但这是一种糟糕的做法

通常你应该这样做:

$myClass = new Test('abc');
echo $myClass;
这使得:

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;
    }
}
记住要使类属性($abc)始终是私有的或受保护的。正是封装使OOP如此强大

如果您想使用动态变量名,那么您不需要设置$this->abc而是要设置$this->cba,您应该使用神奇的方法\uuuu set和\uu get

有关魔术方法的更多信息,请访问:

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

我不明白你的问题。您已经将
$abc
设置为“abc”,是吗?您是否试图在类
测试中创建一个名为“abc”的动态命名变量?变量始终是动态的。否则它将是一个常数。也许你在寻找属性重载:漂亮的阿凡达tho:)我不明白你的问题。您已经将
$abc
设置为“abc”,是吗?您是否试图在类
测试中创建一个名为“abc”的动态命名变量?变量始终是动态的。否则它将是一个常量。也许你在寻找属性重载:漂亮的阿凡达tho:)