您的位置:首页 > 编程语言 > PHP开发

PHP中类的继承关系

2015-07-18 16:15 471 查看
在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中进行错误级别设置。

以上如果有什么错误的地方,还请及时纠正,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: