php 继承中有一个难以取到访问类静态属性(或方法)的问题,例子如下:
<?php
class A
{
static $name = 'a';
public static function create()
{
return new self();
}
public function __construct()
{
echo static::$name;
}
}
class B extends A
{
static $name = 'b';
}
B::create();
?>
输出结果将会是a
就是说,在调用new self() 时,实例化的其实是类A
怎么解决这个问题呢?php 5.4以后增加了关键字static用于延迟绑定的功能。示例:
<?php
class A
{
static $name = 'a';
public static function create()
{
return new static();
}
public function __construct()
{
echo static::$name;
}
}
class B extends A
{
static $name = 'b';
}
B::create();
?>
这回输出是b啦
总结一下说就是,static类似于self,但它指的是被调用的类而不是包含类(父类或接口类)。
另外还发现,抽象类是不能直接访问到静态属性和方法滴,会报错。。记一下~
abstract class A ...
A::create();
Fatal error: Cannot instantiate abstract class A