多态
多态就是多种形态
多态分为:方法重载和方法重写,但是PHP不支持方法重载。
方法重写
子类方法和父类的方法必须同名
1  | 
  | 
1.子类重写的方法不能比父类的方法更加严格(封装)
public、protected、private
2.子类可以拥有和父类不同个数的参数,[严格标准是不允许的]
私有属性的继承和重写
私有属性可以被继承但不能被重写
1  | <?php  | 
访问修饰符
static        静态的
final        最终的
abstract    抽象的
static【静态的】
1、    static修饰属性叫静态属性,static修饰方法叫静态方法
2、    当类加载的时候就分配内存空间,在内存中就一份。不用实例化可以直接访问。为所有的对象共享。
3、    销毁对象不会销毁静态成员,因为静态成员属于类,而不属于对象。
4、    当页面执行完毕的时候才销毁静态成员。
5、    父类的static属性子类中可以继承并重写,但不能重新定义同名普通属性。
6、    静态方法中不能直接访问普通属性
7、    被self调用的普通方法会转成静态方法,【严格标准不允许】
1  | <?php  | 
静态成员可以被继承
1  | <?php  | 
调用静态成员:类名::静态成员
self 表示当前类名
非静态方法被self调用,自动将非静态方法转成静态方法【严格标准是不允许的】
1  | <?php  | 
确定当前对象
1、$this表示当前对象的引用
2、self表示当前方法所在的类的类名
3、static表示当前对象所属的类的类名【静态延时绑定】
    最后一次执行类的属性
1  | <?php  | 
final[最终的]
1、    final修饰的类不能被继承
2、    final修饰的方法不能被重写
3、    final不能修饰属性
1  | <?php  | 
1  | <?php  | 
abstract[抽象的]
1、    abstract修饰的类成为抽象类,abstract修饰的方法叫抽象方法
2、    抽象方法:只有方法的声明,没有方法的实现
3、    抽象类:类中只要有一个方法是抽象方法,这个类就是抽象类。
4、    抽象类不可以被实例化,必须在子类中重新实现。
抽象类的作用:定义方法的命名规范
接口(interface)
1、    如果一个类中所有的方法都是抽象方法,这个类就声明成接口。
2、    接口是一个特殊的抽象类
3、    接口中的方法只能是public的,默认是public的
4、    接口中的方法不能用abstract、final来修饰。
5、    定义过程用interface实现接口用的implements关键字
类不能多重继承,但是接口可以多重实现
继承类的同时实现接口
必须先继承类,再实现接口
class Myclass extends Class implements IPict1,IPict2
类常量【const】
类中可以放属性、方法、常量
调用类常量    类名::常量名
类常量属于类自身,不属于对象实例,不能通过对象实例访问
子类可以重写父类中的常量,可以通过(parent::)来调用父类中的常量
1  | <?php  | 
类常量也可以放在接口中
1  | <?php  | 
参数约束
1、    在PHP5.3以后才支持参数约束
2、    只能约束对象,不能约束基本数据类型
1  | <?php  | 
父类可以指向子类的引用
父类对象可以保存子类的地址
面向对象的三大特性:封装、继承、多态
类的自动加载
1、    一个文件中只能有一个类
2、    类文件名以.class.php结尾
3、    类名和文件名同名
Goods.class.php1
2
3
4
5
6
7
8
9
10
11
12<?php
/***商品类*/
abstract class Goods {
	protected $name;
	//设置商品名称
	public function setName($name) {
		$this->name=$name;
	}
	//获取商品名称
	abstract function getName();
}
?>
Books.class.php1
2
3
4
5
6
7<?php
class Books extends Goods {
	public function getName() {
		echo "《{$this->name}》";
	}
}
?>
Phone.class.php1
2
3
4
5
6
7<?php
class Phone extends Goods {
	public function getName() {
		echo $this->name;
	}
}
?>
loadClass.php1
2
3
4
5
6
7
8
9
10<?php
header('content-type:text/html;charset=utf-8');
require './Goods.class.php';
require './Books.class.php';
require './Phone.class.php';
$book=new 45Books();
$phone=new Phone();
$book->setName('PHP高级');
$book->getName();
?>
手动引入类比较麻烦,不健壮。最好能实现需要什么类就自动加载什么类。
#### __autoload($class_name)
当页面执行的时候,PHP核心程序(Zend Engine)判断当前需要哪个类,如果没有找到该类,就自动的调用__autoload()函数,并且将缺少的类名作为参数传递到__autoload()函数中。
通过缺少类名来加载需要的类
1  | <?php  | 
将类映射到数组中
有的时候类存放的位置不规则,将不规则的地址映射到类名,形成一个数组再加载。
1  | <?php  | 
利用命名规则加载类
同一类别的类放在同一个文件夹下,这样便于分组管理
将所有的类文件放到Lib文件夹下。将类名名字改为:类名+文件夹名
1  | 1.常规引入方法  | 
Final 和 abstract 不能修饰接口中的方法
参数约束只能约束对象