天天看點

PHP abstract final static 關鍵字

從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;