多态
oop面向对象编程三大特性:封装,继承,多态
多态分为:重写,重载(php不支持)
重写:子类重写了父类的同名方法
注意:子类中覆盖的方法不能比父类的方法访问权限更加严格
方法修饰符
static (静态的)
1-1
1. 静态属性在加载类的时候分配空间,所以不需要实例化就可以直接访问
2.访问静态成员语法:类名::静态成员
3.静态成员在内存只有就一份,为所有的实例公共。
4. 静态成员不能访问普通成员,只能访问静态成员。因为静态成员被创建的时候可能还没有任何实例被实例化
5.static修饰属性成为静态属性,static修饰方法成为静态方法
1-2 self
self表示当前类的名字
注意:非静态方法被self::调用,自动转成静态方法 不能调用普通属性(在类没有实例化之前 普通属性没有分配空间)
1-3 静态成员可以被继承
1-4 确定当前对象(静态延时绑定)
【static::静态成员】称为延时绑定,static表示的是一个类,具体表示什么类在运行时确定,表示的是当前对象所在的类
final(最终的)
final修饰的类不能被继承
final修饰的方法不能重写
abstruct(抽象的)
abstruct修饰的方法叫抽象方法,abstruct修饰的类叫抽象类
如果只有方法的声明而没有方法的实现成为抽象方法
如果一个类中有一个方法是抽象方法,那么这个类就是抽象类
抽象类不允许实例化,必须在子类中重新实现才能实例化
抽象类的作用:
定义统一的方法名称
防止实例化
接口(interface)
如果一个类中所有的方法全都是抽象方法,那么这个类就可以声明成接口
接口是一个特殊的抽象类
接口中的抽象方法只能是public的,默认也是public权限
通过implements类实现接口
不能通过final和abstract修饰接口中的抽象方法
类不允许多重继承,接口允许多重实现
先继承类,后实现接口
继承类同时实现接口
类常量
补充:类(接口)中可以放属性、方法、常量。
类常量用const定义
父类可以指向子类的引用
类的自动加载
在项目中
一个文件中存放一个类
文件名与类名同名
以.class.php结尾
当页面执行的时候,通过PHP核心程序(Zend Engine)判断用户脚本需要哪个类。如果没有找到,会自动的调用__autoload()函数,并且会将缺少的类名传递给__autoload()函数,我们只需要在__autoload函数中加载缺少的类即可。
手动加载类
1.9.1 手动加载类 require 'Goods.class.php'; require 'Books.class.php'; require 'Phone.class.php'; $book=new Books(); $phone=new Phone(); $book->setName('PHP入门与精通'); $phone->setName('诺基亚2100'); $book->getName(); $phone->getName();
自动加载类
类文件存放在同一个目录下
将类的地址映射到数组中加载
类文件存放的地址不规则
function __autoload($class_name) { $map=array( 'Goods' => './aa/Goods.class.php', 'Books' => './bb/Books.class.php', 'Phone' => './cc/Phone.class.php' ); require $map[$class_name]; }
利用命名规则加载类
将同一类型的类文件放在同一个目录下。
$book=new BooksLib(); $phone=new PhoneLib(); $book->setName('PHP入门与精通'); $phone->setName('诺基亚2100'); $book->getName(); $phone->getName(); //通过命名规则加载类 function __autoload($class_name) { if(substr($class_name,-3)=='Lib'){ require "./Lib/{$class_name}.class.php"; } }