AImager

ClassName::class

获取ClassName的名称

访问控制

  • public: 公有方法,默认,可任意访问
  • protected: 保护,只有自身和子类父类具有访问权限
  • private: 私有,只有自身具有访问权限

抽象和接口的比较

  • 接口关键字为interface;抽象为abstract
  • 抽象类不能实例化;接口也不行
  • 含有抽象方法的必须是抽象类
  • 抽象类的子类必须实现其所有抽象方法;接口的子类则必须实现其所有方法
  • 接口定义的所有方法都必须是公有的
  • 接口通过implements实现,也可以通过extends继承;抽象类只能用于继承
  • 通过implements可以实现多个接口;extends只能继承一个

triat

PHP5.4.0开始支持的特性,用于减少单继承的限制,增加代码复用性。注意优先级问题,当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

trait HelloWorld {
    public function sayHello() {
        echo 'Hello World!';
    }
}

class TheWorldIsNotEnough {
    use HelloWorld;
    public function sayHello() {
        echo 'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();


// 输出
// Hello Universe!

匿名类

$val = new class {
    public function func() {
        echo "test";
    }
};

$val->func();

遍历对象

foreach或者继承Iterator接口的实现方式都可以

重载

PHP的重载是动态的创建类方法,这和C++等语言不一样。实现的方式是魔术方法,如__set__get等。

final

PHP5以上支持的关键字,如果一个类方法声明为final,那这个方法就不能被之类覆盖,如果一个类声明为final,那这个类就不能被继承。

clone

赋值不能完全拷贝对象,类似于

<?php
class cla {
    public $one;
    public $two;

    public function __construct() {
        $this->two = &$this->one;
    }
}

$val1 = new cla;
$val2 = clone $val1;
$val2->two = 2;
echo $val2->one;

序列化

序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。使用serialize()进行序列化,unserialize()进行反序列化。