当前位置:  开发笔记 > 编程语言 > 正文

动态类变量

如何解决《动态类变量》经验,为你挑选了2个好方法。

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

public class TestClass {
    private $data = array();

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

$this->data数组始终是一个关联数组,但它们的键从一个类更改为类.有没有访问任何可行的方法, $this->data['firstValue']$this->firstValue而无需定义的联系?

如果是的话,它有什么缺点吗?

或者是否存在一种静态方法来定义链接,如果$this->data数组不包含该键,则不会爆炸?



1> Jan Hančič..:

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

你想要的是"__get"方法.您可以在链接上找到所需的示例.



2> David Stockt..:

使用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;
    }
}

使用magic __get,__set__isset构造函数将允许您控制在类上设置变量的方式,同时仍将所有值存储在单个数组中.

希望这可以帮助 :)

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有