PHP[OOP入门]PH03-魔术方法、抽象类、接口、命名空间
该部分为 php 面向对象的入门部分,较为肤浅且参杂过分已经不是主流的知识。
这是我早期的 php 学习笔记,php 的学习版本版本是 5.6、7,🐟2020/05/06年从有道笔记导出至此。
day03-魔术方法、抽象类、接口、命名空间
目录(文件夹)结构
文件夹名字小写,类名和文件名相同
单一入口 index.php?m=index&a=test
通过url告诉我到底应该执行哪个控制器下面的哪个方法
IndexController类中 test方法
MVC:一种设计模式
model 数据模型
view 视图
controller 控制器
vendor 第三方库文件
1、魔术方法
__callStatic
触发时机:当调用不存在的静态方法的时候自动执行这个方法
参数:函数名 数组
【注】该方法必须是static的
serialize:序列化
将程序中的一个对象进行序列化,然后保存起来
unserialize:反序列化
__sleep(了解)
触发时机:当序列化一个对象的时候调用这个方法
没有参数,有返回值,返回你要序列化的属性,组成一个数组
__wakeup(了解)
触发时机:当反序列一个对象的时候调用
在这里可以做一些自己初始化的一些工作
__clone(了解)
触发时机:当clone一个对象的时候会自动调用
在这里你可以修改一些属性
2、函数、对象引用
call_user_func
call_user_func([$xiang, 'eat'], 1000);
call_user_func_array
call_user_func_array([$xiang, 'eat'], [1000, 2000, 3000]);
var_export
$str = var_export($arr, true);
将一个数组变成生成数组的字符串保存起来
对象引用(了解)
变量引用:加上引用就是同一个变量(一级指针)
对象引用:不管加不加引用,都是同一个对象(二级指针)
3、抽象类
抽象类:就是普通的类在前面加上一个关键字 abstract ,代表这个类是一个抽象类
【注】抽象类不能实例化对象
【注】抽象类存在的目的就是让子类继承并且实现其规定的抽象方法
【注】子类中必须实现抽象类中规定的抽象方法,一般情况下,抽象类中都有抽象方法
【注】如果抽象方法中有参数并且参数有默认值,那么子类实现的时候也要有参数和默认值
【注】抽象方法必须是public或者protected
【注】抽象类可以继承抽象类,但是子类必须实现所有的抽象方法
4、接口(抽象的抽象类)interface
接口:usb接口
代码中的接口:
【注】接口中的方法都是抽象方法,而且是public
实现接口使用implements
可以实现多个接口,中间使用逗号隔开
先继承父类再实现接口
接口可以继承接口,但是子类必须将所有的方法都给实现
接口中不能添加成员变量
5、多态(了解)
在php中,多态其实不明显,我们这个重写就是一种多态,相同的接口给不同的对象,得到的响应不同,这就是多态
6、trait(特性)
php是一种单继承语言,不能使用多继承,trait就是模拟实现多继承的新特性
trait写法和类写法一模一样,只是将class变成了trait
trait中可以添加成员属性,但是一般不加,一般只加成员方法
trait中的方法如果想让子类使用,必须是public
trait不能被实例化,就是不能创建对象
trait可以嵌套trait
解决多个trait中方法名冲突问题:(了解)
use Dun, Sword{
Dun::blood insteadof Sword;
Dun::blood as blood1;
Sword::blood as blood2;
}
7、遍历对象
8、类型约束
function buy(Girl $girl);
9、匿名类(了解)
10、命名空间(namespace)
命名空间要结合自动加载实现MVC框架
命名空间可以解决同一文件中不能有相同的类名问题
命名空间一般都小写
第一个命名空间的前面不能有任何的代码
命名空间的范围是一直向下,直到下一个命名空间的开始
\:根空间,没有写命名空间的都在根空间下,
use hello\Person; 使用命名空间下的类
use baby\Person as SeLang; 给命名空间下的类起别名
子空间