摘要:使用了一段時間從對的不了解再到使用覺得挺好特寫下看面向?qū)ο笪沂强吹倪@個雞啄米的并不是為了面向?qū)ο蠖嫦驅(qū)ο蠖菫榱诉_到代碼的重用性靈活性擴展性對象和類從先有對象才有人類這個來說有點不合理的合理類具有相同屬性的一組對象的集合對象類實例化之后就
PHP 使用了一段時間, 從對OOP的不了解, 再到使用, 覺得挺好, 特寫下
看面向?qū)ο? 我是看的這個雞啄米的c++, http://www.jizhuomi.com/softw...
OOP并不是為了面向?qū)ο蠖嫦驅(qū)ο? 而是為了達到代碼的重用性、靈活性、擴展性
對象和類從先有對象才有人類, 這個來說, 有點不合理的合理
類:具有相同屬性的一組對象的集合
對象:類實例化之后就是對象
看下一般的類的定義
name = $name; $this->age = $age; $this->sex = $sex; } // 析構(gòu)函數(shù) function __destruct(){ echo "byebye "; } // 成員方法 function eat(){ echo "my name is ". $this->name; } function sleep(){ echo "i am sleeping"; } } // 類的實例化 $jaime = new Person("jaime", "man", 24); $jaime->eat(); ?>
保存為index.php, 在命令窗口輸入
$ php index.php my name is jaime byebye
如果
$jaime = new Person("jaime", "man", 24);
改為
$jaime = new Person("jaime", "man");
則會觸發(fā)異常, 會有以下的消息出來, 包括錯誤信息, 錯誤行數(shù), 和堆棧信息
$ php index.php Fatal error: Uncaught exception "Exception" with message "must set name , sex, age" in E: etindex.php on line 15 Exception: must set name , sex, age in E: etindex.php on line 15 Call Stack: 0.0025 242440 1. {main}() E: etindex.php:0 0.0025 243016 2. Person->__construct() E: etindex.php:30對象和內(nèi)存
說點理論上的東西吧,
內(nèi)存的分類:
堆(heap): 不可直接存取, 存儲占有空間很大的數(shù)據(jù)類型的數(shù)據(jù)
棧(stack): 可以直接存取, 存儲占用相同空間長度并且占用空間小的數(shù)據(jù), 如存放局部變量,函數(shù)參數(shù),當(dāng)前狀態(tài),函數(shù)調(diào)用信息等
$jaime = new Person("jaime", "man", 24);
$jaime是存放在棧內(nèi)存里面的引用變量, 即存儲在堆中對象的首地址, 一個指針
new Person 實例化出來的對象是存放在堆內(nèi)存里面的, 是真正的對象實例
對象和成員變量,方法(內(nèi)部成員函數(shù))的前綴:
private: 私有成員
public: ?公有成員(外部接口),沒有加修飾, 默認(rèn)就是public
protected: 保護型成員, 繼承的類可以調(diào)用
訪問private修飾的變量
Fatal error: Cannot access private property Person::$name in E: etindex.php on line 36
如果想訪問private, protected修飾的成員:
把private改為public
使用__get(), ___set()魔術(shù)方法, 但是還是寫出代碼來看看根據(jù)實際情況使用
name = $name; $this->age = $age; $this->sex = $sex; } function __destruct(){ echo "byebye "; } function eat(){ echo "my name is ". $this->name." "; } function sleep(){ echo "i am sleeping "; } function __get($property_name){ $access_array = ["age","name"];// 只允許訪問age,name兩個私有成員 if(in_array($property_name, $access_array)){ return ($this->$property_name); } else{ return NULL; } } function __set($property_name, $value){ $access_array = ["age"];// 只允許訪問age這個私有成員 if(in_array($property_name, $access_array)){ $this->$property_name = $value; } } } $jaime = new Person("jaime", "man", 24); $jaime->eat(); echo ($jaime->age === NULL)? "NULL":$jaime->age; echo " "; echo ($jaime->sex === NULL)? "NULL":$jaime->sex; $jaime->age = 80; echo " "; echo ($jaime->age === NULL)? "NULL":$jaime->age; echo " "; $jaime->name = "lll"; echo ($jaime->name === NULL)? "NULL":$jaime->name; echo " "; ?>
執(zhí)行結(jié)果如下
$ php index.php my name is jaime 24 NULL 80 jaime byebye類的繼承
name = $name; $this->age = $age; $this->sex = $sex; } function __destruct(){ echo "byebye "; } function hello(){ echo "my name is ". $this->name." "; } function sleep(){ echo "i am sleeping "; } } class Student extends Person { private $school; function __construct($name, $sex, $age, $school) { // 調(diào)用父類方法, 構(gòu)造函數(shù) parent::__construct($name, $sex, $age); $this->school = $school; } // 重載了父類方法 function sleep(){ echo "afternoon sleep "; // 調(diào)用父類方法 parent::sleep(); } } $jaime = new Student("jaime", "man", 24,"zh"); $jaime->hello(); $jaime->sleep(); ?>
執(zhí)行后輸出
$ php index.php my name is jaime afternoon sleep i am sleeping byebye
調(diào)用父類的方法需要用parent
靜態(tài)成員和常量no bb, show code
show(); ?>
結(jié)果
$ php is.php China en I live in China I live in American xxxAmerican en
類的靜態(tài)變量,類似于全局變量,能夠被所有類的實例共享,類的靜態(tài)方法也是一樣的,類似于全局函數(shù), 靜態(tài)成員被這個類的每個實例對象所共享
訪問靜態(tài)方法訪問靜態(tài)成員不能用$this, 需要用self
$this表示了此方法的對象
"self"表示此靜態(tài)方法所在的類, self::成員
抽象方法和抽象類什么叫抽象?不具體的就叫抽象! so
抽象方法 : 類里面沒有具體方法體的方法(其實就是不具體的方法)
抽象類: 含有抽象方法的類,
抽象類不能實例化會報錯"Cannot instantiate abstract class
fun1(); (new demo0())->fun2(); (new demo0())->fun3(); ?>接口interface 什么是接口?
如果一個內(nèi)里面所有的方法都是抽象方法, 我們可以把聲明方式換為接口
接口是一種特殊的抽象類, 接口不能包含成員的任何代碼,只定義成員身。接口成員的具體代碼由實現(xiàn)接口的類提供
接口的繼承 接口的實現(xiàn)fun1(); (new demo())->fun2(); (new demo())->fun3(); (new demo())->fun4(); ?>一個類實現(xiàn)多個接口
一個人要遵守的法律不止一步吧, 所以see code
fun1(); (new demo())->fun2(); (new demo())->fun3(); (new demo())->fun4(); ?>
你娶了你老婆你得對她的家人負(fù)責(zé)吧, 就像下面
// 使用extends繼承一個類,使用implements實現(xiàn)多個接口 class demo extend AbstractClass implements One, Two{ ...... // 所有接口中的方法都要實現(xiàn)才可以實例化對象 }反射Reflection
需求: 導(dǎo)出或提取出關(guān)于類、方法、屬性、參數(shù)等的詳細(xì)信息, 甚至是判斷某個方法是否存在
這里我不做多說, 看我在實際的項目中的實際應(yīng)用,
這是一個API的入口處理函數(shù), 如果存在這個方法就執(zhí)行并返回結(jié)果, 不存在就拋出異常,
因為接口函數(shù)是不斷增加甚至是變化的, 使用反射作為api的入口可以讓你的具體的api函數(shù)變化了入口也不用改
try { // 使用工廠方法實例化具體的接口 $instance = new ApiLibraryApiFactory($module, $server, $this->params); // 反射方法 $action = new ReflectionMethod($instance->instance, $method); // 判斷方法的類型 if (!$action->isPublic() || $action->isStatic()) throw new ReflectionException(); // 驗證api參數(shù) $validator = new ApiLibraryApiValidator(); $result = $validator->check($this->params); if (false === $result) { $this->result["code"] = $validator->code ? : $this->result["code"]; $this->result["msg"] = $validator->msg ? : $this->result["msg"]; throw new Exception(); } } catch(Exception $e){ $this->_format(); }
參考:
《細(xì)說PHP 》 兄弟連
《PHP手冊》
《php面向?qū)ο?OOP)編程完全教程》
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/21681.html
摘要:而哈士奇區(qū)別于普通狗,又有新的特征逗比,愛搗亂為了保證類之間的松綁定,通常會繼承抽象類,而且是淺繼承只有一層子類。如果知道所有類都會共享一個公共的行為實現(xiàn),就使用抽象類,并在其中實現(xiàn)該行為。 為什么使用OOP OOP是一個模塊化的過程,目的是為了把復(fù)雜問題簡單化,一個模塊解決一個復(fù)雜問題的某一個方面,即一個類應(yīng)當(dāng)只有一個職責(zé) OOP區(qū)別于順序式編程與過程式編程,在于: 1.順序編程...
摘要:男獲取端口號當(dāng)前運行腳本所在的服務(wù)器的主機名。如果腳本運行于虛擬主機中,該名稱是由那個虛擬主機所設(shè)置的值決定本文由甲爪廣告聯(lián)盟整理編輯 同驗證碼類,分頁也是在個人博客,論壇等網(wǎng)站中不可缺少的方式,通過分頁可以在一個界面展示固定條數(shù)的數(shù)據(jù),而不至于將所有數(shù)據(jù)全部羅列到一起,實現(xiàn)分頁的原理其實就是對數(shù)據(jù)庫查詢輸出加了一個limit限制,接下來我們就開始準(zhǔn)備今天分頁類的邏輯 #### 邏輯準(zhǔn)...
摘要:為了成為一個專家,他必須先成為中級者。它非常適合于急于求成或者沒有太多技術(shù)的人,但掌握絕對無法使你成為一個專業(yè)的開發(fā)者它使用意大利面條式的編碼,教你的是不合適的設(shè)計原則。 這一篇文章是Becoming a PHP Professional系列 4 篇博文中的第 1 篇。 當(dāng)瀏覽各類與PHP相關(guān)的博客時,比如Quora上的問題,谷歌群組,簡訊和雜志,我經(jīng)常注意到技能的等級分化。問題都類...
摘要:我的學(xué)習(xí)路線入門入門沒啥好說的,會基本編碼,基本的開發(fā)結(jié)構(gòu)通常指,呵呵噠,類與對象,就差不多了,可以說是入門了。在這些已有基礎(chǔ),我們需要學(xué)習(xí)并且還需要學(xué)會各種推陳出新,這樣才可以讓自己讓他人走得更遠。 我的 PHP 學(xué)習(xí)路線 1. PHP 入門 PHP 入門沒啥好說的,會基本編碼,基本的開發(fā)結(jié)構(gòu)(通常指MVC,呵呵噠),類與對象,就差不多了,可以說是入門了。 1.1 OOP 寫 PHP...
閱讀 3794·2021-09-23 11:32
閱讀 2461·2021-09-06 15:01
閱讀 1623·2021-08-18 10:24
閱讀 3458·2019-12-27 11:44
閱讀 3609·2019-08-30 15:52
閱讀 2518·2019-08-30 11:11
閱讀 686·2019-08-29 17:27
閱讀 605·2019-08-29 16:22