本文是复习所写,并不会涵盖一些基础知识点
基本概念
- 使用
class
关键字来定义类,使用new
来创建类的实例
<?php
classTest
{
public$attr=1; // 公共属性
publicfunctionfoo()
{
echo$this->attr;
}
}
// 方式一
$obj=newTest();
$obj->foo();
// 方式二
// 与可变函数类似,称为可变类吧
$className='Test';
$obj=new$className();
$obj->foo();
// 方式三 PHP8
functiongetClassName()
{
return'Test';
}
$obj=new (getClassName());
$obj=new (Test::class);
- 在类内部可以使用
new self
、new parent
创建新对象
将对象实例赋值给一个新变量时,新变量访问的是同一实例。要创建一个新实例必须使用克隆操作 - 类的属性和方法存在与不同的空间,所以同一个类的属性和方法可以使用同样的名称
- 使用
extends
实现类继承,PHP只支持单继承。 ::class
类名解析
<?php
namespaceDemo
{
classTest()
{
}
// 方式一
echoTest::class;
}
// 方式二 PHP8
$obj=newTest();
echo$obj::class; // 等同于 get_class()
- Nullsafe方法和属性 PHP 8
?->
nullsafe操作符,对象引用解析为null时不抛出异常,而是返回null
属性
<?php
classTest
{
// 访问控制符
public$attr=1;
protected$attr1=2;
private$attr2=3;
// 静态
publicstatic$attr3=4;
// 类型声明 PHP7.4
publicint$attr4=4;
// 只读 PHP8
publicreadonly$attr5=5;
}
类常量
<?php
classA {
constATTR_1=1;
// 使用访问修饰符 PHP7.1
publicconstATTR_2=2;
protectedconstATTR_3=3;
privateconstATTR_4=4;
// final常量 PHP8.1
finalconstATTR_5=5;
}
classBextendsA
{
constATTR_1=6; // 可以在子类中重定义
}
类的自动加载
推荐使用spl_autolad_register()
来注册自动加载器,可以注册任意多个
__autolad()
的方式已经废弃,并在PHP8中移除
构造函数和析构函数
- 构造器属性提升 PHP 8
当构造器参数带有访问控制时,PHP会同时将它们当作对象属性和构造器参数,并赋值到属性
范围解析操作符::
抽象类
任何一个类,如果它里面至少有一个方法是抽象的,那么这个类就必须被声明抽象的
抽象类也可以实现接口
接口
接口也可以使用extends
来扩展
也可以定义常量,PHP8.1之前不能被子类或子接口覆盖
Trait
- 优先级:当前类>Trait>父类
- 冲突解决
insteadof
用于排除另一个trait中同名方法as
将trait中方法重命名,也可以用于修改方法的访问修饰符 - trait中也可以使用其它trait
- trait中可以定义属性、方法、抽象方法、静态方法、静态属性
匿名类
重载
PHP中的重载是指在访问未定义的属性、方法时,会调用特定的魔术方法
属性重载:
__set()
__get()
__isset()
__unset()
方法重载:
__call()
__callStatic()
遍历对象
对象的可见属性都将被遍历
魔术方法
后期静态绑定
self::
代表的是当前方法所在的类的实例
static::
限定调用的方法未指定类中的方法
<?php
classA {
publicstaticfunctionwho() {
echo__CLASS__;
}
publicstaticfunctiontest() {
static::who(); // 后期静态绑定从这里开始
}
}
classBextendsA {
publicstaticfunctionwho() {
echo__CLASS__;
}
}
B::test(); // Output: B
协变与逆变
协变使子类比父类方法能返回更具体的类型
逆变使子类比父类方法参数类型能接受更模糊的类型。