基本概念
参考:7.1 类的概念
访问控制
针对对象的属性和方法,可以使用访问控制来限制它的作用域
public
:公开的,在类中、实例中、子类中都能访问
protected
:受保护的,在类中、子类中可以访问
private
:私有的,仅能在类中访问
static
:静态的,在哪都能用
类的属性在定义时必须指定访问控制级别,像下面这样:
// 类
class Foobar{
// 我将报错
$abc = "123";
// 我不会报错
public $test = 456;
}
类的方法如果不指定访问控制级别,那么默认就是 public
公开的。
属性常量
参考:7.2 类的属性
对象继承
参考:7.3 对象继承
自动加载
参考:7.4 类的自动加载
构造和析构
参考:7.5 构造和析构
范围解析操作符
参考:7.6 范围解析操作符
静态属性
一个类的属性和方法可以使用 static
标记为静态的,如没有显示指定访问控制级别,则默认为公开的。
静态成员需要使用 ::
范围解析操作符 来访问。
静态成员可以不用实例化对象而直接访问,但静态属性不能使用实例化对象来访问,而静态方法可以。
抽象类
参考:7.7 抽象类
对象接口
参考:7.8 对象接口
Trait
参考:7.9 Trait
匿名类
参考:7.10 匿名类
重载
参考:7.11 重载
遍历对象
参考:7.12 遍历对象
魔术方法
参考:7.13 魔术方法
Final 关键字
final
关键字可以应用到类或方法上
final
应用在类上时,该类无法被继承
final
应用在方法上时,该方法无法被重写
对象复制
对象的赋值通常是引用的,通过 clone
关键字可获取一个新的拷贝,使用 clone
后, 系统会先执行该对象的 __clone
方法,可以根据需要在该魔术方法中执行一些修改属性的操作。
// 定义类
class Example{
// 我的属性
private $foo = 123;
private $bar = 'abc';
// clone
public function __clone(){
$this->foo = 789;
}
}
// 实例化
$exam = new Example();
// object(Example)#1 (2) { ["foo":"Example":private]=> int(123) ["bar":"Example":private]=> string(3) "abc" }
var_dump($exam);
// 执行复制
$temp = clone $exam;
// object(Example)#2 (2) { ["foo":"Example":private]=> int(789) ["bar":"Example":private]=> string(3) "abc" }
var_dump($temp);
对象比较
两个对象的属性和值相同,且是同一个类的实例,那么在执行 ==
比较时,相等。
两个对象的属性和值相同,且是同一个类的同一个实例,那么在执行 ===
比较时,相等。
判断一个对象是否为某一个类的实例,可以使用 instanceof
关键字。
类型约束
函数或类的方法可以对参数进行类型约束,调用时必须传递指定类型的数据,否则报错。
// 定义类
class Example{
// 给方法的参数增加类型约束
public static function fn(string $str){
echo $str;
}
}
// 给函数的参数增加类型约束
function fun(int $num){
echo $num;
}
// 调用
Example::fn('hello world');
fun(123);
后期静态绑定
static
不在会被解析成定义当前方法所在的类了,而是根据实际运行时来计算。
当一个类的方法中使用了 static
关键字,那么到时候调用这个方法时,static
的指向并非是当前类,有可能指向其他父类。
static
的指向是上一个 非转发调用
时系统自动保存下来的类,转发调用
指的是 self::
,parent::
,static::
等。
后期静态绑定这个概念通常会出现在继承关系中。
$this
代表的是当前实例
self
代表的是当前类、通常用于调用当前类的静态属性
parent
代表父类
对象的序列化
可以使用 serialize()
将对象进行序列化成字符串,然后将字符串保存,在另外一个脚本中使用 unserialize()
将保存的字符串读取传递进去,重新得到该对象。
需要注意的是,在 unserialize()
之前,记得 include
将类的定义文件引入。