版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
}
未完待续,继续更新......