第十一节:PHP类的继承和受保护的作用域

PHP面向对象编程基础

PHP类的继承,大家所熟知的一个程序设计特性,PHP的对象模型也使用了继承,继承将会影响到类与类,对象与对象之间的关系,这节课我将向你展示如何创建子类继承父类的属性和方法的。

什么是PHP类的继承

什么是PHP类的继承

什么是PHP类的继承

可以从我们人类角度来思考,如该两个黄色人种结婚,生出的小孩肯定也是和头发和黄皮肤。在OOP中,我们可以用一个类并从中创建一个子类。当你从父类创建子类时,子类将继承父类的所有属性和方法。简单举个例子,上节课的源码复制到class_inheritance_and_protected_scope文件夹,把vendor名修改为Jiexi,因为我是在jiexi工作的,namespace也要改变,修改好了之后,访问index.php输出结果如下:

显示User类和Validator类调用路劲是Jiexi\App\,现在开始编写继承程序,我想在Jiexi创建一个Administrator.php文件处理特殊类型的用户:

让我们回到浏览器访问index.php,有一个对象Acme\App\Administrator,包含email,password,fillable array等等,当我们创建我们的administrator类extend user类,administrator类继承user类的属性和方法。如果是这样的话,我们是不是可以让管理员用Login的方法登录,毕竟这是一个在用户或父类中定义的方法,修改index.php代码:

正如我们想要的index.php应该输出login方法里面return的内容:

但是如果我想从另一个命名空间扩展这个类呢?比如Library文件夹的User.php,现在我们把Jiexi/App/Administrtor.php修改:

回到index.php看看,报错:

从上面输出的信息我们看到PHP正试图加载Jiexi\App\Jiexi\Library\User.php,就像我们之前看到的那样,是因为它搜索的是命名空间的,现在我们都准备好了Jiexi\App,如果我们在这条路径前面加了一个反斜杠:

还报错Login方法,因为这个方法不存在,回到父类,Library/user,把login方法复制到里面。现在,我们有一个public login方法被定义在父类中定义,然后我们有一个未定义公共方法的子类。但是如果我们在这里实例化这个类,并且从父类调用公共方法,那么实际上就是这样工作的。

PHP类的继承-详谈类受保护的作用域

PHP类的继承-详谈类受保护的作用域

PHP类的继承-详谈类受保护的作用域

现在我们开始学习以下private method,回到Library/User.php整理下代码:

那么private关键字会使这个方法在类之外是不可用的,但是它的子类呢?刷新index.php:

输出信息来看子类是不能够访问的,相反,我们使用另一个范围关键字,那个被称为保护protected:

刷新index.php仍然报错:

因为在类外没有这个东西,所以还是会抛出错误,你会发现我们现在已经不在类上了,而且我们正试图访问这个方法,而且确实会导致一个致命的错误。那么,如果我在Administrator.php创建一个公共方法会发生什么事情,得到登录,然后在里面,如果我要返回一个值,这个值将是这个登录的结果:

因为library/user的方法保护,但是可以被子类访问,所以我们可以在administrator.php调用,回到index.php检查是否工作:

刷新index.php非常棒,返回来自User类的登录方法正是我们想要的结果。

让我们回到Library/User.php,修改为private:

刷新index.php返回报错信息:

快速回顾PHP类的继承和受保护的作用域

快速回顾PHP类的继承和受保护的作用域

快速回顾PHP类的继承和受保护的作用域

子类的可见性范围如下所示,私有属性或方法只能访问它所在的类,而不能访问任何子类或外部类。保护属性或方法对于它所在的类是可见的。对于子类,但是外面看不到,然后公共属性或方法对于类本身,任何子类和外部范围都是可见的,代码如下:

好的,现在让我们回到第一个场景,我们的Administrator类就像这样扩展了Jiexi应用程序User类。现在你可能想知道为什么在全局上你想扩展一个有change类?那么答案是 在关键字extend中有疑问。你实际上可以扩展原始父类的属性和方法。所以,让我们回过头来打开我们原来的父类,代码如下:

我们这里有几个属性。它们现在是私有的。让我们保护它们,以便它们实际上可以通过我们的子类访问。现在我们可以创建一个新属性,让它成为一个布尔值,它将被称为isAdmin。现在这将告诉我们的应用程序我们是否正在处理具有Administrator权限的人。所以,对于我们的普通用户,我们只是将其设置为false,然后对于Administrator用户,然后我们可以做类似这样的事情,代码如下:

我们也许可以创建一个像这样的构造函数,也许可以设置这是管理员为true.像这样或者也许有一些东西,你希望Administrator能够做到普通用户不能做的,例如我不知道可能对于reportForDuty方法或某事的报告。好吧,这对于类继承和特定范围都是如此:

我将在下一课中看到你,我们将仔细研究一下类继承但是从一个稍微不同的角度。

下载本节课完整源码

接近10年的互联网从业经验,精通Scrum敏捷软件开发的方法,从事互联网产品设计,开发,测试,运营,案例不少于20个,发现自己最喜欢的工作是做外贸营销,外贸SEO,特别喜欢谷歌优化。从2017年3月开始坚持在群161510483直播谷歌SEO和WEB前端开发技术,只要加进来坚持学习零基础也能够学会。

Last modified: 2019年1月21日

Previous Story

PHP面向对象编程基础

第十节:使用PSR-0自动加载PHP

PSR-0自动加载:php业界提出的一个大家共同遵循的规范,很多php框架都遵循PSR-0规范, PSR是一套关于代码结构和格式的标准.

...

Next Story

PHP面向对象编程基础

第十二节:PHP子类重写父类方法

子类重写父类方法:面向对象编程中的一种语言特性方法重写,允许子类或子类提供已由其一个超类或父类提供的方法的特定实现.

...