自动加载
注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载。通过注册自动加载器,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类;不可用于PHP的CLI交互模式
// spl_autoload_register()
<?php
spl_autoload_register(function ($class_name) {
require_once $class_name . '.php';
});
$obj = new MyClass1();
$obj2 = new MyClass2();
spl_autoload_register(function ($name) {
var_dump($name);
});
class Foo implements ITest {
}
Static静态方法
声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问;$this 在静态方法中不可用
可以使用范围解析操作符 (::)访问静态成员,类常量
<?php
class Product {
private ?int $id;
private ?string $name;
private function __construct(?int $id = null, ?string $name = null) {
$this->id = $id;
$this->name = $name;
}
public static function fromXml(string $xml): static {
$data = convert_xml_to_array($xml);
$new = new static();
$new->id = $data['id'];
$new->name = $data['name'];
return $new;
}
}
匿名类
PHP 7开始支持匿名类。匿名类可以创建一次性的简单对象。也可以扩展(extend)其他类、实现接口(implement interface),以及像其他普通的类一样使用trait
<?php
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});
class SomeClass {}
interface SomeInterface {}
trait SomeTrait {}
//传递参数到匿名类的构造器
var_dump(new class(10) extends SomeClass implements SomeInterface {
private $num;
public function __construct($num)
{
$this->num = $num;
}
use SomeTrait;
});
对象复制
如果对象A中保存着对象B的引用,当你复制对象A时,你想其中使用的对象不再是对象B而是B的一个副本,那么你必须得到对象A的一个副本。当复制完成时,如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用,可用于修改属性的值(如果有必要的话)。
<?php
class SubObject
{
static $instances = 0;
public $instance;
public function __construct() {
$this->instance = ++self::$instances;
}
public function __clone() {
$this->instance = ++self::$instances;
}
}
class MyCloneable
{
public $object1;
public $object2;
function __clone()
{
// 强制复制一份this->object, 否则仍然指向同一个对象
$this->object1 = clone $this->object1;
}
}
$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("Original Object:\n");
print_r($obj);
print("Cloned Object:\n");
print_r($obj2);
?>
Original Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 1
)
[object2] => SubObject Object
(
[instance] => 2
)
)
Cloned Object:
MyCloneable Object
(
[object1] => SubObject Object
(
[instance] => 3
)
[object2] => SubObject Object
(
[instance] => 2
)
)
函数
获取对象信息
//基于用户定义的类 original 创建别名 alias。 这个别名类和原有的类完全相同。
class_alias(string $original , string $alias , bool $autoload = true):bool
original 原有的类。
alias 类的别名。
autoload 如果原始类没有加载,是否使用自动加载(autoload)
//后期静态绑定("Late Static Binding")类的名称,获取静态方法调用的类名
get_called_class():string
//返回由类的方法名组成的数组,如果出错,则返回 null
get_class_methods(mixed $class_name):array
//返回由类的默认公有属性组成的关联数组
get_class_vars(string $class_name):array
//返回对象实例 object 所属类的名字,返回对象实例 object 所属类的名字。 如果 object 不是一个对象则返回 false。如果在一个类里,省略了参数 object, 则返回当前所在类的名称。如果 object 是命名空间中某个类的实例,则会返回带上命名空间的类名。
get_class(object $object = null):string
//返回由当前脚本中已定义类的名字组成的数组
get_declared_classes():array
//返回一个数组包含所有已声明的接口
get_declared_interfaces():array
//返回所有已定义的 traits 的数组
get_declared_traits():array
//返回由 obj 指定的对象中定义的属性组成的关联数组
get_object_vars(object $obj):array
//如果 obj 是对象,则返回对象实例 obj 所属类的父类名。如果 obj 是字符串,则返回以此字符串为名的类的父类名。
get_parent_class(mixed $obj = ?):string
判断类
//检查指定的类是否已定义
class_exists(string $class_name , bool $autoload = true):bool
class_name 类名。名字的匹配是不分区大小写的。
autoload 是否默认调用__autoload
//检查类的方法是否存在于指定的object中。
method_exists(mixed $object, string $method_name):bool
object 对象示例或者类名。
method_name 方法名
//检查指定的trait是否存在,发生错误的时候返回 null。
trait_exists(string $traitname , bool $autoload = ?):bool
traitname 待检查的 trait 的名称
autoload 如果尚未加载,是否使用自动加载(autoload)
//检查接口是否已被定义
interface_exists(string $interface_name , bool $autoload = true):bool
interface_name 接口名。
autoload 默认是否调用__autoload。
//如果object是该类或该类是此对象的父类则返回true
is_a(mixed $object , string $class_name , bool $allow_string = false):bool
object 类名或者实例对象。
class_name 类名
allow_string 如果本参数设置为 false,object 就不允许传入字符串类名。 这也会在类不存在时,阻止调用自动加载器(autoloader)。
//如果对象object所属类是类 class_name 的子类,则返回true,否则返回false。
is_subclass_of(object $object , string $class_name):bool
//检查对象或类是否具有该属性,检查给出的property是否存在于指定的类中,如果不存在则返回 false,出错返回 null
property_exists(mixed $class , string $property):bool
class 字符串形式的类名或要检查的类的一个对象
property 属性的名字