Static 关键字
- 声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
- 静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
- 由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
- 静态属性不可以由对象通过 -> 操作符来访问。
静态方法
<?php
class Foo {
public static function aStaticMethod() {
// ...
echo "Hello";
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();
?>
执行以上程序,输出结果为:
HelloHello
静态属性
静态属性使用 范围解析操作符 ( ::
)访问,不能通过对象操作符( ->
)访问。
通过变量来引用一个类是可行的,但这个变量的值不能是一个保留字 (例如self
,parent
和 static
)
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
<?php
class Foo
{
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
class Bar extends Foo
{
public function fooStatic() {
return parent::$my_static;
}
}
print Foo::$my_static . "n";
$foo = new Foo();
print $foo->staticValue() . "n";
print $foo->my_static . "n"; // 未定义的 "属性" my_static
print $foo::$my_static . "n";
$classname = 'Foo';
print $classname::$my_static . "n";
print Bar::$my_static . "n";
$bar = new Bar();
print $bar->fooStatic() . "n";
?>
执行以上程序,输出结果为:
foo
foo
Notice: Accessing static property Foo::$my_static as non static in /in/V0Rvv on line 23
Warning: Undefined property: Foo::$my_static in /in/V0Rvv on line 23
foo
foo
foo
foo
静态实战实例
<?php
class Foo {
public static $my_static = 'foo';
public function staticValue() {
return self::$my_static;
}
}
print Foo::$my_static . PHP_EOL;
$foo = new Foo();
print $foo->staticValue() . PHP_EOL;
?>
执行以上程序,输出结果为:
foo
foo
Final 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
以下代码执行会报错:
<?php
class BaseClass {
public function test() {
echo "BaseClass::test() called" . PHP_EOL;
}
final public function moreTesting() {
echo "BaseClass::moreTesting() called" . PHP_EOL;
}
}
class ChildClass extends BaseClass {
public function moreTesting() {
echo "ChildClass::moreTesting() called" . PHP_EOL;
}
}
// 报错信息 Fatal error: Cannot override final method BaseClass::moreTesting()
?>