php實現面向對象的一個顯著特征是大量使用關鍵字,本文將詳細介紹關鍵字
public表示公有,它具有最大的訪問權限,被定義為公有的類成員可以在任何地方被訪問
如果屬性用 var 定義,則被視為公有,如果方法沒有設置關鍵字,則該方法默認為公有
<?php class demo{ public $public = 1; function test($var){ echo "{$var}000"; } } $d1 = new demo; $d1->test($d1->public);//1000 ?>
protected表示受保護的,被定義為受保護的類成員則可以被其自身以及其子類和父類訪問
<?php class demo{ protected function fn(){ echo '111'; } } class demo1 extends demo{ function test(){ parent::fn(); } } $d1 = new demo1; $d1->test();//111 ?>
private表示私有的,被定義為私有的類成員則只能被其定義所在的類訪問
<?php class demo{ private $private = 1; function test(){ echo($this->private); } } $d1 = new demo; $d1->test();//1 ?>
PHP5新增了final關鍵字,它只能用來修飾類和方法,不能使用final這個關鍵字來修飾成員屬性,因為final是常量的意思,我們在PHP裡定義常量使用的是define()函數和const關鍵字,所以不能使用final來定義成員屬性
如果父類中的方法被聲明為final,則子類無法覆蓋該方法。如果一個類被聲明為 final,則不能被繼承
<?php class BaseClass { public function test() { echo "BaseClass::test() called\n"; } final public function moreTesting() { echo "BaseClass::moreTesting() called\n"; } } class ChildClass extends BaseClass { public function moreTesting() { echo "ChildClass::moreTesting() called\n"; } } // Results in Fatal error: Cannot override final method BaseClass::moreTesting() ?>
static關鍵字表示靜態的意思,用於修飾類的成員屬性和成員方法(即為靜態屬性和靜態方法)
類中的靜態屬性和靜態方法不用實例化(new)就可以直接使用類名訪問
[注意]靜態屬性不能通過一個類已實例化的對象來訪問,但靜態方法可以
由於靜態方法不需要通過對象即可調用,所以偽變量 $this 在靜態方法中不可用,靜態屬性不可以由對象通過 -> 操作符來訪問
用靜態方式調用一個非靜態方法會導致一個 E_STRICT 級別的錯誤
就像其它所有的 PHP 靜態變量一樣,靜態屬性只能被初始化為文字或常量,不能使用表達式。所以可以把靜態屬性初始化為整數或數組,但不能初始化為另一個變量或函數返回值,也不能指向一個對象
<?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' $foo = new Foo(); print $foo->staticValue() . "\n";//'foo' print $foo::$my_static . "\n";//'foo' print $foo->my_static . "\n"; //報錯 ?>
可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用$符號,而是使用const
常量的值必須是一個定值,不能是變量,類屬性,數學運算的結果或函數調用
<?php class MyClass { const constant = 'constant value'; function showConstant() { echo self::constant . "\n"; } } echo MyClass::constant . "\n";//'constant value' $classname = "MyClass"; echo $classname::constant . "\n"; //'constant value' $class = new MyClass(); $class->showConstant();//'constant value' echo $class::constant."\n";//'constant value' ?>
當一個方法在類定義內部被調用時,有一個可用的偽變量this,特殊對象的引用this就是在對象內部的成員方法中,代表本對象的一個引用,但只能在對象的成員方法中使用,不管是在對象內部使用$this訪問自己對象內部成員。還是在對象外部通過對象的引用名稱訪問對象中的成員,都需要使用特殊的運算符“->”來完成訪問
[注意]this在靜態方法中不可用
<?php class A { function foo() { if (isset($this)) { echo '$this is defined ('; echo get_class($this); echo ")\n"; } else { echo "\$this is not defined.\n"; } } } class B { function bar() { // Note: the next line will issue a warning if E_STRICT is enabled. A::foo(); } } $a = new A(); $a->foo();//$this is defined (A) A::foo();//$this is not defined. $b = new B(); $b->bar();//$this is defined (B) B::bar();//$this is not defined. ?>
在類的方法中,不能用this來引用靜態變量或靜態方法,而需要用self來引用
<?php class MyClass { const constant = 'constant value'; static function showConstant() { echo self::constant . "\n"; } } $var = new MyClass; echo $var->showConstant();//constant value ?>
parent用於調用父類中定義的成員方法或常量
<?php class MyClass{ function fn(){ echo('111'); } const A = 'a'; } class Class1 extends MyClass{ function test(){ echo parent::fn().parent::A; } } $var = new Class1; $var->test();//111a ?>