美文网首页
PHP中的静态延迟绑定(self和static)

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

作者: PENG先森_晓宇 | 来源:发表于2022-03-25 17:44 被阅读0次

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

成员变量

<?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进行赋值了。

总结一下几点:

  • 父类中的常量和静态变量不可在子类中被覆盖。
  • self关键字指的就是所属类(自己原来所在的类),并不会因为子类继承而指向子类的所有属性。$this指的是当前类,子类继承之后会执行子类的所有属性

如果父类的常量和静态变量确实想根据子类的变化而变化,这个需要怎么做呢?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可以调用子类的常量了。
总结几点:

  • self是不被继承的,指self所在类,也只能调用所在类的常量和静态变量。
  • 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)

总结:

  • 可以看到子类中并没有重写父类的常量,static::B则取的是父类中的B常量

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());

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

总结

  • self指向的是本身所属类,不会被继承。
  • 当static所属类没有被继承时指向的是本身所属类,当被继承时,指的就是子类,可调用子类中的属性和方法

相关文章

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

    读这边文章之前,建议大家先去了解下静态延迟绑定的概念。 成员变量 可以看到返回值为4,有的人可能疑惑,不应该是5吗...

  • PHP static关键字的用法及注意点

    PHP static关键字用来定义静态方法及属性,在类中可用来延迟静态绑定以及在函数中修饰变量。 1:先来谈谈st...

  • PHP中static和self的区别

    PHP中static和self的区别 使用 self:: 或者__CLASS__对当前类的静态引用,取决于定义当前...

  • static延迟静态绑定

  • PHP中的延迟静态绑定

    引入: PHP继承模型中有个遗留很久的问题。那就是父类中引用拓展类的最终状态比较困难。 接下来看用两个例子来说明 ...

  • php中"self"和"this", "->"和"::"符号的区

    参考文章:php 中self,this的区别和实地操作 1.self ①self可以访问本类中的静态属性和静态方法...

  • PHP静态延迟绑定

    1、什么是静态延时绑定 1)自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内...

  • 关于self和static的静态调用

    本文主题是后期静态绑定,探讨在继承范围内,通过self和static调用静态方法时,实际指向的类是父类还是子类。 ...

  • php static self 应该要掌握的区别

    php static 和 self 都可以调用类中静态的属性和方法,但是他们还是具备一些本质上的不同,稍微不注意就...

  • PHP的'静态延迟绑定'

    今天,几个朋友在一起吹牛逼,一个朋友问我什么是静态绑定,我当时懵逼了,后面回来一查,这玩意儿不就是以前写代码的时候...

网友评论

      本文标题:PHP中的静态延迟绑定(self和static)

      本文链接:https://www.haomeiwen.com/subject/hpcdjrtx.html