接口
- 使用interface来定义,使用extend来实现接口
- 类中必须实现接口中定义的所有方法,否则会报一个致命错误。 类可以实现多个接口,用逗号来分隔多个接口的名称。
- 接口中也可以定义常量。接口常量和类常量的使用完全相同, 在 PHP 8.1.0 之前 不能被子类或子接口所覆盖
<?php
// 声明一个'Template'接口
interface Template
{
public function setVariable($name, $var);
public function getHtml($template);
}
实现接口的时候,class 中的参数名称不必和接口完全一致。 然而, PHP 8.0 起语法开始支持命名参数, 也就是说调用方会依赖接口中参数的名称。 因此,强烈建议开发者的参数的命名,在类和接口中保持一致
抽象类
使用abstract class
, PHP 有抽象类和抽象方法。定义为抽象的类不能被实例化。任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的
<?php
abstract class AbstractClass
{
// 强制要求子类定义这些方法
abstract protected function getValue();
abstract protected function prefixValue($prefix);
// 普通方法(非抽象方法)
public function printOut() {
print $this->getValue() . "\n";
}
}
静态关键字
声明类属性或方法为静态,就可以不实例化类而直接访问。可以在实例化的类对象中通过静态访问
class TestClass
{
public static $my_static = 'foo';
}
$tmp = new TestClass;
$name = 'TestClass';
print $tmp::$my_static;
print TestClass::$my_static;
// print $name::$my_static; 这里通过变量来引用会报错
联合类型和类型别名
联合类型(Union types)
联合类型接受多个不同的类型,每个类型由 | 符号连接
类型别名 (Type aliases)
PHP 支持两种类型别名:mixed 和 iterable,分别对应 object|resource|array|string|float|int|bool|null 和 Traversable|array 的 联合类型
注意: PHP 不支持用户定义类型别名
Trait
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制
<?php
//定义
trait PaypalTrait {
}
//使用,在类中调用
use PaypalTrait;
匿名类
用于创建一些简单的对象, 使用new class关键字
<?php
// 使用显性类
class Logger
{
public function log($msg)
{
echo $msg;
}
}
$util->setLogger(new Logger());
// 使用匿名类
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
魔术方法
魔术方法是一种特殊的方法,当对对象执行某些操作时会执行,以 方法名以__ 开头
下面都是魔术方法
__construct() 、 __destruct() 、 __call() 、 __callStatic() 、 __get() 、 __set() 、 __isset() 、 __unset() 、 __sleep() 、 __wakeup() 、 __serialize() 、 __unserialize() 、 __toString() 、 __invoke() 、 __set_state() 、 __clone() 、 __debugInfo() 。
除了 __construct(), __destruct() ,和 __clone() 之外的所有魔术方法都 必须 声明为 public, 否则会发出 E_WARNING。
final关键字
final 关键字通过在定义方法和常量之前加上 final 来防止被子类覆盖。 如果一个类被声明为 final,则不能被继承。
对象的比较
- == 同一个类的实例就可以,属性和属性值一样
- ===, 同一个实例