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

public

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

protected

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

private

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

static

static的作用就是能夠實現值或者方法在類中不需實例化的情況下調用,同時static修飾的變量具有與值存儲的功能,例如我們不使用static運行的結果如下,可以記錄當次函數調用次數,限制遞歸調用次數等。

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

在這裏插入圖片描述

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

在這裏插入圖片描述

<?php

class Test
{
    private $private     = 'private';
    protected $protected = 'protected';
    public $public       = 'public';

    private function private_function()
    {
        echo $this->private . PHP_EOL;
    }
    protected function protected_function()
    {
        echo $this->protected . PHP_EOL;
    }
    public function public_function()
    {
        echo $this->public . PHP_EOL;
    }
}

class Test_1 extends Test
{
    static $static = 0;
    public function public_function_1()
    {
        echo $this->public_function();
    }

    public function public_function_2()
    {
        echo $this->private_function();
    }

    public function public_function_3()
    {
        echo $this->protected_function();
    }

    public function test_static_var()
    {
        echo $this::$static . PHP_EOL;
        $this::$static++;
    }

    public function test_static_var1()
    {
        $this::$static++;
        echo $this::$static . PHP_EOL;
    }
}
$Test   = new Test();
$Test_1 = new Test_1();
$Test->public_function();
// $Test->private_function();
// $Test->protected_function();

$Test_1->public_function_1();
$Test_1->public_function_3();
$Test_1->test_static_var();
$Test_1->test_static_var();
$Test_1->test_static_var();
$Test_1->test_static_var1();
echo $Test_1::$static . PHP_EOL;

$Test_1 = new Test_1();
echo $Test_1::$static . PHP_EOL;

在這裏插入圖片描述

class與方法的關鍵字final

final只能夠用來修飾class與function,使用了final之後就不能夠被繼承。

特殊關鍵字interface,abstract

interface的意義在於規範編程的風格,設想一下就是如果是實現了一個接口那麼我們在使用這個接口類的時候就必須要實現裏面的方法,起到了統一命名的作用。

class是可以多繼承接口的,接口與接口之間的單繼承是通過extends來實現的,class與接口之間的關係確立是通過implements。

abstract的作用跟interface其實是一樣的,但是在interface中所有的方法都是必須要實現的,但是在abstract修飾的類中,可以有一個或者是多個的abstract修飾方法,所以我們可以這樣理解,interface就是abstract的一種特殊情況(當所有的方法都是抽象方法,都是必須要實現的)。abstract有以下的這些特徵:

  1. 只要類中有至少一個方法使用了abstract關鍵字,那麼這個類是abstract,要加上相應的關鍵字;

  2. 抽象方法,只有方法的聲明部分,沒有方法體。

但是在我看來,abstract在實際的應用中有這樣的幾種場景

  1. 多人編程的時候規範公共部分的命名規則(不做任何說明,原理跟interface一樣);

  2. 實現不讓父級直接實例化使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章