面向?qū)ο?/h1>
面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計)是一種計算機編程架構(gòu),OOP的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成,OOP達到了軟件工程的三 個目標:重用性、靈活性和擴展性。為了實現(xiàn)整體運算,每個對象都能夠接收信息、處理數(shù)據(jù)和向其它對象發(fā)送信息。面向?qū)ο笠恢笔擒浖_發(fā)領(lǐng)域內(nèi)比較熱門的話 題,首先,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律。其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職、各盡所能。為編程人員敞開了一扇大門,使其編程的代碼 更簡潔、更易于維護,并且具有更強的可重用性。有人說PHP不是一個真正的面向?qū)ο蟮恼Z言,這是事實。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統(tǒng)的過程化編程。然而,對于大型項目,你可能需要在PHP 中使用純的OOP去聲明類,而且在你的項目里只用對象和類。這個概念我先不多說了,因為有很多人朋友遠離面向?qū)ο缶幊痰闹饕蚓褪且唤佑|面向?qū)ο蟾拍畹?時候就理解不上去, 所以就不想去學(xué)下去了. 等讀者看完整體內(nèi)容后再去把概念搞明白吧。
既然學(xué)習(xí)面向?qū)ο螅俏覀兙拖葋砹私馐裁词旅嫦蜻^程。
面向過程
“面向過程”(Procedure Oriented)是一種以過程為中心的編程思想?!懊嫦蜻^程”也可稱之為“面向記錄”編程思想,他們不支持豐富的“面向?qū)ο蟆碧匦裕ū热缋^承、多態(tài)),并且它們不允許混合持久化狀態(tài)和域邏輯。
就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。
面向過程的重要優(yōu)勢
可讀性
可重用性
維護性
可測試性
面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。
面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
例如下面的例子

