本页目录
Static 关键字
-
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
-
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
-
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
-
静态属性不可以由对象通过 -> 操作符来访问。
静态方法
<?phpclass Foo { public static function aStaticMethod() { // ... echo "Hello"; }}
Foo::aStaticMethod();$classname = 'Foo';$classname::aStaticMethod();?>执行以上程序,输出结果为:
HelloHello静态属性
静态属性使用 范围解析操作符 ( :: )访问,不能通过对象操作符( -> )访问。
通过变量来引用一个类是可行的,但这个变量的值不能是一个保留字 (例如 self,parent 和 static)
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
<?phpclass 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";?>执行以上程序,输出结果为:
foofoo
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
foofoofoofoo静态实战实例
<?phpclass 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;?>执行以上程序,输出结果为:
foofooFinal 关键字
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
以下代码执行会报错:
<?phpclass 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()?>