PHP中的静态延迟绑定(self和static)

2022-03-25  本文已影响0人  PENG先森_晓宇

读这边文章之前,建议大家先去了解下静态延迟绑定的概念。

成员变量

<?php
class a
{
    public $a=1;
    const B=2;
    public function sum()
    {
        return $this->a + self::B;
    }
}

class aa extends a{
    public $a=2;
    const B=3;
}
var_dump((new aa())->sum());

int(4)

可以看到返回值为4,有的人可能疑惑,不应该是5吗?我在子类重新对变量a和常量B进行赋值了。

总结一下几点:

如果父类的常量和静态变量确实想根据子类的变化而变化,这个需要怎么做呢?static登场

<?php
class a
{
    public $a=1;
    const B=2;
    public function sum()
    {
        return $this->a + static::B;
    }
}

class aa extends a{
    public $a=2;
    const B=3;
}
var_dump((new aa())->sum());

int(5)

可以看出只是把self改成了static后,返回值变成5了,发现static可以调用子类的常量了。
总结几点:

<?php
class a
{
    public $a=1;
    const B=2;
    public function sum()
    {
        return $this->a + static::B;
    }
}

class aa extends a{
}
var_dump((new aa())->sum());

int(3)

总结:

new实例

<?php
class a
{
    public function sum()
    {
        return new self();
    }
}

class aa extends a{
}
var_dump((new aa())->sum());

object(a)#2 (0) {
}

看到返回的a类,符合我们上面所说的是,self不被继承,只属于所属类。

<?php
class a
{
    public function sum()
    {
        return new static();
    }
}

class aa extends a{
}
var_dump((new aa())->sum());

object(aa)#2 (0) {
}

可以看出返回的是aa类(子类),也就是说static是被继承的,指的是实例化的那个类。

<?php
class a
{
    public function sum()
    {
        return (new static())->eta();
    }
}

class aa extends a{
    public function eta()
    {
        return 11;
    }
}
var_dump((new aa())->sum());

这个例子看的就很清楚了。

总结

上一篇 下一篇

猜你喜欢

热点阅读