代码之家  ›  专栏  ›  技术社区  ›  Oli

动态类变量

  •  6
  • Oli  · 技术社区  · 17 年前

    PHP有自动生成类变量的方法吗?一、 认为 我以前见过这样的东西,但我不确定。

    public class TestClass {
        private $data = array();
    
        public function TestClass() {
            $this->data['firstValue'] = "cheese";
        }
    }
    

    这个 $this->data 数组始终是一个关联数组,但它们的键因类而异。有什么可行的方法可以进入吗 $this->data['firstValue'] 来自 $this->firstValue 而不必定义链接?

    如果是这样,它有什么缺点吗?

    或者,是否有一种静态方法来定义链接,这种方法在以下情况下不会爆炸 $这个->数据 数组不包含该键?

    2 回复  |  直到 13 年前
        1
  •  12
  •   Jan Hančič    17 年前

    请看这里: http://www.php.net/manual/en/language.oop5.overloading.php

    你想要的是“__get”方法。链接上有一个你需要的示例。

        2
  •  7
  •   A J    10 年前

    使用PHP5“魔法” __get() 方法。其工作原理如下:

    public class TestClass {
        private $data = array();
    
        // Since you're using PHP5, you should be using PHP5 style constructors.
        public function __construct() {
            $this->data['firstValue'] = "cheese";
        }
    
        /**
         * This is the magic get function.  Any class variable you try to access from 
         * outside the class that is not public will go through this method.  The variable
         * name will be passed in to the $param parameter.  For this example, all 
         * will be retrieved from the private $data array.  If the variable doesn't exist
         * in the array, then the method will return null.
         *
         * @param string $param Class variable name
         *
         * @return mixed
         */
        public function __get($param) {
            if (isset($this->data[$param])) {
                return $this->data[$param];
            } else {
                return null;
            }
        }
    
        /**
         * This is the "magic" isset method.  It is very important to implement this 
         * method when using __get to change or retrieve data members from private or 
         * protected members.  If it is not implemented, code that checks to see if a
         * particular variable has been set will fail even though you'll be able to 
         * retrieve a value for that variable.
         *
         * @param string $param Variable name to check
         * 
         * @return boolean
         */
        public function __isset($param) {
            return isset($this->data[$param]);
        }
    
        /**
         * This method is required if you want to be able to set variables from outside
         * your class without providing explicit setter options.  Similar to accessing
         * a variable using $foo = $object->firstValue, this method allows you to set 
         * the value of a variable (any variable in this case, but it can be limited 
         * by modifying this method) by doing something like:
         * $this->secondValue = 'foo';
         * 
         * @param string $param Class variable name to set
         * @param mixed  $value Value to set
         * 
         * @return null
         */
        public function __set($param, $value) {
            $this->data[$param] = $value;
        }
    }
    

    使用魔法 __get , __set ,以及 __isset 构造函数将允许您控制如何在类上设置变量,同时仍将所有值存储在单个数组中。

    希望这能有所帮助:)

    推荐文章