面向物件總結(php)
文章來自:原始碼線上https://www.shengli.me/php/59.html;
一、面向物件有一下幾個特性:
-
重用性 ——每個物件模組都可以在專案中重複使用。
-
拓展性——模組上新增新功能是很方便的.
-
靈活性——每個模組都很方便被替換修改。
二、類和物件——類生成物件。
一個類裡面只有屬性和方法,還有一個專案中不能有兩個同名類,但是一個類例項化出來的物件可以有多個。
三、類的屬性和方法
屬性有三種:
(1)public 公共屬性, 都可以訪問;
(2)private 私有的 只有內部可以訪問
(3)protected 受保護 繼承的子類和類本身內部可以訪問,外部訪問不了,如: $computer->output();如果output()方法設了protected,則會報錯。
方法
方法裡面呼叫一個屬性,需要例項化類才能訪問屬性,而$this可以理解為是這個類的一個例項
構造方法與析構方法(例項化時執行和銷燬時執行)
構造方法可以傳遞引數,在例項化時傳入
析構方法:不能有引數
類常量
內部訪問 self::常量名
外部訪問不需要例項化:類名::常量名
一個是物件$this 相當於例項化後,可以說除了靜態和const常量,基本上其他都可以使用this聯絡 ;
self則是類本身 self可以訪問本類中的靜態屬性和靜態方法,可以訪問父類中的靜態屬性和靜態方法。用self時,可以不用例項化的
類的繼承
子類也可以覆蓋父類的方法
子類沒有構造方法時,會呼叫父類的構造方法,有則呼叫自己的,
用關鍵字 parent:: __construct();可以呼叫父類的構造方法
用final關鍵字加在類前面就不會被繼承;加到方法面前,此方法就不會被重寫
名稱空間(解決命名衝突問題)
利用檔案系統不用目錄的原理
被引入的php檔案中加入 namespace 目錄\子目錄;
使用時呼叫:new 目錄\子目錄\類名();如 new com\session\computer();
受名稱空間影響的有,類(包括抽象類,traits),介面,函式,常量(const和define都是用來宣告常量的(它們的區別不詳述),但是在名稱空間裡,define的作用是全域性的,而const則作用於當前空間。)
要注意的是,當前指令碼檔案的第一個名稱空間前面不能有任何程式碼,下面的寫法都是錯誤的:
由於每次呼叫都要寫上路徑,很麻煩,所以出現use的用法(use引入必須帶類名或者函式名)
在呼叫時先用use引入,use 目錄\子目錄\類;還可以起個別名區別 as
重點:在名稱空間裡面呼叫全域性的類,函式,常量的區別,
頁面a定義了名稱空間 namespace venter;引入b頁面(全域性空間)後,此時想呼叫b頁面的類,必須:
New \venter() 加個\代表全域性空間下的
但是呼叫函式和常量時,就不需要加,因為他會自動尋找,向全域性尋找。
類自動載入:
當你例項化一個類時,這個類不存在,就會自動執行我們寫的 function __autoload($className){},在這個自動函式的內部去執行我們想要操作的程式碼,引數就是我們例項化的類名,因此可以根據引數去引入php檔案。
__autoload將被淘汰,使用新的函式 spl_autoload_register();引數可以傳函式名或者匿名函式
利用名稱空間和自動載入實現專案自動引用
1,檔案目錄就和名稱空間名一樣,檔名和類名一樣 new models\imooc() 就是在models檔案下的imooc.php檔案,
2,然後利用spl_autoload_register(function($classname){
include str_replace("\\","/",$classname.".php");
});
這裡的作用是models\imooc替換掉models/imooc.php 引入
而imooc.php檔案中必須命名 namespace models;
static 靜態
當屬性和方法被定義為 static 時就變成類的屬性和方法,不屬於物件的,不需要例項化
子類用parent::呼叫父類的靜態方法
靜態方法不能呼叫非靜態屬性
//因為 $this代表例項化物件,而這裡是類,不知道 $this 代表哪個物件
後期靜態繫結:
魔術方法
__set($var,$val) 設定私有屬性,當外部呼叫設定一個私有屬性時會自動執行這個方法,
__get($var)獲取私有屬性,原理是外部呼叫一個私有屬性時會自動執行這個方法
例子:
__isset($var)方法,當外部呼叫isset($test-abc)訪問一個不能訪問的屬性時,就會自動執行
__unset($var),當外部想刪除一個私用屬性時,會自動執行
__call($func方法名,$arguments引數)當外部呼叫一個沒有定義的方法時,就會呼叫
__callStatic($meethod,$arg)當呼叫一個不存在的靜態方法時,會自動執行 注意在function 前也要加入 static 因為是靜態方法
__invoke($rag)當例項化一個類後,把這個物件變數當成函式呼叫時,會自動執行
例如:$test = new test();
$test("go....");
__toString()當要列印一個物件變數時,會執行,比如 echo($test);
物件拷貝:
淺拷貝:是地址傳遞(物件是淺拷貝)
深拷貝:複製一份,新開闢一塊記憶體(普通變數是深拷貝)
加clone 使物件成為深拷貝,互不影響;
$a = new A();
$b = clone $a;
__clone()當使用clone時,會自動執行
$a = new A();
$b = clone $a; 在A類中會執行__clone()
例子:
型別約束
trait 關鍵字
解決單繼承問題 配合use 使用
介面
可以理解為類的模板 不能直接被例項化
抽象類:
內部有自己的執行方法
單例模式:
讓一個類只會被例項化一次,節省記憶體空間
先把建構函式和克隆函式變成私用屬性
工廠模式:
就是在多處例項化一個類,當這個類名需要改變時,就會導致大量地方需要更改,使用工廠模式避免這種情況發生
/*--------------多型的一個應用例項 模擬USB裝置的使用------------------*/