一、基本概念
- 1、对象: 对象是一切客观存在的实体;一个对象由一组属性和对这组属性进行的操作组成;客观世界由对象和对象之间的联系组成。
- 2、类:具有相同属性和行为的对象的抽象就是类。
- 3、类和对象的关系:类的实例是对象,对象的抽象是类;类描述的是一组具有相同属性和行为的对象。
二、面向对象的特征
- 1、封装:将客观事物封装成抽象的类,并且类中的数据和方法只让可信赖的类或对象进行操作,提高了安全性;良好的封装能减少耦合;封装的原则在软件上反应是:要求使对象以外的部分不能随意的访问对象内部的数据。
- 2、继承:将多个具有相同属性和方法的类,高度抽象出一个拥有共性的父类,相同的部分直接从父类中继承,个性在本类中体现。
- 3、多态:一个类实例的相同方法在不同情形有不同表现形式.
/**
* Animal是Cat的父类,在实例化过程中可以有不同的及结果
*/
Animal a=st.new Cat();
Cat c=st.new Cat();
原理:当方法被调用时,无论对象是否被转化为其父类,都只有位于对象继承链最末端的方法实现会被调用。
- 子类以父类的身份出现,比如:儿子代表老子表演,化妆后就是以父亲身份出现了
- 子类在工作时要以自己的方式来实现,比如:儿子模仿得再好,那也是模仿,儿子只能用自己理解的方式去模仿父亲的作品。
- 子类以父类的身份出现时,子类特有的属性和方法不可以使用。比如:儿子代表父亲出演,绝活是不能表示出来的。
三、抽象类
- 1、抽象方法:没有函数体的方法就是抽象方法,由关键字abstract修饰。
- 2、抽象类:由关键字abstract修饰的类为抽象类,抽象类里可以有不是抽象的属性和方法,但是只要有一个方法时抽象方法,该类就必须生命为抽象类。
- 3、抽象类特点:
1)抽象方法一定在抽象类中;
2)抽象类不能直接通过new来创建对象;
3)子类继承抽象父类时,必须实现父类中的所有抽象方法;
4)抽象类是一个抽象的概念,必须通过继承来实现;
abstract class AbstractDemo{
var $test1;
abstract var $test2;
abstract function fun1();
abstract function fun2();
function fun3(){
......
}
}
//抽象类不可以直接被实例化,里面的抽象方法没意义
$ad = new AbstractDemo();
class Demo extends AbstractDemo{
function fun1(){
......
}
function fun2(){
......
}
}
//子类继承抽象类,并实现其中的所有抽象方法后才可以被实例化
$de = new Demo();
四、接口
接口是方法的抽象,如果不同的类中有相同的方法可以使用接口
- 由关键字interface修饰
- 接口可以定义常量,但不可以声明变量;
- 接口中的方法必须是抽象方法
- 一个类只可以继承一个抽象类或普通的类,但可以继承多个接口;
interface InterfaceDemo{
//定义一个常量
const co = 'value';
//接口中的方法都是抽象方法,可以省略“abstract”关键字
function fun1();
public function fun2();
}
class Demo extends class1 implements interface1,interface2,... {
//实现接口中的所有方法后才可以被实例化
... ...
}
抽象类和接口关系
- 接口没有构造函数,抽象类可以有构造函数;
- 接口中的方法都是由public修饰,抽象类中可以用public、protect或private来修饰;
- 从设计角度讲,抽象类是从子类中发现了公共东西,泛化出父类,然后子类继承,而接口是根本不知子类的存在,方法如何实现还不确认,预先定义。
五、静态
- 由static关键字修饰;
- 用static修饰的属性或方法,可以不用实例化而直接访问;
- 静态属性只能赋值Wie常量或文字;
- 伪变量$this不可以在静态方法中使用;
class StaticDemo{
static $st = 'name';
$st1 = 'name1';
static function fun1(){
......
}
function fun2(){
......
}
}
//直接通过类名来访问静态成员
StaticDemo::$st;
StaticDemo::fun1();
$sd = new StaticDemo();
$sd->st1;
$sd->fun2();
网友评论