property_exists不适用于动态生成的类属性

时间:2014-02-05 02:47:52

标签: php

我有以下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对这种情况不起作用。

有什么方法可以让它发挥作用吗?

2 个答案:

答案 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";