7. 類與對象

基本概念

參考:7.1 類的概念

訪問控制

針對對象的屬性和方法,可以使用訪問控制來限制它的作用域

public:公開的,在類中、實例中、子類中都能訪問

protected:受保護的,在類中、子類中可以訪問

private:私有的,僅能在類中訪問

static:靜態的,在哪都能用

類的屬性在定義時必須指定訪問控制級別,像下面這樣:

// 類
class Foobar{
    // 我將報錯
    $abc = "123";

    // 我不會報錯
    public $test = 456;
}

類的方法如果不指定訪問控制級別,那么默認就是 public 公開的。

屬性常量

參考:7.2 類的屬性

對象繼承

參考:7.3 對象繼承

自動加載

參考:7.4 類的自動加載

構造和析構

參考:7.5 構造和析構

范圍解析操作符

參考:7.6 范圍解析操作符

靜態屬性

一個類的屬性和方法可以使用 static 標記為靜態的,如沒有顯示指定訪問控制級別,則默認為公開的。

靜態成員需要使用 :: 范圍解析操作符 來訪問。

靜態成員可以不用實例化對象而直接訪問,但靜態屬性不能使用實例化對象來訪問,而靜態方法可以。

抽象類

參考:7.7 抽象類

對象接口

參考:7.8 對象接口

Trait

參考:7.9 Trait

匿名類

參考:7.10 匿名類

重載

參考:7.11 重載

遍歷對象

參考:7.12 遍歷對象

魔術方法

參考:7.13 魔術方法

Final 關鍵字

final 關鍵字可以應用到類或方法上
final 應用在類上時,該類無法被繼承
final 應用在方法上時,該方法無法被重寫

對象復制

對象的賦值通常是引用的,通過 clone 關鍵字可獲取一個新的拷貝,使用 clone 后, 系統會先執行該對象的 __clone 方法,可以根據需要在該魔術方法中執行一些修改屬性的操作。

// 定義類
class Example{
    // 我的屬性
    private $foo = 123;
    private $bar = 'abc';
    // clone
    public function __clone(){
        $this->foo = 789;
    }
}
// 實例化
$exam = new Example();
// object(Example)#1 (2) { ["foo":"Example":private]=> int(123) ["bar":"Example":private]=> string(3) "abc" }
var_dump($exam);

// 執行復制
$temp = clone $exam;
// object(Example)#2 (2) { ["foo":"Example":private]=> int(789) ["bar":"Example":private]=> string(3) "abc" }
var_dump($temp);

對象比較

兩個對象的屬性和值相同,且是同一個類的實例,那么在執行 == 比較時,相等。
兩個對象的屬性和值相同,且是同一個類的同一個實例,那么在執行 === 比較時,相等。
判斷一個對象是否為某一個類的實例,可以使用 instanceof 關鍵字。

類型約束

函數或類的方法可以對參數進行類型約束,調用時必須傳遞指定類型的數據,否則報錯。

// 定義類
class Example{
    // 給方法的參數增加類型約束
    public static function fn(string $str){
        echo $str;
    }
}
// 給函數的參數增加類型約束
function fun(int $num){
    echo $num;
}
// 調用
Example::fn('hello world');
fun(123);

后期靜態綁定

static 不在會被解析成定義當前方法所在的類了,而是根據實際運行時來計算。

當一個類的方法中使用了 static 關鍵字,那么到時候調用這個方法時,static 的指向并非是當前類,有可能指向其他父類。

static 的指向是上一個 非轉發調用 時系統自動保存下來的類,轉發調用 指的是 self::parent::static:: 等。

后期靜態綁定這個概念通常會出現在繼承關系中。

$this 代表的是當前實例

self 代表的是當前類、通常用于調用當前類的靜態屬性

parent 代表父類

對象的序列化

可以使用 serialize() 將對象進行序列化成字符串,然后將字符串保存,在另外一個腳本中使用 unserialize() 將保存的字符串讀取傳遞進去,重新得到該對象。

需要注意的是,在 unserialize() 之前,記得 include 將類的定義文件引入。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • 國家電網公司企業標準(Q/GDW)- 面向對象的用電信息數據交換協議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,178評論 6 13
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • (一)Java部分 1、列舉出JAVA中6個比較常用的包【天威誠信面試題】 【參考答案】 java.lang;ja...
    獨云閱讀 7,142評論 0 62
  • 最近遲到次數卻越來越多了,每次遲到心里也都會不好意思,回到辦公室說今天早上娃娃又不愿早起之類的,同事說,小孩子都起...
    二解閱讀 550評論 1 1