PHP中类的继承关系

WBOY
Release: 2016-06-23 13:30:38
Original
926 people have browsed it

在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 ?>
Copy after login

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

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

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

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

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

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

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

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

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

如果你这样定义会怎样?

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

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

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

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

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

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

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

 

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

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template