我这里只有一个简单的问题。。。我正在为我的网站开发一个论坛应用程序,在更新我使用的一些旧方法时(我的旧代码很糟糕),我遇到了OOP设备,这不是第一次了。
我的系统使用了相当多的类,并且一遍又一遍地为它们重新定义相同的函数,所以我决定创建一个承载该功能的基类。
我一直在尝试在基类上使用require()
,然后扩展它的类…
<?php
require(//path to base class);
class User extends BaseClass {
// code
}
?>
但我不知道如何检查它是否存在,而且它似乎并没有继承基类的唯一函数。。。
public function __get($what) {
if(property_exists($this, $what)) {
return $this->{$what};
} else {
return null;
}
}
因为当我尝试从User类(例如$user->Username
)中检索变量时,它会返回NULL
。该变量在类中标记为private
,但在我尝试进行继承之前,这不是问题。
听起来你想在父类中查找变量,但不想使用getter方法。标记这些变量protected
确实会允许你的子类访问这些属性,但如果你想让基类在设置/获取之前强制处理,标记属性protected
不会减少。
在您的情况下,听起来您正在将变量protected
标记为一种变通方法。但是,您仍然可以在基类中使用private
变量,并允许在子类中访问它们,如下所示:
class BaseClass
{
private $strValue = "We the people....";
public function __get($what)
{
if(isset($this->{$what})) {
return $this->{$what};
}
return null;
}
}
class ChildClass extends BaseClass
{
private $intValue = 255;
public function __get($what)
{
if(isset($this->{$what})) {
return $this->{$what};
} else if(parent::__get($what) != null) {
return parent::__get($what);
}
return null;
}
}
//Try it out
$child = new ChildClass();
var_dump($child->strValue); //"We the people...."
var_dump($child->intValue); //255
在本例中,BaseClass
使用__get()
魔术方法查找自己的属性,而ChildClass
会覆盖它来执行同样的操作。在ChildClass
中,如果它找不到请求的属性,那么它会转移到父级的版本。
只要你不重写你的属性,你就可以在整个过程中使用私有变量,并访问它们,就好像它们在类范围之外是公共的一样。
只需使用class_exists()以确保您的类在那里。