php類別程式碼中常看到"::"的運算子,這個是作用域限定運算符,是用一個雙冒號"::"表示,它用來置頂類別中不同作用域的層級。左邊是作用域右邊是訪問作用域的成員。
在php中定義的作用域有self和parent兩種(在php6中提供了static作用域)。
self:表示目前類別的作用域,與this不同的是它不表示類別的某個特定實例,在類別之外的程式碼中不能使用self,而且它不能識別自己在繼承中層次的位置。也就是說,當在擴展類別中使用self時,它呼叫的不是父類別的方法,而是擴展類別的重載的方法。
parent:表示目前類父類的作用域,其餘的跟self特性一樣。
舉例說明php雙冒號::運算子:
<?php class forasp{ static $url="http://blog.csdn.net/abandonship"; static $webname = "PHP学习之双冒号的用法"; public function writeurl(){ echo self::$url;//调用自己的内容 } public function writewebname(){ echo "测试子类调用父类内容"; } } class cn extends forasp{ function father(){ parent::wirtewebname(); } } $a = new forasp();//实例化父类 $a->writeurl();//调用自身内容 $b = new cn(); $b->writewebname();//调用父类内容 ?>
在呼叫靜態方法中也可以使用::來呼叫類別中的靜態方法或屬性,這樣可以減少資源使用,因為每個類別的實例都會佔有一部分資源。
php6中提出static::作用域,是我們不再需要self::和parent::。希望指向最終的實作功能的類別時,就用static::,這個限定符會在程式碼執行前立即計算出繼承層中最後那個類別的成員,這個過程叫做延遲綁定。
「雙冒號運算子」也或稱為「作用域限定運算子」(Scope Resolution Operator)可以存取靜態、const和類別中重寫的屬性與方法。
在類別定義外使用的話,使用類別名稱呼叫。在PHP 5.3.0,可以使用變數來代替類別名稱。
Program List:用變數在類別定義外部存取
<?php class Fruit { const CONST_VALUE = 'Fruit Color'; } $classname = 'Fruit'; echo $classname::CONST_VALUE; // As of PHP 5.3.0 echo Fruit::CONST_VALUE; ?>
Program List:在類別定義外部使用雙冒號(::)
<?php class Fruit { const CONST_VALUE = 'Fruit Color'; } class Apple extends Fruit { public static $color = 'Red'; public static function doubleColon() { echo parent::CONST_VALUE . "\n"; echo self::$color . "\n"; } } Apple::doubleColon(); ?>
程式運作結果:
Fruit Color RedList方法
Php代碼
<?php class Fruit { protected function showColor() { echo "Fruit::showColor()\n"; } } class Apple extends Fruit { // Override parent's definition public function showColor() { // But still call the parent function parent::showColor(); echo "Apple::showColor()\n"; } } $apple = new Apple(); $apple->showColor(); ?>
程式運作結果:
Fruit::showColor()
Php程式碼
<?php class Apple { public function showColor() { return $this->color; } } class Banana { public $color; public function __construct() { $this->color = "Banana is yellow"; } public function GetColor() { return Apple::showColor(); } } $banana = new Banana; echo $banana->GetColor(); ?>
程式運作結果:
Banana is yellow
Program List:呼叫基類的方法