Static 關(guān)鍵字
- 聲明類屬性或方法為 static(靜態(tài)),就可以不實(shí)例化類而直接訪問。
- 靜態(tài)屬性不能通過一個類已實(shí)例化的對象來訪問(但靜態(tài)方法可以)。
- 由于靜態(tài)方法不需要通過對象即可調(diào)用,所以偽變量 $this 在靜態(tài)方法中不可用。
- 靜態(tài)屬性不可以由對象通過 -> 操作符來訪問。
靜態(tài)方法
<?php
class Foo {
public static function aStaticMethod() {
// ...
echo "Hello";
}
}
Foo::aStaticMethod();
$classname = 'Foo';
$classname::aStaticMethod();
?>
執(zhí)行以上程序,輸出結(jié)果為:
HelloHello
靜態(tài)屬性
靜態(tài)屬性使用?范圍解析操作符?(?::
?)訪問,不能通過對象操作符(?->
?)訪問。
通過變量來引用一個類是可行的,但這個變量的值不能是一個保留字 (例如self
,parent
和?static
)
自 PHP 5.3.0 起,可以用一個變量來動態(tài)調(diào)用類。但該變量的值不能為關(guān)鍵字 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";
?>
執(zhí)行以上程序,輸出結(jié)果為:
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
靜態(tài)實(shí)戰(zhàn)實(shí)例
<?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;
?>????
執(zhí)行以上程序,輸出結(jié)果為:
foo
foo
Final 關(guān)鍵字
PHP 5 新增了一個 final 關(guān)鍵字。如果父類中的方法被聲明為 final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承。
以下代碼執(zhí)行會報錯:
<?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()
?>