读这边文章之前,建议大家先去了解下静态延迟绑定的概念。
成员变量
<?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所属类没有被继承时指向的是本身所属类,当被继承时,指的就是子类,可调用子类中的属性和方法
网友评论