我正在为我的父类创建全局setter和getter,因为我不想为每个子类变量创建它们(但我偶尔会覆盖父全局setter / getter)。
我正在使用__call,我正在解析方法名称:
if (strtolower(substr($method, 0, 3)) == "set") {
$variable = strtolower(substr($method, 3));
}
问题是如何检查是否为子类(扩展主类)设置了$变量;
如果我这样做:
if ($this->$variable)
我想首先检查它是否存在于子类中,然后检查它是否存在于主类上。我只想检查子类,这可能吗?
我知道有父亲::但儿童是否有等同物?
修改: 人们不理解我在问什么。 我知道如何检查属性是否存在。我想知道的是如何检查CHILD类的属性是否存在,而不是MAIN类。 (CHILD课程延伸MAIN)
答案 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)){}