动态变量创建,为什么甚至可能?

时间:2014-12-27 19:15:20

标签: php oop

我想知道为什么在PHP中这种行为是可能的:

class Quick {
    public function add_variable($key,$value) {
        $this->some[$key] = $value;
    }
    public function get_variable($key) {
        return (isset($this->some[$key]))?$this->some[$key]:null;
    }
 }

 $Quick = new Quick();
 $Quick->add_variable("test1", 20);
 var_dump($Quick->get_variable("test1"));

 // Output: int(20)

我对这种行为有一些问题,我想知道为什么会这样?有什么用途。

我知道在PHP中,varibles不必声明,甚至不需要声明数组,并且:$tar["key"] = "some";完全没问题。 但是在使用Objects时,我们会声明这些变量及其访问权限。 这里发生了什么?公众清楚......我有点困惑。任何见解?

2 个答案:

答案 0 :(得分:0)

为什么呢?因为它是这样设计的?动态定义的属性将始终是公共的。

有什么用?一个例子是数据模型,其中可以动态地为每个列定义属性,而无需事先定义每个列。

请注意,您只是将一个属性some创建为数组,而test1只是一个关联数组元素;并且您可以使用魔术add_variable()get_variable()

来实施__get()__set()方法

答案 1 :(得分:0)

当您希望索引数据以便快速检索时,能够动态创建关联数组非常有用。下面的示例创建了一个索引数组,用于缓存资源昂贵的函数的结果。

class Quick {
    public function add_variable($key,$value) {
        $this->some[$key] = $value;
    }
    public function get_variable($key) {
        return (isset($this->some[$key]))?$this->some[$key]:null;
    }
    public expensive_calculation($key) {
        //if the results exist in cache, return from cache
        $result = $this->get_variable($key);
        if(!is_null($result)) {
            return $result;
        }

        //do expensive calculation & store in $result
        $this->add_variable($key,$result);
        return $result;
    }    
 }