PHP中的受保护函数
这可能看起来很简单,我相信是的,我只是不明白 我知道PHP类中受保护的属性只能在类本身和继承的类中访问。以下是我目前的代码:PHP中的受保护函数,php,Php,这可能看起来很简单,我相信是的,我只是不明白 我知道PHP类中受保护的属性只能在类本身和继承的类中访问。以下是我目前的代码: class q { public $publicQ = "This is a public property"; protected $protectedQ = "This is a proected property"; public function displayProtected() { echo $this->
class q {
public $publicQ = "This is a public property";
protected $protectedQ = "This is a proected property";
public function displayProtected() {
echo $this->protectedQ;
}
}
$q = new q;
echo $q->publicQ; #prints "This is a public property"
echo $q->protectedQ; #nothing
$q->displayProtected();
我已经阅读了文档,查看了其他答案,但这个概念并没有让我满意。受保护的属性实际上做什么,为什么我们要使用它们,为什么我的示例不起作用?受保护的函数使类更灵活
设想一个必须在某处加载一些数据的类。它有一个默认实现,从文件中读取数据。如果要使用同一个类,但要更改其获取数据的方式,可以创建子类并重写getData()函数。受保护的函数使类更灵活
设想一个必须在某处加载一些数据的类。它有一个默认实现,从文件中读取数据。如果要使用同一个类,但要更改其获取数据的方式,可以创建子类并重写getData()函数。受保护的字段可以继承,但不能像
echo$q->protectedQ代码>
私有字段既不能显示也不能继承。受保护的字段可以继承,但不能像echo$q->protectedQ代码>
私有字段既不能显示也不能继承。与公共方法的唯一真正区别在于,正如您所发现的,受保护的函数只能从继承树中的类或其他类中访问
如果函数不打算从类外部使用,则不需要将其声明为受保护。
这是一种语言特性,纯粹是为了使代码更易于理解(更易于阅读),并且不易受到bug和误用的影响。只有使用公共方法才能完成任何事情(以功能的形式)
如果您与其他人共享代码,或者它是某种库,那么它非常有用
对于PHP,使用PHP的magic getter和setter函数()时有一个特别有用的例子
例如,您可以使用magic函数“保护”您的变量并捕捉调用。
如果您已经发布了一个带有变量的类,并且您后来决定在返回变量之前在类内部进行一些预处理,那么它非常有用。与公共方法的唯一真正区别是,正如您所发现的,受保护的函数只能从类内或继承树中的另一个类访问
如果函数不打算从类外部使用,则不需要将其声明为受保护。
这是一种语言特性,纯粹是为了使代码更易于理解(更易于阅读),并且不易受到bug和误用的影响。只有使用公共方法才能完成任何事情(以功能的形式)
如果您与其他人共享代码,或者它是某种库,那么它非常有用
对于PHP,使用PHP的magic getter和setter函数()时有一个特别有用的例子
例如,您可以使用magic函数“保护”您的变量并捕捉调用。
如果您发布了一个包含变量的类,并且以后决定在返回变量之前在该类内部执行一些预处理,则该方法非常有用。您使用受保护/私有方法来包含功能,以使代码更易于阅读,并防止在公共方法中重复相同的功能
使属性受保护可以防止对象从外部被修改,除非您通过setter提供了访问权限
您可以更好地控制对象的使用方式。您可以使用受保护/私有方法来包含功能,以使代码更易于阅读,并防止在公共方法中重复相同的功能
使属性受保护可以防止对象从外部被修改,除非您通过setter提供了访问权限
您可以更好地控制对象的使用方式。将您的公共属性和方法视为您向外部世界公开的API,将私有/受保护的属性和方法视为您的类的“内部工作”,外部世界不仅不应该关注,而且也不应该干扰它们
下面是一个强制性的坏车类比:
在Car
类中公开的方法可以是driveForward()
和drivebackward()
。它们都会使用一个名为transmitTheDriveToTheWheels()
的方法,但它不应该与汽车用户有关,也不应该被他们访问,因此您可以通过将其设置为私有来“隐藏”它
您的汽车将具有发动机
属性。你肯定不希望有人能通过$car->engine=$kitty,用一只可爱的小猫来替换引擎代码>这样您就可以将引擎设置为私有
最后,您的汽车将具有里程属性。您希望用户能够读取里程,但不能修改里程。因此,您将里程数
设置为私有,并公开一个公共的getmiliness()
方法
现在,您是想使用private还是protected来封装类的“内部”内容,这取决于您是否希望扩展该类。将公共属性和方法视为您向外界公开的API,将私有/受保护的属性和方法视为“内部工作”外部世界不仅不应该被关注,而且也不应该被扰乱
下面是一个强制性的坏车类比:
在Car
类中公开的方法可以是driveForward()
和drivebackward()
。它们都会使用一个名为transmitHyderivetothewheels()的方法
public $a = '1';
protected $b = '2';
public function __get($name) {
return $this->{$name}.' (protected)';
}
$obj->a; //1
$obj->b; //2 (protected)