1, 抽象类 ,用abstract关键字来修饰一个类,这个类就是抽象类;如果用abstract关键字来修饰一个方法,这个方法就是抽象方法,如果是抽象方法就不能实现(即抽象方法只能声明,不能定义)。

抽象类的样式:

abstract 类名{

成员变量;

abstract 成员方法

}

为什么设计抽象类这个技术?

在实际开发中,我们可能有这样一种类,是其他类的父类,但是它本身并不需要实例化。主要用途是让子类来继承,这样可以达到代码复用。同时利于项目设计者,设计类。比如,项目经理安排手底下多人编写某项目代码,为了统一管理,项目经理可以先写一个项目的抽象类,其他人在抽象类基础上进行编写。

abstract class Animal{
public $name;
protected $age; abstract public function cry();
public function getName(){
return $this->name;
}
}
class Cat extends Animal{
public function cry(){
echo "喵喵叫";
}
}
$cat1 = new Cat();
$cat1->cry();
echo $cat1->getName();

  

抽象类注意事项:

(1),抽象类不能被实例化。

(2),抽象类不一定包含abstract方法,也就是说抽象类可以没有抽象方法,可以有实现了的方法。。

(3),如果一个类中,只要有抽象方法,则该类必须声明为抽象类。

(4),抽象方法没有函数体,即抽象方法只有声明,没有定义。

(5),如果A类继承了抽象类B,则要求A类实现从B类继承的所有抽象方法。

2, 接口,接口是更加抽象的抽象类,抽象类里的方法可以有方法体,接口里的所有方法都没有方法体。接口体现了程序设计的多态和高内聚低耦合的设计思想。

(1),接口的实例化

/模拟USB接口
interface iUsb{
public function start();
public function stop();
} //编写相机类,让他去实现接口
//1,当一个类实现了某个接口,则要求该类必须实现这个接口的所有方法
class Camera implements iUsb{
public function start(){
echo "相机开始工作";
}
public function stop(){
echo "相机停止工作";
}
} //手机类
class Phone implements iUsb{
public function start(){
echo "手机开始工作";
}
public function stop(){
echo "手机停止工作";
}
} $camera1 = new Camera();
$camera1->start();
$camera1->stop(); $phone1 = new Phone();
$phone1->start();
$phone1->stop();

(2)接口使用的基本语法,接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来。

Interface 接口名{

//属性

//方法

}

接口中方法都不能有方法体,只能声明,没法定义。

(3)如何实现接口

Class 类名 implements 接口1,接口2{

}

(4)什么时候使用接口,(4.1)比如架构师订下规范,让别的程序员来实现;比如架构师做一个学生管理系统。定义接口

interface StuManagerInterface{
public function addStudent($stu); //$stu为对象
public function delStudent($id);
public function updStudengt($stu);
}
给程序员
class StuManage{
public function tianjiaxuesheng(){ }
}

  

(4.2)多个类(类之间无继承关系,是平级的)这些类都要去实现某个功能。

(5)接口相关细节知识

(5.1)接口不能实例化;

(5.2)接口中所有方法都不能有主体,只能声明,没有定义;

(5.3)一个类可以实现多个接口,必须用逗号隔开;

class 类名 implements 接口1,接口2{}

(5.4)接口中可以有属性,但必须是常量,并且是public的;

interface iUsb{
const A = 90;
}
echo "ok".iSub::A;
class B implements iUsb{
public function aaa(){
iSub::A
}
}

  (5.5)接口的方法都是public;

(5.6)一个接口不能继承别的类,但是可以继承别的接口,类只能继承一个类,接口可以继承多个接口。一个类实现接口,必须将此接口的方法,以及此接口的所有父接口的方法实现。

interface iUsb2{
public function a();
}
interface iUsb3{
public function b();
}
interface iUsb extends iUsb2,iUsb3{
const A = 90;
public function test();
}
class Class1 implements iUsb{
public function a(){}
public function b(){}
public function test(){}
}

(6)继承与接口的比较

php的继承是单继承,也就是一个类最多只能有一个父类,这种单继承的机制可保证类的纯洁性,比C++中的多继承机制简洁。但是不可否认,对子类功能的扩展有一定影响,所以我们认为:

(6.1)实现接口可以看作是对继承的一种补充,还有一点,继承是层级式的,不太灵活。如下图所示,这种结构修改某个类会打破这种继承的平衡,而接口就没有这样的麻烦,因为它只针对实现接口的类才起作用。

(6.2)实现接口可在不打破继承关系的前提下,对某个类功能扩展,非常灵活。  

3,final

(3.1)如果我们希望某个类不被其他的类来继承(可能因为安全原因)。可以使用final。如下,类B没法继承类A。

final class A{

}
class B extends A{ }
echo "ok";

(3.2)final成员方法不能被子类覆盖,可以被继承。

