1. 程式人生 > >面向物件總結(php)

面向物件總結(php)

文章來自:原始碼線上https://www.shengli.me/php/59.html

 

一、面向物件有一下幾個特性

 

  1. 重用性 ——每個物件模組都可以在專案中重複使用。

  2. 拓展性——模組上新增新功能是很方便的.

  3. 靈活性——每個模組都很方便被替換修改。

 

二、類和物件——類生成物件。

 

     一個類裡面只有屬性和方法,還有一個專案中不能有兩個同名類,但是一個類例項化出來的物件可以有多個。

 

三、類的屬性和方法

 

屬性有三種:

 

 (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裝置的使用------------------*/