PHP:call property_exists()函数位于从子类调用的抽象方法中
我想在抽象类中创建setProperties()方法,如下所示:PHP:call property_exists()函数位于从子类调用的抽象方法中,php,abstract-class,abstract,Php,Abstract Class,Abstract,我想在抽象类中创建setProperties()方法,如下所示: public function setProperties($array = null) { if (!empty($array)) { foreach($array as $key => $value) { if (property_exists($this, $key)) { $this->{$key}
public function setProperties($array = null) {
if (!empty($array)) {
foreach($array as $key => $value) {
if (property_exists($this, $key)) {
$this->{$key} = $value;
}
}
}
}
我不太确定的是,我是否能够在继承自这个抽象类的类中使用它来设置继承的属性以及特定于子类的属性
我不确定是否应该在property\u exists()函数中使用任何其他关键字,然后使用$this-也许有一种方法可以使用最新的静态绑定(static::)关键字?
是特定于实例的,因此,property\u exists
可以正确地处理子类。您的代码基本上应该可以工作。想象一下这个简单的例子,输出两次true
:
如您所见,property\u exists()
在子类从父类访问成员时起作用,反之亦然,在父类尝试访问子类的成员时
这是抽象的基本概念之一。你想做的是绝对正确的。不管怎样,如果你遇到了一个错误,那一定是一个小细节,你为什么不试试呢?这应该比在这里提问更快;)但是,是的,您可以按照自己的意愿使用它,并且在处理非静态属性时不需要后期静态绑定。环境还没有准备好-只是想确定-通常会检查而不是询问:)谢谢hek2mgl。我还刚刚读到一条评论,说isset()函数的速度大约是属性_exists()的4倍,所以我可能会将它用作isset($this->{$key})。请注意,即使属性存在但值为NULL,isset也会返回false。出于这个原因,我不会使用isset(因为我知道它更快),但有一点不同<如果属性存在但未初始化或
null
,则code>isset返回false。一切正常-我只需要知道属性是否已物理定义-在这种情况下,值无关紧要。@hek2mgl是的,我是。相当多的库以这种方式工作,提供了一个带有populate
方法的基本模型,该方法的功能与此非常类似。我个人以前也这样做过,尽管在最近的过去,我采取了一种非常不同的方法将数组映射到对象,以便更好地遵循OOP范例。Opps!对不起,我读到“无法正常工作”。。。我的失败;)
abstract class A {
protected $var1;
public function exists1() {
var_dump(property_exists($this, 'var2'));
}
}
class B extends A {
protected $var2;
public function exists2() {
var_dump(property_exists($this, 'var1'));
}
}
$o = new B();
$o->exists1();
$o->exists2();