PHP中类的继承关系

简介: 原文:PHP中类的继承关系在PHP中,我时常会写一个类,类写了一个共用方法,然后让子类去继承就能得到相应的功能。假设大致有这么一个父类: 1 然后呢,搞一个子类去继承他: 1 这时候就会输出我是父类的构造方法!和我是子类的构造方法~。
原文: PHP中类的继承关系

在PHP中,我时常会写一个类,类写了一个共用方法,然后让子类去继承就能得到相应的功能。假设大致有这么一个父类:

 1 <?php
 2 class Father{
 3 
 4     public function __construct(){
 5         echo '我是父类的构造方法!';
 6     }
 7 
 8     protected function say($str = 'Hello World!'){ 9 echo '说了一句话:' . $str; 10  } 11 } 12 ?>

然后呢,搞一个子类去继承他:

1 <?php
2 
3 class chirld extends Father{
4 
5     public __construct(){
6         echo '我是子类的构造方法~';
7     }
8 }

此时你实例化子类,结果将会是我是子类的构造方法~! 
当然,因为继承关系,所以子类是可以调用父类的say()方法的。

如果你想实现父类的构造方法,然而你又想实现子类的构造方法,你可以这样子去做:

 1 <?php
 2 
 3 class chirld extends Father{
 4 
 5     public __construct(){
 6         parent::__construct();
 7         echo '我是子类的构造方法~';
 8  } 9 } 10 11 ?>

这时候就会输出我是父类的构造方法!我是子类的构造方法~

假设你在子类中定义了这么一个方法:

1     protected function say($str = ''){
2         echo '我是子类的say';
3     }

那么,你此时从父类继承下来的sys()方法将会被重写,所以调用后输出的结果就是:我是子类的say

如果你这样定义会怎样?

1     public function say($str = ''){
2         echo '我是子类的方法哦~';
3     }

这样的写法还是可以的。PHP跟其他强类型语言不同的地方是,PHP重写方法允许你对重写的方法”向上公有化”,而不允许你”向下私有化”,就比如在这里你定义为private是肯定会报错的,而像C++这样语言确恰恰相反。

PHP的对于这种情况的思想就是,你父亲给了你受保护级别的遗产,此时在你手上是保护级别的,你父亲允许你对对别人分享,也就是public,但不允许你自己藏起来,也就是private,自己独吞肯定不行的。

此时你肯定会问,那么父类的say()设置为private会怎样? 
结果不会怎样,就是父类已经私有化了,子类根本继承不到,所以你在子类中的say()方法随你这么定都可以。

还有一个问题,就是父类已经定义了sys()中带可选参数,那么,在子类中的你像下面这样无参数定义会怎样呢?

    public function say(){
        echo '哈哈。我没有参数了耶~';
    }

结果还是可以正常运行的,只不过会有 E_STRICT级的提示。原因在于PHP标准就是参数的数量必须跟父类对齐,当然,可以在php.ini中进行错误级别设置。

 

以上如果有什么错误的地方,还请及时纠正,谢谢。

目录
相关文章
|
2月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
21 0
|
9月前
|
XML 移动开发 Shell
CTF中常用的php原生类总结
CTF中常用的php原生类总结
129 0
|
10月前
|
存储 安全 搜索推荐
php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)
php对接百度网盘开发平台API开发高级实战案例解析:(环境部署、php封装类、Access Token获取、预上传、分片上传)
476 0
|
10月前
|
安全 关系型数据库 MySQL
使用php解压缩ZipArchive类实现后台管理升级的解决方案
使用php解压缩ZipArchive类实现后台管理升级的解决方案
58 0
|
10月前
|
关系型数据库 MySQL 程序员
漏刻有时操作数据php类记录及筛选条件的写法
漏刻有时操作数据php类记录及筛选条件的写法
41 1
|
10月前
|
定位技术 PHP
php基于百度地图封装的对象类实现计算地图上两点间的距离和地理编码
php基于百度地图封装的对象类实现计算地图上两点间的距离和地理编码
60 0
|
10月前
|
PHP
php计算两个坐标点之间的距离的类
php计算两个坐标点之间的距离的类
72 0
|
12月前
|
安全 PHP
|
SQL PHP 数据库
PHP:ThinkPHP5数据库操作增删改查-Db类
PHP:ThinkPHP5数据库操作增删改查-Db类
192 0
PHP:ThinkPHP5数据库操作增删改查-Db类
PHP中为什么静态类是不能被实例化的类?底层原理是什么?
PHP中为什么静态类是不能被实例化的类?底层原理是什么?