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

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

成员变量

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登场

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是可以被继承的,可以调用子类中常量和静态变量
a + static::B;
    }
}

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

int(3)

总结:

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

new实例

sum());

object(a)#2 (0) {
}

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

sum());

object(aa)#2 (0) {
}

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

eta();
    }
}

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

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

总结

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

你可能感兴趣的:(PHP中的静态延迟绑定(self和static))