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()
?>