PHP中public,private,protected,abstract等關鍵字用法詳解


PHP中常用的關鍵字

 在PHP中包含了很多對函數和類進行限制的關鍵字,常用的通常有abstract,final,interface,public,protected,private,static等等,下面我們就將對這些進行分析整理各個的用法。

變量與方法的關鍵字public,private,protected

public的權限最大,既可以讓子類使用,也可以支持實例化之后的調用,

protected表示的是受保護的,訪問的權限是只有在子類和本類中才可以被訪問到

private 表示的是私有,只能夠是在當前的類中可以被訪問到

<?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修飾的變量具有與值存儲的功能,例如我們不使用static運行的結果如下:

<?php
function test(){
    $var=1;
    echo $var."</br>";
    $var++;
}
test();// 1
test();// 1
test();// 1
?>

 

 如果我們給變量加上static那么就會變成這樣

<?php
function test(){
    static $var=1;
    echo $var."</br>";
    $var++;
}
test();// 1
test();// 2
test();// 3
?>

 

 這里可能不能夠體會到PHP這樣做的好處,那么我們就先來假設一下讀者也熟悉JS,在JS中是沒有static這個關鍵字的,所以如果我們要來實現一個具有能夠保存每一次程序運算結果作為下一次運算的依據的一個程序我們需要這樣來寫。

    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

 

 class與方法的關鍵字final

final只能夠用來修飾class與function,使用了final之后就不能夠被繼承,例如如下的代碼就會直接報錯

 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,abstract

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
?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM