PHP面向?qū)ο缶偨Y(jié)
本文實(shí)例匯總了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)的精要。分享給大家供大家參考。具體分析如下:
1 使用extends實(shí)現(xiàn)繼承以及重載、魔術(shù)方法的含義
class B extends A
聲明的時(shí)候B里可以沒(méi)有A里的方法
調(diào)用的時(shí)候:
$b=new B();
$b->A里的方法();
$b->A里的屬性=1;
$b->B里的方法();
$b->B里的方法();
如果$a=new A();
可以
$a->A里的方法();
$a->A里的屬性=1;
不可以
$a->B里的方法();
$a->B里的方法();
重載:B繼承A ,B里實(shí)現(xiàn)和A同名的方法屬性。
PHP中的"重載"與其它絕大多數(shù)面向?qū)ο笳Z(yǔ)言不同。傳統(tǒng)的"重載"是用于提供多個(gè)同名的 類(lèi)方法,但各方法的參數(shù)類(lèi)型和個(gè)數(shù)不同。
魔術(shù)方法:PHP把所有以__(兩個(gè)下劃線(xiàn))開(kāi)頭的類(lèi)方法當(dāng)成魔術(shù)方法。所以你定義自己的類(lèi)方法時(shí),不要以 __為前綴。
2 繼承用private和protected訪(fǎng)問(wèn)修飾符可見(jiàn)性
屬性方法private不可以被繼承
屬性方法protected類(lèi)外部不可見(jiàn),可以被繼承
屬性方法public 所定義的類(lèi)成員可以在任何地方被訪(fǎng)問(wèn)
3 php中雙冒號(hào)::的應(yīng)用
php類(lèi)代碼中常看到"::"的操作符,這個(gè)是作用域限定操作符,是用一個(gè)雙冒號(hào)"::"表示,它用來(lái)置頂類(lèi)中不同作用域的級(jí)別。左邊是作用域右邊是訪(fǎng)問(wèn)作用域的成員。
在php中定義的作用域有self和parent兩種(在php6中提供了static作用域)。
范圍解析操作符(也可稱(chēng)作 Paamayim Nekudotayim)或者更簡(jiǎn)單地說(shuō)是一對(duì)冒號(hào),可以用于訪(fǎng)問(wèn)靜態(tài)成員、方法和常量,還可以用于子類(lèi)覆蓋父類(lèi)中的成員和方法。
const CONST_VALUE = 'A constant value';
}
echo MyClass::CONST_VALUE;
class OtherClass extends MyClass
{
public static $my_static = 'static var';
public static function doubleColon() {
echo parent::CONST_VALUE . "\n";
echo self::$my_static . "\n";
}
}
OtherClass::doubleColon();
//子類(lèi)覆蓋父類(lèi)
class MyClass
{
protected function myFunc() {
echo "MyClass::myFunc()\n";
}
}
class OtherClass extends MyClass
{
// 覆蓋父類(lèi)中的方法
public function myFunc()
{
// 但仍然可以調(diào)用已被覆蓋的方法
parent::myFunc();
echo "OtherClass::myFunc()\n";
}
}
$class = new OtherClass();
$class->myFunc();
4 php中this和self以及parent的作用
this:就是指向當(dāng)前對(duì)象實(shí)例的指針,不指向任何其他對(duì)象或類(lèi)。
self:表示當(dāng)前類(lèi)的作用域,與this不同的是它不表示類(lèi)的某個(gè)特定實(shí)例,在類(lèi)之外的代碼中不能使用self,而且它不能識(shí)別自己在繼承中層次的位置。也就是說(shuō),當(dāng)在擴(kuò)展類(lèi)中使用self時(shí),它調(diào)用的不是父類(lèi)的方法,而是擴(kuò)展類(lèi)的重載的方法。self是指向類(lèi)本身,也就是self是不指向任何已經(jīng)實(shí)例化的對(duì)象,一般self使用來(lái)指向類(lèi)中的靜態(tài)變量。
private $lastCount;
//構(gòu)造函數(shù)
function __construct()
{
$this->lastCount = ++self:$firstCount; //使用self來(lái)調(diào)用靜態(tài)變量,使用self調(diào)用必須使用::(域運(yùn)算符號(hào))
}
parent:表示當(dāng)前類(lèi)父類(lèi)的作用域,其余的跟self特性一樣。parent是指向父類(lèi)的指針,一般我們使用parent來(lái)調(diào)用父類(lèi)的構(gòu)造函數(shù)。
function __construct( $personSex, $personAge )
{
parent::__construct( "test" ); //使用parent調(diào)用了父類(lèi)的構(gòu)造函數(shù)
$this->personSex = $personSex;
$this->personAge = $personAge;
}
5 構(gòu)造函數(shù)與析構(gòu)函數(shù)
具有構(gòu)造函數(shù)的類(lèi)會(huì)在每次創(chuàng)建對(duì)象時(shí)先調(diào)用此方法,所以非常適合在使用對(duì)象之前做一些初始化工作。
function __construct() {}
如果子類(lèi)中定義了構(gòu)造函數(shù)則不會(huì)暗中調(diào)用其父類(lèi)的構(gòu)造函數(shù)。要執(zhí)行父類(lèi)的構(gòu)造函數(shù),需要在子類(lèi)的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。
PHP 5 引入了析構(gòu)函數(shù)的概念,這類(lèi)似于其它面向?qū)ο蟮恼Z(yǔ)言,如 C++。析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷(xiāo)毀時(shí)執(zhí)行。
function __destruct() {}
6 final 關(guān)鍵字
PHP 5 新增了一個(gè) final 關(guān)鍵字。如果父類(lèi)中的方法被聲明為final,則子類(lèi)無(wú)法覆蓋該方法; 如果一個(gè)類(lèi)被聲明為final,則不能被繼承。
7 繼承和構(gòu)造函數(shù)
父類(lèi) | 子類(lèi) | 結(jié)果 |
有構(gòu)造函數(shù) | 無(wú)構(gòu)造函數(shù) | 父構(gòu)造 |
有構(gòu)造函數(shù) | 有構(gòu)造函數(shù) | 子構(gòu)造 |
8 接口
可以通過(guò)interface來(lái)定義一個(gè)接口,就像定義一個(gè)標(biāo)準(zhǔn)的類(lèi)一樣。
注意:
1)但其中定義所有的方法都是空的;
2)接口中定義的所有方法都必須是public,這是接口的特性;
3)實(shí)現(xiàn)多個(gè)接口時(shí),接口中的方法不能有重名;
4)接口也可以繼承,通過(guò)使用extends操作符;
5)接口中也可以定義常量。接口常量和類(lèi)常量的使用完全相同。 它們都是定值,不能被子類(lèi)或子接口修改。
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 實(shí)現(xiàn)接口
// 下面的寫(xiě)法是正確的
class Template implements iTemplate
{
private $vars = array();
public function setVariable($name, $var)
{
$this->vars[$name] = $var;
}
public function getHtml($template)
{
foreach($this->vars as $name => $value) {
$template = str_replace('{' . $name . '}', $value, $template);
}
return $template;
}
}
9 屬性
類(lèi)的變量成員叫做“屬性”,屬性聲明是由關(guān)鍵字public或者protected或者private開(kāi)頭,然后跟一個(gè)變量來(lái)組成。 屬性中的變量可以初始化,但是初始化的值必須是常數(shù),這里的常數(shù)是指php腳本在編譯階段時(shí)就為常數(shù),而不是在編譯階段之后在運(yùn)行階段運(yùn)算出的常數(shù)。
在PHP5 中,預(yù)定義了兩個(gè)函數(shù)“__get()”和“__set()”來(lái)獲
取和賦值其屬性,以及檢查屬性的“__isset()”和刪除屬性的方法“__unset()”。
簡(jiǎn)單的說(shuō)一個(gè)是取值,一個(gè)是賦值。,“__set()”和“__get()”這兩個(gè)方法,這兩個(gè)方法不是默認(rèn)存在的,而是我們手工添加到類(lèi)里面去的,像構(gòu)造方法(__construct())一樣, 類(lèi)里面添加了才會(huì)存在,可以按下面的方式來(lái)添加這兩個(gè)方法,當(dāng)然也可以按個(gè)人的風(fēng)格來(lái)添加://__get()方法用來(lái)獲取私有屬性
class Person{
//下面是人的成員屬性
private $name; //人的名字
private $sex; //人的性別
private $age; //人的年齡
//__get()方法用來(lái)獲取私有屬性
private function __get($property_name){
if(isset($this->$property_name)){
return($this->$property_name);}else {
return(NULL);
}
}
}
//__set()方法用來(lái)設(shè)置私有屬性
private function __set($property_name, $value){
$this->$property_name = $value;
}
//__isset()方法
private function __isset($nm){
echo "isset()函數(shù)測(cè)定私有成員時(shí),自動(dòng)調(diào)用<br>";
return isset($this->$nm);
}
//__unset()方法
private function __unset($nm){
echo "當(dāng)在類(lèi)外部使用unset()函數(shù)來(lái)刪除私有成員時(shí)自動(dòng)調(diào)用的<br>";
unset($this->$nm);
}
}
$p1=new Person();
$p1->name="this is a person name";
//在使用isset()函數(shù)測(cè)定私有成員時(shí),自動(dòng)調(diào)用__isset()方法幫我們完成,返回結(jié)果為true
echo var_dump(isset($p1->name))."<br>";
echo $p1->name."<br>";
//在使用unset()函數(shù)刪除私有成員時(shí),自動(dòng)調(diào)用__unset()方法幫我們完成,刪除name私有屬性
unset($p1->name);
//已經(jīng)被刪除了, 所這行不會(huì)有輸出
echo $p1->name;
?>
class Person{
//下面是人的成員屬性
private $name;
//人的名字
private $sex;
//人的性別
private $age;
//人的年齡
//__get()方法用來(lái)獲取私有屬性
private function __get($property_name){
if(isset($this->$property_name)){
return($this->$property_name);
}else{
return(NULL);
}
}
}
//__set()方法用來(lái)設(shè)置私有屬性
private function __set($property_name, $value){
$this->$property_name = $value;
}
//__isset()方法
private function __isset($nm){
echo "isset()函數(shù)測(cè)定私有成員時(shí),自動(dòng)調(diào)用<br>";
return isset($this->$nm);
}
//__unset()方法
private function __unset($nm){
echo "當(dāng)在類(lèi)外部使用unset()函數(shù)來(lái)刪除私有成員時(shí)自動(dòng)調(diào)用的<br>";
unset($this->$nm);
}
}
$p1=new Person();
$p1->name="this is a person name";
//在使用isset()函數(shù)測(cè)定私有成員時(shí),自動(dòng)調(diào)用__isset()方法幫我們完成,返回結(jié)果為true
echo var_dump(isset($p1->name))."<br>";
echo $p1->name."<br>";
//在使用unset()函數(shù)刪除私有成員時(shí),自動(dòng)調(diào)用__unset()方法幫我們完成,刪除name私有屬性
unset($p1->name);
//已經(jīng)被刪除了, 所這行不會(huì)有輸出
echo $p1->name;
?>
10 克隆
對(duì)象復(fù)制可以通過(guò)clone關(guān)鍵字來(lái)完成(如果對(duì)象中存在__clone()方法,會(huì)先被調(diào)用)。對(duì)象中的 __clone()方法不能直接調(diào)用。
當(dāng)對(duì)象被復(fù)制后,PHP5會(huì)對(duì)對(duì)象的所有屬性執(zhí)行一個(gè)“淺復(fù)制”(shallow copy)。所有的屬性中的引用 仍然不變,指向原來(lái)的變量。如果定義了__clone()方法,則新創(chuàng)建的對(duì)象(復(fù)制生成的對(duì)象)中的__clone()方法會(huì)被調(diào)用, 可用于修改屬性的值(如果有必要的話(huà))。
希望本文所述對(duì)大家的php面向?qū)ο蟪绦蛟O(shè)計(jì)有所幫助。
相關(guān)文章
php中抓取網(wǎng)頁(yè)內(nèi)容的實(shí)例詳解
這篇文章主要介紹了php中抓取網(wǎng)頁(yè)內(nèi)容的實(shí)例詳解的相關(guān)資料,這里提供兩種實(shí)現(xiàn)方法,希望能幫助到大家,需要的朋友可以參考下2017-08-08php實(shí)現(xiàn)mysql同步的實(shí)現(xiàn)方法
由于公司的英文網(wǎng)站放置在美國(guó),而這些網(wǎng)站的數(shù)據(jù)要與大陸的服務(wù)器數(shù)據(jù)同步。 同步時(shí)間在一天之內(nèi)。2009-10-10PHP5中使用PDO連接數(shù)據(jù)庫(kù)的方法
PDO(PHP Data Object) 是PHP 5 中加入的東西,是PHP 5新加入的一個(gè)重大功能,因?yàn)樵赑HP 5以前的php4/php3都是一堆的數(shù)據(jù)庫(kù)擴(kuò)展來(lái)跟各個(gè)數(shù)據(jù)庫(kù)的連接和處理,什么 php_mysql.dll、php_pgsql.dll、php_mssql.dll、php_sqlite.dll等等。2010-08-08PHP中spl_autoload_register()函數(shù)用法實(shí)例詳解
這篇文章主要介紹了PHP中spl_autoload_register()函數(shù)用法,結(jié)合實(shí)例形式分析了__autoload函數(shù)及spl_autoload_register函數(shù)的相關(guān)使用技巧,需要的朋友可以參考下2016-07-07用PHP獲取Google AJAX Search API 數(shù)據(jù)的代碼
用PHP獲取Google AJAX Search API 數(shù)據(jù)的代碼2010-03-03PHP實(shí)現(xiàn)的猴王算法(猴子選大王)示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的猴王算法(猴子選大王),對(duì)比分析了兩種PHP猴王算法,涉及PHP數(shù)組遍歷、判斷、遞歸等相關(guān)操作技巧,需要的朋友可以參考下2018-04-04一個(gè)簡(jiǎn)單php擴(kuò)展介紹與開(kāi)發(fā)教程
這個(gè)擴(kuò)展早就寫(xiě)好了,只是一直沒(méi)有時(shí)間寫(xiě)在blog上面,今天抽點(diǎn)時(shí)間,將它記錄下來(lái),以后備用。2010-08-08