PHP进阶4 后期静态绑定

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Dote2r/article/details/81150085

                     不积跬步无以至千里不积小流无以成江海


  • 后期静态绑定
class A
{
    public static function call()
    {
        echo "class A" . "<br>";
    }

    public static function test()
    {
        self::call();
        static::call();
    }
}

class B extends A
{
    public static function call()
    {
        echo "class B" . "<br>";
    }
}

B::test();  //  class A class B
  • static并不仅限于静态方法调用,同样适用于非静态函数调用
class A
{
    public function call()
    {
        echo "class A" . "<br>";
    }

    public function test()
    {
        self::call();
        static::call();
    }
}

class B extends A
{
    public function call()
    {
        echo "class B" . "<br>";
    }
}

$b = new B();

$b->test();//  class A class B
  • 后期静态绑定还可以用于对象实例化
class A
{
    public static function create()
    {
        $self = new self();
        $static = new static();
        return [$self, $static];
    }
}

class B extends A
{

}

$arr = B::create();

array_walk($arr, function ($value) {
    var_dump($value);
}); //  object(A)#1 (0) { } object(B)#2 (0) { }

foreach ($arr as $value) {
    var_dump($value);
}   //  object(A)#1 (0) { } object(B)#2 (0) { }
  • laravel中Model类大量使用了后期静态绑定,因为该类为抽象类,所以它的实现类在调用这些函数时,最终动态绑定的都是实现类    而非Model这个抽象类
public static function create(array $attributes = [])
{
    $model = new static($attributes);
    $model->save();
    return $model;
}

public static function firstOrCreate(array $attributes)
{
    if (!is_null($instance = static::where[$attributes])->first()) {
        return $instance;
    }
    return static::create($attributes);
}

未完待续,继续更新......

猜你喜欢

转载自blog.csdn.net/Dote2r/article/details/81150085