动态类变量
时间:2020-03-06 14:25:41 来源:igfitidea点击:
PHP是否具有自动生成的类变量的方法?我想我以前看过类似的东西,但不确定。
public class TestClass { private $data = array(); public function TestClass() { $this->data['firstValue'] = "cheese"; } }
$ this-> data数组始终是一个关联数组,但是它们的键因类而异。有没有可行的方法可以从$ this-> firstValue中访问$ this-> data ['firstValue']`而无需定义链接?
如果是的话,这有没有不利之处?
还是有一种静态方法来定义链接,如果$ this-> data数组不包含该键,该方法就不会爆炸?
解决方案
看到这里:http://www.php.net/manual/en/language.oop5.overloading.php
我们想要的是" __get"方法。链接上有我们需要的示例。
使用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构造函数,我们可以控制如何在类上设置变量,同时仍将所有值存储在单个数组中。
希望这可以帮助 :)