在下面的示例中使用self
和static
有什么区别?
class Foo
{
protected static $bar = 1234;
public static function instance()
{
echo self::$bar;
echo "\n";
echo static::$bar;
}
}
Foo::instance();
产生
1234
1234
发布于 2020-09-26 08:49:04
我有一个小例子来说明self
和static
之间的区别。使用static::
执行后期静态绑定,从而绑定来自子类的变量值。
class A { // Base Class
protected static $name = 'ClassA';
public static function getSelfName() {
return self::$name;
}
public static function getStaticName() {
return static::$name;
}
}
class B extends A {
protected static $name = 'ClassB';
}
echo B::getSelfName(); // ClassA
echo B::getStaticName(); // ClassB
发布于 2019-11-20 04:41:39
正如前面提到的,其中一个主要区别是static
允许延迟静态绑定。我发现的最有用的场景之一是为Singleton类创建基类:
class A { // Base Class
protected static $name = '';
protected static function getName() {
return static::$name;
}
}
class B extends A {
protected static $name = 'MyCustomNameB';
}
class C extends A {
protected static $name = 'MyCustomNameC';
}
echo B::getName(); // MyCustomNameB
echo C::getName(); // MyCustomNameC
在基类中使用return static::$name
将返回扩展时静态附加的内容。如果您使用return self::$name
,那么B::getName()
将返回一个空字符串,因为这是在基类中声明的。
https://stackoverflow.com/questions/11710099
复制相似问题