检查子类是否存在变量

时间:2013-11-02 17:51:10

标签: php oop variables exists

我正在为我的父类创建全局setter和getter,因为我不想为每个子类变量创建它们(但我偶尔会覆盖父全局setter / getter)。

我正在使用__call,我正在解析方法名称:

if (strtolower(substr($method, 0, 3)) == "set") {
  $variable = strtolower(substr($method, 3));
}

问题是如何检查是否为子类(扩展主类)设置了$变量;

如果我这样做:

if ($this->$variable)

我想首先检查它是否存在于子类中,然后检查它是否存在于主类上。我只想检查子类,这可能吗?

我知道有父亲::但儿童是否有等同物?

修改: 人们不理解我在问什么。 我知道如何检查属性是否存在。我想知道的是如何检查CHILD类的属性是否存在,而不是MAIN类。 (CHILD课程延伸MAIN)

3 个答案:

答案 0 :(得分:2)

通常情况下有isset()功能,但不适合这种情况。请改用property_exists()

class Foo
{
    public $pub = null;
}

$obj = new Foo();

var_dump(isset($obj->pub), property_exists('Foo', 'pub')); //false, true

- 这是因为如果proprty存在,但是为null,isset()将返回false - 当它不存在时,你将无法区分大小写。

如果它是关于动态属性的 - 那么你应该将对象而不是类名传递给property_exists(),因为属性可能在类中不存在,然后动态地添加到对象。

现在,如果我们说哪个类声明属性,可以在PHP中使用Reflection,如下所示:

class Foo
{
    public $pub = null;
}

class Bar extends Foo
{
}

$obj = new Bar();

$ref = new ReflectionObject($obj);

var_dump($ref->getProperty('pub')->getDeclaringClass()->getName() == 'Bar');//false
var_dump($ref->getProperty('pub')->getDeclaringClass()->getName() == 'Foo');//true

答案 1 :(得分:0)

为什么不使用 isset ??

if (isset($this->$variable))

答案 2 :(得分:0)

这对我有用:

if(property_exists($get_class($this),$variable)){}