從PHP 5 開始 類的定義又增加了 abstract、final和static 關鍵字
1.abstract 關鍵字
面向對象程式通過類的分層結構建構起來.在單重繼承語言如PHP中,類的繼承是樹狀的. 一個根類有一個或更多的子類,再從每個子類繼承出一個或更多下一級子類. 當然,可能存在多個根類,用來實作不同的功能. 用abstract定義的類不能被執行個體化。有一個函數為abstract的類,這個類就必須是abstract,子類必須
定義所有的父類中的abstract函數,子類中函數的作用域隻能被擴大,不能縮小。 在一個良好設計的體系中,每個根類都應該有一個有用的接口,可以被應用代碼所使用.而抽象類就可以提供多個實用的接口. 如果你建立了一個隻有抽象方法的類,那麼你就定義了一個接口(interface).
在抽象類中定義的方法,也都是抽象方法, 當然,抽象方法與普通的方法不一樣,它隻是子類中普通方法的一個占位符(隻是占個地主不啟作用),沒有任何代碼,也沒有"{}"包含,而是以";"結束的.
abstract class aaa{
abstract function bbb(); // 這裡沒有代碼的部分
}
當然,如果一個類中有一個或多個抽象的方法,那麼這個類就成了抽象類.抽象類不能執行個體化,隻能繼承, 然後,執行個體化子類.值得注意的是,它的子類必須重複寫所有方法(all method),這樣,子類就成為普通的類,才可以執行個體化. 否則,子類中隻要有一個抽象方法,那麼子類必須聲明是抽象類,在class關鍵字前加上abstract.
抽象的類的聲明方法:
(1).使用abstact限定語.
//定義抽象類aaa為母類
abstract class aaa{
abstract function bbb();
abstract function ccc();
}
//用 extends 關鍵字 定義普通子類 childfromaaa
//繼承aaa抽象類
class childfromaaa extends aaa{
//重寫所有抽象類中的方法
public function bbb(){
//.....
}
public function ccc(){
//...
}
}
//執行個體化子類
$child=new childfromaaa;//right
另外的示範代碼:
<?php
abstract class AbstractClass
{
// Force Extending class to define this method
abstract protected function getValue ();
abstract protected function prefixValue ( $prefix );
// Common method
public function printOut () {
print $this -> getValue () . "/n" ;
}
}
class ConcreteClass1 extends AbstractClass
{
protected function getValue () {
return "ConcreteClass1" ;
}
public function prefixValue ( $prefix ) {
return "{$prefix}ConcreteClass1" ;
}
}
class ConcreteClass2 extends AbstractClass
{
public function getValue () {
return "ConcreteClass2" ;
}
public function prefixValue ( $prefix ) {
return "{$prefix}ConcreteClass2" ;
}
}
$class1 = new ConcreteClass1 ;
$class1 -> printOut ();
echo $class1 -> prefixValue ( 'FOO_' ) . "/n" ;
$class2 = new ConcreteClass2 ;
$class2 -> printOut ();
echo $class2 -> prefixValue ( 'FOO_' ) . "/n" ;
?>
The above example will output:
ConcreteClass1
FOO_ConcreteClass1
ConcreteClass2
FOO_ConcreteClass2
(2).PHP中有interface和implements關鍵字.你可以用interface來代替抽象類,用implements來代替extends來說明你的類定義或使用一個接口.
//定義抽象基類
interface Foo{
function a(Foo $foo);
}
//定義另一個抽象類
interface Bar{
function b(Bar $bar);
}
//定義子類childfromaaa
//繼承aaa抽象類(接口)
//實作多類繼承
class FooBar implements Foo,Bar{
functiona(Foo$foo){
//...
}
functionb(Bar$bar){
//...
}
}
$a=newFooBar;
$b=newFooBar;
$a->a($b);
$a->b($b);
2.final
final/final關鍵字
PHP5中新增加了final關鍵字,它可以加在類或類方法前。辨別為final的類方法,在子類中不能被覆寫。辨別為final的類,不能被繼承,而且其中的方法都預設為final類型。
Final方法:
<?php
classFoo{
final function bar(){
//…
}
}
?>
Final類:
<?php
final class Foo{
//classdefinition
}
//下面這一行是錯誤的
//classBork extends Foo{}
?>
3.static
當static 關鍵字應用在變量上.. 靜态變量僅在局部函數域中存在,但當程式執行離開此作用域時,其值并不丢失。看看下面的例子: <?PHP
function Test()
{
static $w3sky = 0;
echo $w3sky;
$w3sky++;
}
?> 每次執行函數 $w3sky都會自動增加1 當static關鍵字應用在類的屬性 和方法上..
static 關鍵字在類中是,描述一個成員是靜态的,static能夠限制外部的通路,因為static後的成員是屬于類的,是不屬于任何對象執行個體,其他類是無法通路 的,隻對類的執行個體共享,能一定程式對該成員盡心保護。類的靜态變量,非常類似全局變量,能夠被所有類的執行個體共享,類的靜态方法也是一樣的,類似于全局函 數。類的靜态方法能通路類的靜态的屬性。另外說明的是,static的成員,必須使用self來通路,使用this會出錯。
1:class classname
{
private static $test1; // 用來定義靜态屬性 并用private 保護其不備內建類或執行個體幹擾
public $test2;
public static function Initialization()
{
return self::$test1;
}
public function test (){
return self::$test1;
}
}
$test = New classname();
$test->test(); //調用公共方法
$test->test2;
以下是不允許的
$test->Initialization();
$test->test1;