接口技术
- PHP支持的是单继承,每次只能从一个父类来继承功能。
- 如果一个类同时需要多个父类的功能,可以用接口来实现。
- 接口就是特殊的抽象类。
- 接口也是子类中方法的命名规范。
- 有了接口可以很容易的对项目进行功能的扩展。
- 接口也是一种特殊的类。
接口定义的实现要点
- 使用interface关键字来定义接口
- 使用implements关键字来实现接口
- 同类的东西才可以继承,类可以继承类,而接口可以继承接口;但是,类只能实现接口
-
接口中只能定义类常量和抽象方法,其他元素不可能存在。
-
接口中的方法默认都是抽象方法,但不需要加abstract关键字。
-
接口中的方法的权限都必须是public。
- 接口中的方法即可以是成员方法,也可以是静态方法。
- 接口中的常量在类中不能重写。接口中的常量只能继承。
- 一个类可以同时实现多个接口。
接口定义语法
举个栗子
<?php
//声明页面字符集
header("content-type:text/html;charset=utf-8");
//(1)定义电话接口
interface Tel{
//打电话的方法
public function call();
}
//(2)定义Mp3接口
interface Mp3{
//听音乐的方法
public function music();
}
//(3)定义Mp4接口
interface Mp4 extends Mp3{
//看电影的方法
public function video();
}
//(4)定义手机类,并实现所有接口
class Mobile implements Tel,Mp4{
//重写打电话的方法
public function call(){
echo "正在打电话!<br>";
}
//重写听音乐的方法
public function music(){
echo "正在听音乐!<br>";
}
//重写看电影的方法
public function video(){
echo "正在看电影!<br>";
}
//打游戏的方法
public function game(){
echo "正在玩游戏!";
}
}
//(5)创建手机类的对象
$obj = new Mobile();
$obj->call();
$obj->music();
$obj->video();
$obj->game();
类的自动加载
1、为什么需要类的自动加载?
一般情况下,程序员都会把每个类单独定义成一个独立的文件,方便管理。如果在某个文件中,需要用到多个类文件,要在文件的开头,写好多require()语法。
上面的这种情况,会有一些问题:
(1)如果把所有类全部加载进来,会占用很多的内存空间;
(2)如果只需包含需要的类文件,每个页面用到的类文件又不一样,这样一来,每个页面的类文件路径都得修改。
2、常规的自动加载类函数:__autoload()
- 该系统函数的名称是固定的:__autoload()
- 该函数需要我们定义它的内容。
- 该函数内容就是:构建类文件的真实路径,并类文件的加载。
- 该函数接收一个唯一的参数,传递过来的类名参数。
- 该函数何时调用:当使用一个不存在的类时,该函数就会自动调用,并传递类名参数过来。
- 类的使用只有两种方式:
- 通过new关键字来创建类的对象。如:$obj = new Student()
- 通过静态方式下调用类的元素时。如:Student::showInfo()
3、类文件的命名规则
- 类的命名规范,使用”驼峰式”命名,每个单词的首字母大写。如:StudentController、Student
- 方法的命名规范,使用”驼峰式”命名,第1个单词全小写,其余单词首字母大写。如:getError()
- 类文件的命名规范,类文件主名要与类名一致,类文件后缀必须是”.class.php” 。纯类文件。
- 例如:StudentController.class.php、NewsModel.class.php
4 举例说明
自定义类文件加载函数(spl_autoload_register)
1、描述
如果类文件位于不同的目录,且命名方式不尽相同时,使用传统的__autoload()加载函数,就会显得十分麻烦,因为要做很多的文件是否存在的判断。复杂的类文件加载请使用spl_autoload_register()函数。
提示:传统的类文件加载函数__autoload()在最新的PHP版本中将被去掉。
2、语法格式
3、类的自动加载演示
提示:Student.class.php位于./libs/目录;Teacher.class.php位于./public/目录中。
4、使用匿名函数作参数
对象遍历
使用foreach可以遍历数组,也可以对象属性。
如果在类外遍历对象时,只能遍历public权限的属性。
如果在类内遍历对象时,所有对象属性都可以遍历出来。
魔术方法
对象克隆
1、什么是对象克隆
- 如果我们想创建新的对象,有哪些方法?通过new关键字创建新对象,通过clone关键字创建新对象。
- obj2= o b j 2 = obj1它是创建新对象吗?它们是同一个对象的不同变量。它们不是两个独立的对象。
2、clone关键字的使用
3、__clone()克隆的魔术方法
魔术方法就是类中特殊的方法,这些魔术方法的名称是固定的,不能修改的。
魔术方法都是自动调用。如:__construct()、__destruct()、__clone()
当对象克隆完成时,__clone()克隆方法会自动调用。
魔术方法都是成员方法,魔术方法一般都是public权限。
1、__toString()
描述:当把一个对象转成字符串时,该魔术方法会自动调用。
语法:public string __toString ( void )
2、__invoke()
描述:当把对象当成函数调用时,该魔术方法会自动调用。
语法:mixed __invoke ([ $… ] )
5、instanceof关键字
描述:判断当前对象是不是某个类的对象。如果是某个类的对象,则返回TRUE;否则,返回FALSE。
语法:$obj instanceof ClassName