在PHP中包含了不少對函數和類進行限制的關鍵字,經常使用的一般有abstract,final,interface,public,protected,private,static等等,下面咱們就將對這些進行分析整理各個的用法。php
public的權限最大,既可讓子類使用,也能夠支持實例化以後的調用,編程
protected表示的是受保護的,訪問的權限是隻有在子類和本類中才能夠被訪問到函數
private 表示的是私有,只可以是在當前的類中能夠被訪問到this
<?php // /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; public function printHello() { echo $this->public; echo $this->protected; echo $this->private; } protected function pro_test(){ var_dump(1); } } $obj = new MyClass(); echo $obj->public; // 這行能被正常執行 //echo $obj->protected; // 這行會產生一個致命錯誤 //echo $obj->private; // 這行也會產生一個致命錯誤 $obj->printHello(); // 輸出 Public、Protected 和 Private $obj->pro_test();//直接報錯 ?>
static的做用就是可以實現值或者方法在類中不需實例化的狀況下調用,同時static修飾的變量具備與值存儲的功能,例如咱們不使用static運行的結果以下:spa
<?php function test(){ $var=1; echo $var."</br>"; $var++; } test();// 1 test();// 1 test();// 1 ?>
若是咱們給變量加上static那麼就會變成這樣code
<?php function test(){ static $var=1; echo $var."</br>"; $var++; } test();// 1 test();// 2 test();// 3 ?>
這裏可能不可以體會到PHP這樣作的好處,那麼咱們就先來假設一下讀者也熟悉JS,在JS中是沒有static這個關鍵字的,因此若是咱們要來實現一個具備可以保存每一次程序運算結果做爲下一次運算的依據的一個程序咱們須要這樣來寫。blog
var glo=0; function test(){ glo++; document.writeln(glo); } test(); test(); test();
這樣就會把glo泄漏到全局變量中,若是生成的變量比較多,就會致使內存泄露(內存泄漏所指代的就是變量佔用過多的內存空間沒有別釋放)繼承
<script> var glo=0; function test(){ glo++; document.writeln(glo); } test();// 1 test();// 2 test();// 3 </script>
因此相比於在沒有定義static的語言中,它具備一個優點是保持變量,不泄露內存,也不容易致使全局變量被誤用(由於做用域不在全局)接口
$age=0; $age++; function test1() { static $age = 100; $age++; echo $age."</br>"; } function test2() { static $age = 1000; $age++; echo $age."</br>"; } test1(); // 101 test2(); // 1001
final只可以用來修飾class與function,使用了final以後就不可以被繼承,例如以下的代碼就會直接報錯ip
class BaseClass { public $public = '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"; } }
interface的意義在於規範編程的風格,設想一下就是若是是實現了一個接口那麼咱們在使用這個接口類的時候就必需要實現裏面的方法,起到了統一命名的做用。
class是能夠多繼承接口的,接口與接口之間的單繼承是經過extends來實現的,class與接口之間的關係確立是經過implements
示例代碼:
<?php interface testA{ function funcA(); } interface testB{ function funcB(); } interface testC extends testA { function funcC(); } class run implements testC ,testB { public function funcA() { // TODO: Implement funcA() method. } public function funcB() { // TODO: Implement funcB() method. } public function funcC() { // TODO: Implement funcC() method. } } ?>
abstract的做用跟interface實際上是同樣的,可是在interface中全部的方法都是必需要實現的,可是在abstract修飾的類中,能夠有一個或者是多個的abstract修飾方法,因此咱們能夠這樣理解,interface就是abstract的一種特殊狀況(當全部的方法都是抽象方法,都是必需要實現的)。abstract有如下的這些特徵:
1. 只要類中有至少一個方法使用了abstract關鍵字,那麼這個類是abstract,要加上相應的關鍵字
2. 抽象方法,只有方法的聲明部分,沒有方法體。
可是在我看來,abstract在實際的應用中有這樣的幾種場景
1. 多人編程的時候規範公共部分的命名規則(不作任何說明,原理跟interface同樣)
2. 實現不讓父級直接實例化使用
樣式代碼以下:
<?php abstract class shopping { public function buy() { echo "buy"; } public function loan() { echo "loan"; } } class leslieBuy extends shopping { } //$test1=new shopping;//直接語法錯誤 $leslieSie = new leslieBuy; $leslieSie->loan();//打印出loan ?>