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; 给命名空间下的类起别名

子空间