继承、访问控制符、子类重载父类的方法、子类调用父类的方法

来源:互联网 发布:java初级编程题目 编辑:程序博客网 时间:2024/05/14 20:06

继承

继承性也是面向对象程序设计中的重要特性之一,在面向对象领域有着极其重要的角色,它是指建立一个新的派生类,从先前定义的类中继承数据和函数,而且可以重新定或加进新的数据和函数,从而建立了类的层次或等级关系。但在php中只能使用单继承,就是说一个类只能直接从另一个类中继承数据,但是一个类可以有多个子类。

在软件开发中,类的继承性使所建立的软件具有开放性、可扩充性。这是信息组织与分类的行之有效的方法。它简化了对象、类的创作工作量,增加了代码的可重用性。采用继承性,提供了类的规范的等级结构。通过类的继承关系,使公共的特性能够共享,提高了软件的可重用性。

<?php header('content-type:text/html;charset=utf-8');class Person{    var $name;    var $sex;    var $age;    function __construct($name,$sex="男",$age=1){        $this->name=$name;        $this->sex=$sex;        $this->age=$age;    }    function say(){        echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.'<br/>';    }}//注:不能继承私有的成员属性和方法class Student extends Person{//继承Person的三个成员属性(name,sex,age)、一个构造函数、一个成员方法(say)。    var $school;    function study(){        echo $this->name.' 正在 '.$this->school.' 学习<br/>';    }}class Teacher extends Student{//继承Student的四个个成员属性(name,sex,age school)、一个构造函数、两个成员方法(say、study)。    var $wage;    function teaching(){        echo $this->name.' 正在 '.$this->school.' 教学,工资:'.$this->wage;    }}$teacher=new Teacher('张三','男',40);$teacher->school='edu';$teacher->wage=3000;$teacher->say();$teacher->study();$teacher->teaching();//结果如下:我的姓名:张三 性别:男 年龄:40张三 正在 edu 学习张三 正在 edu 教学,工资:3000

访问控制符

同一个类中 private protected public(默认)
类中子类 protected public
所有的外部成员 public

protected

当类中的成员被定为 protected 对于同一个类的所有成员都没有访问限制,但对于该类的外部代码是不改变操作的,对于该类的子类也不能访问 protected 修饰的成员。

<?phpheader('content-type:text/html;charset=utf-8');class Myclass {    private $var1=100;    private function printHello(){        echo 'Hello';    }}class Myclass2 extends Myclass{    function UserPerson(){        echo $var1;        $this->printHello();    }}$myclass=new Myclass();//实例化类//echo $myclass->var1;//外部是不能访问private修饰的成员属性//$myclass->printHello();//外部是不能访问private修饰的成员方法$myclass1=new Myclass2();$myclass1->UserPerson();//私有成员属性和私有成员方法不能被继承,所以在子类中访问出错。//结果如下:Fatal error: Cannot access private property Myclass::$var1 in D:\WWW\test.php on line 16Fatal error: Call to private method Myclass::printHello() from context '' in D:\WWW\test.php on line 17Notice: Undefined variable: var1 in D:\WWW\test.php on line 11Fatal error: Call to private method Myclass::printHello() from context 'Myclass2' in D:\WWW\test.php on line 12

protected

当类中的成员被定义为protected ,对于该类的子类及子类的子类都有访问权限,可以进行属性、方法的读及写操作。当不能被该代码的外部代码访问,该子类的外部代码也不具有访问其属性和方法的权限。

<?phpheader('content-type:text/html;charset=utf-8');class Myclass {    protected $var1=100;    protected function printHello(){        echo 'Hello<br>';    }}class Myclass2 extends Myclass{    protected $var2=200;    function UserPerson(){        echo $this->var1.'<br/>';        $this->printHello();    }}$myclass1=new Myclass2();$myclass1->UserPerson();//echo $myclass1->var1;//被protected 修饰的成员属性和成员方法外部不能访问。echo $myclass1->var2; //该子类的外部代码也不具有访问其属性和方法的权限//结果如下:100HelloFatal error: Cannot access protected property Myclass2::$var1 in D:\WWW\test.php on line 18Fatal error: Cannot access protected property Myclass2::$var2 in D:\WWW\test.php on line 19

子类重载父类的方法

在php中不能定义重名的函数,也包括不能在一个类中定义重名的方法,所以也就没有办法重载。但是在子类中可以定义和父类同名的方法,因为父类的方法已近存在了,这样在子类中就可以把从父类中继承过来重写。

<?php header('content-type:text/html;charset=utf-8');class Person{    var $name;    var $sex;    var $age;    function __construct($name,$sex="男",$age=1){        $this->name=$name;        $this->sex=$sex;        $this->age=$age;    }    function say(){        echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.'<br/>';    }}class Student extends Person{    var $school;    function __construct($name,$sex="男",$age=1,$school=''){        $this->name=$name;        $this->sex=$sex;        $this->age=$age;        $this->school=$school;    }    //子类重写父类的方法    function say(){        echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.' 在'.$this->school.'学校上学<br/>';    }}$student=new Student('张三','男',40,'edu');$student->say();//结果如下:我的姓名:张三 性别:男 年龄:40 在edu学校上学

子类调用父类的方法

调用格式 parent::方法名 列如:parent::__construct();

显然上面的代码有问题,显示非常的繁琐。另外,有些父类中的源代码并不是可见的,所以就不能在重载时复制被覆盖方法中的源代码。在php中,提供了在子类重载的方法中调用父类中被它覆盖的方法功能。这样就可以在子类重写的方法中,继续使用从父类中继承过来的方法,然后添加一些新的功能。

<?php header('content-type:text/html;charset=utf-8');class Person{    var $name;    var $sex;    var $age;    function __construct($name,$sex="男",$age=1){        $this->name=$name;        $this->sex=$sex;        $this->age=$age;    }    function say(){        echo "我的姓名:".$this->name. " 性别:".$this->sex. ' 年龄:'.$this->age.'<br/>';    }}class Student extends Person{    var $school;     function __construct($name,$sex="男",$age=1,$school=''){        parent::__construct($name,$sex,$age);//调用父类的构造函数        $this->school=$school;    }    //方法重写    function say(){        parent::say();//调用父类的say()方法        echo ' 在'.$this->school.'学校上学<br/>';    }}$student=new Student('张三','男',40,'edu');$student->say();//结果如下:我的姓名:张三 性别:男 年龄:40在edu学校上学
1 0
原创粉丝点击