可以明顯地看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設(shè)計中分散在了總多步驟中,很可能出現(xiàn)不同的繪制版本,因為通常設(shè)計人員會考慮到實際情況進行各種各樣的簡化。而面向?qū)ο蟮脑O(shè)計中,繪圖只可能在棋盤對象中出現(xiàn),從而保證了繪圖的統(tǒng)一.
類與對象的關(guān)系
對象:對象是人們要進行研究的任何事物,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計劃或事件。對象具有狀態(tài),一個對象用數(shù)據(jù)值來描述它的狀態(tài)。對象還有操作,用于改變對象的狀態(tài),對象及其操作就是對象的行為。對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對象的統(tǒng)一體中。
類:具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象,類實際上就是一種數(shù)據(jù)類型。類具有屬性,它是對象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。類具有操作,它是對象的行為的抽象,用操作名和實現(xiàn)該操作的方法來描述。
對象和類的關(guān)系:
類與對象的關(guān)系就如模具和鑄件的關(guān)系,類的實力化的結(jié)果就是對象,而對對象的抽象就是類,類描述了一組有相同特性(屬性)和相同行為的對象。
php類的成員屬性和成員方法
類定義的方法
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
<?php
class boy{
var $name ="jw";
var $age = "21";
var $sex = "男";
var $height = "182CM";
var $eye = "big"; //函數(shù)(成員方法)
function zuofan(){
return "做飯<br>"; }
function jiawu(){
return "家務(wù)<br>"; }
};
?>
注:在類的成員屬性面前一定要有一個修飾詞,如果不是知道使用聲明修飾詞,可以使用var(關(guān)鍵字),如果一旦有其他的修飾詞就不要用var了
注意:成員屬性不可以是帶運算符的表達式.變量.方法或函數(shù)調(diào)用。聲明的成員方法必須和對象相關(guān),不能是一些沒有意義的操作。
實例化對象
類的實例化格式如下:
$對象名 = new 類名稱([參數(shù)]); // 類的實例化:類成為對象的語句
· $對象名:類實例化返回的對象名稱,用于引用類中的方法。
· new:關(guān)鍵字,表明要創(chuàng)建一個新的對象。
· 類名稱:表示類的名稱。
· 參數(shù):指定類的構(gòu)造方法用于初始化類的值。如果類中沒有定義構(gòu)造函數(shù),PHP會自動創(chuàng)建一個不帶參數(shù)的默認構(gòu)造函數(shù)。
new.php里提供的源代碼,能清晰的看出如何實例化對象,并訪問。
<?php
class boy{
//變量(成員屬性)
var $name ="jw";
var $age = "21";
var $sex = "男";
var $height = "182CM";
var $eye = "big";
//函數(shù)(成員方法)
function zuofan(){
return "做飯<br>"; }
function jiawu(){
return "家務(wù)<br>"; }
}
$boy1 = new boy();
$boy1->name = "張三";
$boy2 = new boy();
$boy2 ->name = "李四";
echo $boy1 -> sex."<br>";
echo $boy2 -> height."<br>";
?>
-> 符號 代表訪問對象名下面的類。
特殊的對象引用“this”。
只要是對象里面的成員,就必須使用這個對象來訪問這個對象內(nèi)部的和方法。
<?php class boy{
//變量(成員屬性)
var $name ="jw";
var $age = "21";
var $sex = "男";
//函數(shù)(成員方法)
public function zuofan(){
echo "{$this->name} 做飯<br>";
$this->jiawu(); }
function jiawu(){
echo "家務(wù)<br>"; }
}
$boy1 = new boy();
$boy2 = new boy;
$boy2 ->name = "李四";
$boy1->name = "張三";
$boy1->zuofan();
$boy2->zuofan();
?>
構(gòu)造方法
構(gòu)造函數(shù) ,是一種特殊的方法。主要用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創(chuàng)建對象的語句中。
1.是對象創(chuàng)建完成,第一個自動調(diào)用的方法(特殊)
2.方法名稱比較特殊,可以和類名相同名的方法名
3.給對象中的成員賦初值使用的.
<?php class boy{
//變量(成員屬性)
var $name;
var $age;
var $sex;
function __construct($name,$age,$sex="男"){
$this->name="$name";
$this->age="$age";
$this->sex="$sex"; }
//函數(shù)(成員方法)
public function zuofan(){
echo "{$this->name} 做飯<br>";
$this->jiawu(); }
function jiawu(){
echo "家務(wù)<br>"; }
}
$boy1 = new boy("名字",28);
$boy2 = new boy("名",26,"男");
$boy1->zuofan();
$boy2->zuofan();
?>
析構(gòu)方法
析構(gòu)函數(shù)(destructor) 與構(gòu)造函數(shù)相反,當(dāng)對象結(jié)束其生命周期時(例如對象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動執(zhí)行析構(gòu)函數(shù)。
PHP 5 引入了析構(gòu)函數(shù)的概念,這類似于其它面向?qū)ο蟮恼Z言,其語法格式如下:
void __destruct ( void )
繼承
PHP 使用關(guān)鍵字 extends 來繼承一個類,PHP 不支持多繼承,格式如下:
<?php
class Child extends Parent {
// 代碼部分
}
?>
訪問控制
PHP 對屬性或方法的訪問控制,是通過在前面添加關(guān)鍵字 public(公有),protected(受保護)或 private(私有)來實現(xiàn)的。
· public(公有):公有的類成員可以在任何地方被訪問。
· protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
· private(私有):私有的類成員則只能被其定義所在的類訪問。
可查看public.php protected.php private.php查看區(qū)別
方法重寫
方法重載(override)/覆蓋——在什么情況下使用:當(dāng)父類知道所有的子類都需要用到一個方法,但父類不知道怎么去寫這個方法時,就需要用到方法的重載。這時候,可以讓子類去重寫,來覆蓋這個方法。
通俗實例——父類(動物)知道其子類(貓和狗)都會叫,但它們的叫法都不一樣,所以父類沒法去寫這個方法,只能讓子類(貓和狗)去定義。代碼如下:
<?php
class Animal{
public $name;
protected $price;
function cry(){
echo "不知道動物怎么叫";
}
}
class Dog extends Animal{
function cry(){
echo "汪汪...";
}
}
class Pig extends Animal{
function cry(){
echo "哼哼..."
}
}
?>
接口
接口interface 是一個規(guī)定,給人繼承用的東西,有點像抽象類
在里面定義的方法,卻不去實例化,而需要別的類去implements 它,而且必須一一實現(xiàn)接口定義的所有方法,舉個例子
interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}
我聲明一個shop接口類,定義了三個方法:買(buy),賣(sell),看(view),那么繼承此類的所有子類都必須實現(xiàn)這3個方法少一個都 不行,如果子類沒有實現(xiàn)這些話,就無法運行。實際上接口類說白了,就是一個類的模板,一個類的規(guī)定,如果你屬于這類,你就必須遵循我的規(guī)定,少一個都不 行,但是具體你怎么去做,我不管,那是你的事,如:
<?php
class BaseShop implements Shop
{
public function buy($gid)
{
echo('你購買了ID為 :'.$gid.'的商品');
}
public function sell($gid)
echo('你賣了ID為 :'.$gid.'的商品');
}
public function view($gid)
{
echo('你查看了ID為 :'.$gid.'的商品');
}
}
?>
常量
可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用 $ 符號。
常量的值必須是一個定值,不能是變量,類屬性,數(shù)學(xué)運算的結(jié)果或函數(shù)調(diào)用。
<?php
class MyClass
{
const constant = '常量值';
function showConstant() {
echo self::constant . PHP_EOL;
}
}
echo MyClass::constant . PHP_EOL;
$classname = "MyClass";
echo $classname::constant . PHP_EOL; // 自 5.3.0 起
$class = new MyClass();
$class->showConstant();
echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起
?>
php中::的意思
類中 靜態(tài)方法和靜態(tài)屬性的引用方法
例如
<?php
class Test{
public static $test = 1;
public static function test(){
}
}
?>
可以不用實例化對象直接使用 Test::$test 來取得$test屬性的值
靜態(tài)方法調(diào)用也同理Test::test(); 直接調(diào)用靜態(tài)方法test
抽象類
對于PHP程序員來說,最為難掌握的一點要數(shù)PHP抽象類應(yīng)用這一塊知識點。作為一個新手其實也還沒有到要用面向?qū)ο蟮闹R去編程,但以后進行開發(fā),使用類進行封裝或者使用接口之類,把程序進行各種模塊式的開發(fā),這當(dāng)然是必然的。
在自然語言中,我們理解抽象的概念是,一個物體的一種大的描述,這種描述對某類物體來說是共有的特性。那么在PHP中也是一樣的,我們把一個類進行抽象,可以指明類的一般行為,這個類應(yīng)該是一個模板,它指示它的子方法必須要實現(xiàn)的一些行為。
PHP抽象類應(yīng)用的定義:
abstract class ClassName{
}
PHP抽象類應(yīng)用要點:
1.定義一些方法,子類必須完全實現(xiàn)這個抽象中所有的方法
2.不能從抽象類創(chuàng)建對象,它的意義在于被擴展
3.抽象類通常具有抽象方法,方法中沒有大括號
PHP抽象類應(yīng)用重點:
1.抽象方法不必實現(xiàn)具體的功能,由子類來完成
2.在子類實現(xiàn)抽象類的方法時,其子類的可見性必須大于或等于抽象方法的定義
3.抽象類的方法可以有參數(shù),也可以為空
4.如果抽象方法有參數(shù),那么子類的實現(xiàn)也必須有相同的參數(shù)個數(shù)
PHP抽象類應(yīng)用示例:
abstract public function_name(); //注意沒有大括號
PHP抽象類規(guī)則:
1. 某個類只要至少含有一個抽象方法,就必須聲明為抽象類
2. 抽象方法,不能夠含有函數(shù)體
3. 繼承抽象類的子類,實現(xiàn)抽象方法的,必須跟該抽象方法具有相同或者更低的訪問級別
4. 繼承抽象類的子類,如果不實現(xiàn)所有抽象方法,那么該子類也為抽象類
我們來實現(xiàn)一個簡單的抽象類:計算矩形的面積。這個矩形可以從形狀類擴展。
可查看abstract.php代碼
Final 關(guān)鍵字
如果我們不希望一個類被繼承,我們使用final來修飾這個類。這個類將無法被繼承。
final---用于類、方法前。
final類---不可被繼承。
final方法---不可被覆蓋。
final類不能被繼承。
當(dāng)我們只希望一個類不可擴展時,可在類的前面加上Final,該類就不能被繼承。
Static 關(guān)鍵字
php中的變量作用范圍的另一個重要特性就是靜態(tài)變量(static 變量)。靜態(tài)變量僅在局部函數(shù)域中存在且只被初始化一次,當(dāng)程序執(zhí)行離開此作用域時,其值不會消失,會用上次執(zhí)行的結(jié)果。
PHP_EOL
換行符
調(diào)用父類構(gòu)造方法
parent::__construct() 。
PHP 不會在子類的構(gòu)造方法中自動的調(diào)用父類的構(gòu)造方法。要執(zhí)行父類的構(gòu)造方法,需要在子類的構(gòu)造方法中調(diào)用
面向?qū)ο缶幊蹋∣bject Oriented Programming, OOP, 面向?qū)ο蟪绦蛟O(shè)計)是一種計算機編程架構(gòu),OOP的一條基本原則是計算機程序是由單個能夠起到子程序作用的單元或?qū)ο蠼M合而成,OOP達到了軟件工程的三 個目標:重用性、靈活性和擴展性。為了實現(xiàn)整體運算,每個對象都能夠接收信息、處理數(shù)據(jù)和向其它對象發(fā)送信息。面向?qū)ο笠恢笔擒浖_發(fā)領(lǐng)域內(nèi)比較熱門的話 題,首先,面向?qū)ο蠓先祟惪创挛锏囊话阋?guī)律。其次,采用面向?qū)ο蠓椒梢允瓜到y(tǒng)各部分各司其職、各盡所能。為編程人員敞開了一扇大門,使其編程的代碼 更簡潔、更易于維護,并且具有更強的可重用性。有人說PHP不是一個真正的面向?qū)ο蟮恼Z言,這是事實。PHP 是一個混合型語言,你可以使用OOP,也可以使用傳統(tǒng)的過程化編程。然而,對于大型項目,你可能需要在PHP 中使用純的OOP去聲明類,而且在你的項目里只用對象和類。這個概念我先不多說了,因為有很多人朋友遠離面向?qū)ο缶幊痰闹饕蚓褪且唤佑|面向?qū)ο蟾拍畹?時候就理解不上去, 所以就不想去學(xué)下去了. 等讀者看完整體內(nèi)容后再去把概念搞明白吧。
既然學(xué)習(xí)面向?qū)ο螅俏覀兙拖葋砹私馐裁词旅嫦蜻^程。
面向過程
“面向過程”(Procedure Oriented)是一種以過程為中心的編程思想?!懊嫦蜻^程”也可稱之為“面向記錄”編程思想,他們不支持豐富的“面向?qū)ο蟆碧匦裕ū热缋^承、多態(tài)),并且它們不允許混合持久化狀態(tài)和域邏輯。
就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。
面向過程的重要優(yōu)勢
可讀性
可重用性
維護性
可測試性
面向過程就是分析出解決問題所需要的步驟,然后用函數(shù)把這些步驟一步一步實現(xiàn),使用的時候一個一個依次調(diào)用就可以了。
面向?qū)ο笫前褬?gòu)成問題事務(wù)分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
例如下面的例子
可以明顯地看出,面向?qū)ο笫且怨δ軄韯澐謫栴},而不是步驟。同樣是繪制棋局,這樣的行為在面向過程的設(shè)計中分散在了總多步驟中,很可能出現(xiàn)不同的繪制版本,因為通常設(shè)計人員會考慮到實際情況進行各種各樣的簡化。而面向?qū)ο蟮脑O(shè)計中,繪圖只可能在棋盤對象中出現(xiàn),從而保證了繪圖的統(tǒng)一.
類與對象的關(guān)系
對象:對象是人們要進行研究的任何事物,它不僅能表示具體的事物,還能表示抽象的規(guī)則、計劃或事件。對象具有狀態(tài),一個對象用數(shù)據(jù)值來描述它的狀態(tài)。對象還有操作,用于改變對象的狀態(tài),對象及其操作就是對象的行為。對象實現(xiàn)了數(shù)據(jù)和操作的結(jié)合,使數(shù)據(jù)和操作封裝于對象的統(tǒng)一體中。
類:具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象的抽象就是類。因此,對象的抽象是類,類的具體化就是對象,也可以說類的實例是對象,類實際上就是一種數(shù)據(jù)類型。類具有屬性,它是對象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。類具有操作,它是對象的行為的抽象,用操作名和實現(xiàn)該操作的方法來描述。
對象和類的關(guān)系:
類與對象的關(guān)系就如模具和鑄件的關(guān)系,類的實力化的結(jié)果就是對象,而對對象的抽象就是類,類描述了一組有相同特性(屬性)和相同行為的對象。
php類的成員屬性和成員方法
類定義的方法
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>
<?php class boy{ var $name ="jw"; var $age = "21"; var $sex = "男"; var $height = "182CM"; var $eye = "big"; //函數(shù)(成員方法) function zuofan(){ return "做飯<br>"; } function jiawu(){ return "家務(wù)<br>"; } }; ?>
注:在類的成員屬性面前一定要有一個修飾詞,如果不是知道使用聲明修飾詞,可以使用var(關(guān)鍵字),如果一旦有其他的修飾詞就不要用var了
注意:成員屬性不可以是帶運算符的表達式.變量.方法或函數(shù)調(diào)用。聲明的成員方法必須和對象相關(guān),不能是一些沒有意義的操作。
實例化對象
類的實例化格式如下:
$對象名 = new 類名稱([參數(shù)]); // 類的實例化:類成為對象的語句
· $對象名:類實例化返回的對象名稱,用于引用類中的方法。
· new:關(guān)鍵字,表明要創(chuàng)建一個新的對象。
· 類名稱:表示類的名稱。
· 參數(shù):指定類的構(gòu)造方法用于初始化類的值。如果類中沒有定義構(gòu)造函數(shù),PHP會自動創(chuàng)建一個不帶參數(shù)的默認構(gòu)造函數(shù)。
new.php里提供的源代碼,能清晰的看出如何實例化對象,并訪問。
<?php class boy{ //變量(成員屬性) var $name ="jw"; var $age = "21"; var $sex = "男"; var $height = "182CM"; var $eye = "big"; //函數(shù)(成員方法) function zuofan(){ return "做飯<br>"; } function jiawu(){ return "家務(wù)<br>"; } } $boy1 = new boy(); $boy1->name = "張三"; $boy2 = new boy(); $boy2 ->name = "李四"; echo $boy1 -> sex."<br>"; echo $boy2 -> height."<br>"; ?>
-> 符號 代表訪問對象名下面的類。
特殊的對象引用“this”。
只要是對象里面的成員,就必須使用這個對象來訪問這個對象內(nèi)部的和方法。
<?php class boy{ //變量(成員屬性) var $name ="jw"; var $age = "21"; var $sex = "男"; //函數(shù)(成員方法) public function zuofan(){ echo "{$this->name} 做飯<br>"; $this->jiawu(); } function jiawu(){ echo "家務(wù)<br>"; } } $boy1 = new boy(); $boy2 = new boy; $boy2 ->name = "李四"; $boy1->name = "張三"; $boy1->zuofan(); $boy2->zuofan(); ?>
構(gòu)造方法
構(gòu)造函數(shù) ,是一種特殊的方法。主要用來在創(chuàng)建對象時初始化對象, 即為對象成員變量賦初始值,總與new運算符一起使用在創(chuàng)建對象的語句中。
1.是對象創(chuàng)建完成,第一個自動調(diào)用的方法(特殊)
2.方法名稱比較特殊,可以和類名相同名的方法名
3.給對象中的成員賦初值使用的.
<?php class boy{ //變量(成員屬性) var $name; var $age; var $sex; function __construct($name,$age,$sex="男"){ $this->name="$name"; $this->age="$age"; $this->sex="$sex"; } //函數(shù)(成員方法) public function zuofan(){ echo "{$this->name} 做飯<br>"; $this->jiawu(); } function jiawu(){ echo "家務(wù)<br>"; } } $boy1 = new boy("名字",28); $boy2 = new boy("名",26,"男"); $boy1->zuofan(); $boy2->zuofan(); ?>
析構(gòu)方法
析構(gòu)函數(shù)(destructor) 與構(gòu)造函數(shù)相反,當(dāng)對象結(jié)束其生命周期時(例如對象所在的函數(shù)已調(diào)用完畢),系統(tǒng)自動執(zhí)行析構(gòu)函數(shù)。
PHP 5 引入了析構(gòu)函數(shù)的概念,這類似于其它面向?qū)ο蟮恼Z言,其語法格式如下:
void __destruct ( void )
繼承
PHP 使用關(guān)鍵字 extends 來繼承一個類,PHP 不支持多繼承,格式如下:
<?php
class Child extends Parent {
// 代碼部分
}
?>
訪問控制
PHP 對屬性或方法的訪問控制,是通過在前面添加關(guān)鍵字 public(公有),protected(受保護)或 private(私有)來實現(xiàn)的。
· public(公有):公有的類成員可以在任何地方被訪問。
· protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
· private(私有):私有的類成員則只能被其定義所在的類訪問。
可查看public.php protected.php private.php查看區(qū)別
方法重寫
方法重載(override)/覆蓋——在什么情況下使用:當(dāng)父類知道所有的子類都需要用到一個方法,但父類不知道怎么去寫這個方法時,就需要用到方法的重載。這時候,可以讓子類去重寫,來覆蓋這個方法。
通俗實例——父類(動物)知道其子類(貓和狗)都會叫,但它們的叫法都不一樣,所以父類沒法去寫這個方法,只能讓子類(貓和狗)去定義。代碼如下:
<?php class Animal{ public $name; protected $price; function cry(){ echo "不知道動物怎么叫"; } } class Dog extends Animal{ function cry(){ echo "汪汪..."; } } class Pig extends Animal{ function cry(){ echo "哼哼..." } } ?>
接口
接口interface 是一個規(guī)定,給人繼承用的東西,有點像抽象類
在里面定義的方法,卻不去實例化,而需要別的類去implements 它,而且必須一一實現(xiàn)接口定義的所有方法,舉個例子
interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}
我聲明一個shop接口類,定義了三個方法:買(buy),賣(sell),看(view),那么繼承此類的所有子類都必須實現(xiàn)這3個方法少一個都 不行,如果子類沒有實現(xiàn)這些話,就無法運行。實際上接口類說白了,就是一個類的模板,一個類的規(guī)定,如果你屬于這類,你就必須遵循我的規(guī)定,少一個都不 行,但是具體你怎么去做,我不管,那是你的事,如:
<?php class BaseShop implements Shop { public function buy($gid) { echo('你購買了ID為 :'.$gid.'的商品'); } public function sell($gid) echo('你賣了ID為 :'.$gid.'的商品'); } public function view($gid) { echo('你查看了ID為 :'.$gid.'的商品'); } } ?>
常量
可以把在類中始終保持不變的值定義為常量。在定義和使用常量的時候不需要使用 $ 符號。
常量的值必須是一個定值,不能是變量,類屬性,數(shù)學(xué)運算的結(jié)果或函數(shù)調(diào)用。
<?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . PHP_EOL; } } echo MyClass::constant . PHP_EOL; $classname = "MyClass"; echo $classname::constant . PHP_EOL; // 自 5.3.0 起 $class = new MyClass(); $class->showConstant(); echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起 ?>
php中::的意思
類中 靜態(tài)方法和靜態(tài)屬性的引用方法
例如
<?php class Test{ public static $test = 1; public static function test(){ } } ?>
可以不用實例化對象直接使用 Test::$test 來取得$test屬性的值
靜態(tài)方法調(diào)用也同理Test::test(); 直接調(diào)用靜態(tài)方法test
抽象類
對于PHP程序員來說,最為難掌握的一點要數(shù)PHP抽象類應(yīng)用這一塊知識點。作為一個新手其實也還沒有到要用面向?qū)ο蟮闹R去編程,但以后進行開發(fā),使用類進行封裝或者使用接口之類,把程序進行各種模塊式的開發(fā),這當(dāng)然是必然的。
在自然語言中,我們理解抽象的概念是,一個物體的一種大的描述,這種描述對某類物體來說是共有的特性。那么在PHP中也是一樣的,我們把一個類進行抽象,可以指明類的一般行為,這個類應(yīng)該是一個模板,它指示它的子方法必須要實現(xiàn)的一些行為。
PHP抽象類應(yīng)用的定義:
abstract class ClassName{
}
PHP抽象類應(yīng)用要點:
1.定義一些方法,子類必須完全實現(xiàn)這個抽象中所有的方法
2.不能從抽象類創(chuàng)建對象,它的意義在于被擴展
3.抽象類通常具有抽象方法,方法中沒有大括號
PHP抽象類應(yīng)用重點:
1.抽象方法不必實現(xiàn)具體的功能,由子類來完成
2.在子類實現(xiàn)抽象類的方法時,其子類的可見性必須大于或等于抽象方法的定義
3.抽象類的方法可以有參數(shù),也可以為空
4.如果抽象方法有參數(shù),那么子類的實現(xiàn)也必須有相同的參數(shù)個數(shù)
PHP抽象類應(yīng)用示例:
abstract public function_name(); //注意沒有大括號
PHP抽象類規(guī)則:
1. 某個類只要至少含有一個抽象方法,就必須聲明為抽象類
2. 抽象方法,不能夠含有函數(shù)體
3. 繼承抽象類的子類,實現(xiàn)抽象方法的,必須跟該抽象方法具有相同或者更低的訪問級別
4. 繼承抽象類的子類,如果不實現(xiàn)所有抽象方法,那么該子類也為抽象類
我們來實現(xiàn)一個簡單的抽象類:計算矩形的面積。這個矩形可以從形狀類擴展。
可查看abstract.php代碼
Final 關(guān)鍵字
如果我們不希望一個類被繼承,我們使用final來修飾這個類。這個類將無法被繼承。
final---用于類、方法前。
final類---不可被繼承。
final方法---不可被覆蓋。
final類不能被繼承。
當(dāng)我們只希望一個類不可擴展時,可在類的前面加上Final,該類就不能被繼承。
Static 關(guān)鍵字
php中的變量作用范圍的另一個重要特性就是靜態(tài)變量(static 變量)。靜態(tài)變量僅在局部函數(shù)域中存在且只被初始化一次,當(dāng)程序執(zhí)行離開此作用域時,其值不會消失,會用上次執(zhí)行的結(jié)果。
PHP_EOL
換行符
調(diào)用父類構(gòu)造方法
parent::__construct() 。
PHP 不會在子類的構(gòu)造方法中自動的調(diào)用父類的構(gòu)造方法。要執(zhí)行父類的構(gòu)造方法,需要在子類的構(gòu)造方法中調(diào)用