我有以下PHP类,其属性是在运行时动态生成的。
<?php
class ParamEx
{
private $params = array();
public function __get($name) {
return $this->params[$name];
}
public function __set($name, $value) {
$this->params[$name] = $value;
}
};
$paramEx = new ParamEx();
$property = "dummy_property";
$paramEx->$property = "123";
// "123" printed
echo $paramEx->$property . "\n";
// Nothing printed
echo property_exists($paramEx, $property) . "\n";
我意识到property_exists
对这种情况不起作用。
有什么方法可以让它发挥作用吗?
答案 0 :(得分:4)
如果我是你,我会像这样在这个类中添加一个公共方法:
public function propertyExists($property) { return property_exists($this, $property) || isset($this->params[$property]); }
如果你有很多像这样的类(并且你使用的是PHP 5.4或更高版本),你可能会考虑将这个函数作为Trait来使用,你可以在所有这些类中使用它。
答案 1 :(得分:3)
您可以重载__isset
并使用isset($paramEx->$property)
,因为您已经超载__get
和__set
:
class ParamEx
{
private $params = array();
public function __get($name) {
return $this->params[$name];
}
public function __set($name, $value) {
$this->params[$name] = $value;
}
public function __isset($name) {
return isset($this->params[$name]);
}
};
然后使用:
echo isset($paramEx->$property) . "\n";
而不是:
// Nothing printed
echo property_exists($paramEx, $property) . "\n";