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->

这可能看起来很简单,我相信是的,我只是不明白

我知道PHP类中受保护的属性只能在类本身和继承的类中访问。以下是我目前的代码:

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)