class A{
final public function getRate($salary){
return $salary*0.08;
}
}
class B extends A{
public function getRate($salary){
return $salary*0.01;
}
}
$b = new B();
echo $b->getRate(100);

(3.3) final不能修饰成员变量。

4,const,常量,不希望某个成员变量被修改,希望该变量的值是固定不变的,这时可以用const去修饰该成员变量,这样这个变量就自动成为常量。

(4.1)基本用法:const 常量名 = 值;

访问:类名::常量名或接口名::常量名

(4.2)常量名应该全部大写,并且前面不加$。

class A{

const 常量名=赋初值;

}

interface 接口名{

const 常量名=赋初值;

}

(4.3)因为常量没法修改,所以在声明时候直接赋值。

(4.4)常量默认是public。在声明时候不要加修饰符号。

class A{
const TAX_RATE=0.08;
public function payTax($val){
return $val*A::TAX_RATE; //self:: TAX_RATE也正确
}
}
$a = new A();
echo $a->payTax(200);

(4.5)在类的外部访问常量,类名::常量名;在类的内部,类名::常量名或self::常量名。

(4.6)常量可以被子类继承。

(4.7)常量是属于一个类的,而不是某个对象的。

php面向对象编程_2的更多相关文章

  1. 四、java面向对象编程_2

    目录 六.对象的创建和使用 七.this关键字 八.static关键字 九.package和import语句 十.类的继承 十一.访问控制 十二.方法的重写 十三.super关键字 十四.继承中的构造 ...

  2. Python入门基础(9)__面向对象编程_2

    __str__方法 如果在开发中,希望使用print输出对象变量时,能够打印自定义的内容,就可以利用__str__这个内置方法了 注意:__str__方法必须返回一个字符串 class Cat(): ...

  3. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  4. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  5. PHP 面向对象编程和设计模式 (1/5) - 抽象类、对象接口、instanceof 和契约式编程

    PHP高级程序设计 学习笔记 2014.06.09 什么是面向对象编程 面向对象编程(Object Oriented Programming,OOP)是一种计算机编程架构.OOP 的一条基本原则是计算 ...

  6. Delphi_09_Delphi_Object_Pascal_面向对象编程

    今天这里讨论一下Delphi中的面向对象编程,这里不做过多过细的讨论,主要做提纲挈领的描述,帮助自己抓做重点. 本随笔分为两部分: 一.面向对象编程 二.面向对象编程详细描述 ------------ ...

  7. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  8. 面向对象编程(OOP)

    什么是面向对象编程,对于面向对象编程与面向过程编程的解释随处可见,个人认为对面向对象编程解释最好的一个定义是:依赖倒转原则是面向对象编程的标志,面向对象编程是一种思想,无论使用哪一种编程语言,如果在编 ...

  9. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

随机推荐

  1. 论immutable不可变性

    什么叫immutable和mutable?简单来讲,一个immutable的对象一旦被创建好,它的状态将不会改变.反过来,如果一个类的实例是immutable的,那么我们把这个类也称作immutabl ...

  2. freeswitch由于ext-sip-ip地址填写错误导致32秒拆线问题

    通话32秒左右就断掉 检查 profile 的 ext-sip-ip 设置ext-rtp-ip和ext-sip-ip 可以直接设置为外网IP 自建stun-server, 更新后, 过了好几个小时出现 ...

  3. 必看的 jQuery性能优化的38个建议

    一.注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: $loading = $('#loading'); ...

  4. Python基础:字符串的常见操作

    # 切片 # 切片 获取对象中一部分数据 [起始位置:结束位置(不包含):步长] qpstr = "山东张学友" result = qpstr[1: 3: 1] # 东张 prin ...

  5. coding创建项目

    在本地,使用git 需要创建一个pom.xml文件,就可以导入到工作空间了! 在需要项目工作空间里,依次使用git命令执行 mkdir test  //创建文件夹,项目名称cd test   //切换 ...

  6. java实现文件的拷贝以及文件的删除

    /** * 将文件拷贝到指定目录 * @param oldAddress 文件所在目录(文件的全路径) * @param newAddress 指定目录(包含复制文件的全名称) * @throws E ...

  7. 621. Task Scheduler CPU任务间隔分配器

    [抄题]: Given a char array representing tasks CPU need to do. It contains capital letters A to Z where ...

  8. CentOS JAVA安装及查看路径方法

    一.安装: 方法一:手动解压JDK的压缩包,然后设置环境变量 1.在/usr/目录下创建java目录 [root@localhost ~]# mkdir/usr/java[root@localhost ...

  9. 对max_allowed_packet这个参数的误解

    之前一篇文章知识对,这个参数一个泛泛的概念,但是并没有理解这个参数的真正意义,现在差不多有那么点儿感觉了,主要的意思是每一条记录是一个包,不可拆分,而且包括blob,text等大字段.

  10. C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)

    C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...