2021-03-08

自动加载

注册任意数量的自动加载器,当使用尚未被定义的类(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 属性的名字

 

{/if}