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. (比如学生上网查资料,来写作业,但是农业工作者就不一定会上网来种地了)
 
 
 
 
 

PHP继承及实现的更多相关文章

  1. javaScript的原型继承与多态性

    1.prototype 我们可以简单的把prototype看做是一个模版,新创建的自定义对象都是这个模版(prototype)的一个拷贝 (实际上不是拷贝而是链接,只不过这种链接是不可见,给人们的感觉 ...

  2. JavaScript的继承实现方式

    1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...

  3. javascript中的继承与深度拷贝

    前言 本篇适合前端新人,下面开始...... 对于前端新手来说(比如博主),每当对js的对象做操作时,都是一种痛苦,原因就是在于对象的赋值是引用的传递,并非值的传递,虽然看上去后者赋值给了前者,他们就 ...

  4. 谈谈一些有趣的CSS题目(四)-- 从倒影说起,谈谈 CSS 继承 inherit

    开本系列,讨论一些有趣的 CSS 题目,抛开实用性而言,一些题目为了拓宽一下解决问题的思路,此外,涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题中有你感觉 ...

  5. JS继承类相关试题

    题目一: //有关于原型继承的代码如下:function Person(name) {   this.name = name;}Person.prototype = {     getName : f ...

  6. JS继承之寄生类继承

    原型式继承 其原理就是借助原型,可以基于已有的对象创建新对象.节省了创建自定义类型这一步(虽然觉得这样没什么意义). 模型 function object(o){ function W(){ } W. ...

  7. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

  8. JS继承之原型继承

     许多OO语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.如前所述,由于函数没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支 ...

  9. 深入浅出JavaScript之原型链&继承

    Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...

  10. 如果你也会C#,那不妨了解下F#(7):面向对象编程之继承、接口和泛型

    前言 面向对象三大基本特性:封装.继承.多态.上一篇中介绍了类的定义,下面就了解下F#中继承和多态的使用吧.

随机推荐

  1. CSS浏览器兼容性

    答题技巧:因为这个问题主要是看你经验,一般有了开发经验的都会遇到这样的坑,你只要说出几个来大致就可以了. 1.对齐文本和文本输入框 问题: 当input元素在设置了高时,在IE7.IE8.IE9下会出 ...

  2. 【洛谷p1314】聪明的质监员

    聪明的质监员[题目链接] 有关算法: 二分答案: 但是你只二分答案是不够的,因为你check会炸,所以还要考虑前缀和: 首先假装我们的check已经写好了,main函数: int main() { n ...

  3. BZOJ 1875(DP+矩阵快速幂)

    题面 传送门 分析 容易想到根据点来dp,设dp[i][j]表示到i点路径长度为j的方案数 状态转移方程为dp[i][k]=∑(i,j)∈Edp[j][k−1]" role="pr ...

  4. Codeforces Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)

    传送门 A. XORinacci 手玩三四项发现序列就是 $a,b,a\ xor\ b,a,b,...$,直接输出即可 #include<iostream> #include<cst ...

  5. [TabControl] TabControl控件的最佳实践,可以把一个窗体和用户控件添加进来

    看下效果吧<ignore_js_op> 下面是一个公共的添加方法看代码 [C#] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 1 ...

  6. HTTPS证书转换成PEM格式

    PEM 格式的证书文件(*.pem)一般为以下格式: 注意:PEM 格式证书文件可用 notepad++ 等文本编辑器打开. CER / CRT 格式证书转换为 PEM 格式 对于 CER / CRT ...

  7. Jupyter Notebook 安装与使用

    Ref: https://jupyter.org/install Installing Jupyter Notebook with pip python -m pip install --upgrad ...

  8. Email常用缩写

    Abbreviations Used in email Abbreviation Meanings ATM at the moment AFAIK as far as I know BTW by th ...

  9. maven 提取jar包 依赖及打包排除

    <properties> <project.targetDir>D:\jar</project.targetDir> <project.targetServe ...

  10. ps:选区的存储及载入

    有时候需要把已经创建好的选区存储起来,方便以后再次使用.就要使用选区存储功能. 创建选区后,直接点击右键(限于选取工具)出现的菜单中就“存储选区”项目.也可以使用菜单[选择 存储选区].会出现一个名称 ...