1

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

我正在使用 __call 并解析方法名称,如下所示:

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

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

如果我做:

if ($this->$variable)

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

我知道有 parent:: 但是有没有孩子的等价物?

编辑:人们不明白我在问什么。我知道如何检查该属性是否存在。我想知道的是如何检查 CHILD 类的属性是否存在,而不是 MAIN 类。(儿童类扩展主要)

4

3 回答 3

2

通常情况下有isset()函数,但不适合这种情况。使用property_exists()代替:

class Foo
{
    public $pub = null;
}

$obj = new Foo();

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

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

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

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

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
于 2013-11-02T17:55:02.953 回答
0

为什么不利用isset??

if (isset($this->$variable))
于 2013-11-02T17:52:11.940 回答
0

这对我有用:

if(property_exists($get_class($this),$variable)){}
于 2018-02-07T20:10:47.750 回答