PHP继承及实现

 

php学习已经有一段时间了,来对之前的知识积累做个记录。

php实现单继承和多实现。单继承: 一个类只能有一个extends 抽象类 ,多实现 :一个类可以implements 多个接口

举个简单的栗子(栗子可能举得不是很贴切,表达意思就行了):

下面这个抽象类:Person,表示一个人的共有属性 性别sex,两个行为:抽象的干活doWhat(),以及工作work()

 
 public abstract  class   Person{



    private $sex;



    public function getSex(){

        return $this->sex;

    }



    public function setSex($value){

        $this->sex=$value;

    }



    abstract function doWhat();



    protected function work(){

        echo '我在工作!';

    }



}

这个时候会发现,这个抽象类还少了一些必须的行为比如 吃饭 和睡觉。因此我们接着定义一个接口PersonAction

 
 public interface PersonAction{

       public function eat();

       public function sleep();

 }

然后我们定义个学生来继承 Person 类 和 实现 PersonAction接口

 
public class student1 extends Person implements PersonAction{

    private $school;



    public function setSchool($value){

        $this->school=$value;

    }



    public function getSchool(){

        return $this->school;

    }



    public function doWhat()

    {

       echo '我去上学';

    }



    public function eat()

    {

        echo '在学校吃饭';

    }



    public function sleep()

    {

        echo '晚上睡觉';

    }



}

 一个学生就跃然纸上了。

除了以上行为,Person还有一个独有的行为那就是思考,也是人类区别动物最大的不同点。因此 我们又要声明一个思考的行为。

interface PersonThink{

    public function thinklife();  //思考人生

}
 
ok,那么学生就变成了:
public class student1 extends Person implements PersonAction,PersonThink{

    private $school;



    public function setSchool($value){

        $this->school=$value;

    }



    public function getSchool(){

        return $this->school;

    }



    public function doWhat()

    {

       echo '我去上学';

    }



    public function eat()

    {

        echo '在学校吃饭';

    }



    public function sleep()

    {

        echo '晚上睡觉';

    }



    public function thinklife()

    {

       echo '我在想作业';

    }



}

 这样学生就可以开始做作业了。还有学生做作业的时候,如果遇到不会的,就会上网查资料,但是查资料这个动作又不是所有person都必须的。这个时候就可以使用trait

(trait 的详细参见官网:http://php.net/manual/zh/language.oop5.traits.php)

 
 
 trait  StudentHelp{

            public function searchIntnet(){

                       echo '上网查资料';

            }

  }

这个时候学生就可以上网查资料了

public class student1 extends Person implements PersonAction,PersonThink{



    use StudentHelp;



    private $school;



    public function setSchool($value){

        $this->school=$value;

    }



    public function getSchool(){

        return $this->school;

    }



             ……

    public function thinklife()

    {

        $this->searchIntnet();

       echo '我在想作业';

    }



}
这个时候学生就可以上网查资料来写作业啦。
      
由上面几个例子我们可以看到,php只能做到单继承和多实现,interface 一般定义必须行为,abstarct 一般定义对象的公用属性和行为。但往往具有一般通用性的行为建议使用trait. (比如学生上网查资料,来写作业,但是农业工作者就不一定会上网来种地了)
 
 
 
 
 
原文地址:https://www.cnblogs.com/xulele/p/5681004.html