PHP面向?qū)ο笤斀猓ㄈ?/h1>
更新時間:2015年12月07日 10:11:11 作者:韌還
這篇文章主要介紹了PHP面向?qū)ο笤斀猓ㄈ?的相關資料,需要的朋友可以參考下
面向?qū)ο?對象概念是面向?qū)ο蠹夹g的核心。在顯示世界里我們所面對的事情都是對象,如計算機、電視機、自行車等。在面向?qū)ο蟮某绦蛟O計中,對象是一個由信息及對信息進行處理的描述所組成的整體,是對現(xiàn)實世界的抽象.
對象的主要三個特性
對象的行為:可以對 對象施加那些操作,開燈,關燈就是行為。
對象的形態(tài):當施加那些方法是對象如何響應,顏色,尺寸,外型。
對象的表示:對象的表示就相當于身份證,具體區(qū)分在相同的行為與狀態(tài)下有什么不同。
面向?qū)ο竽P?/strong>
面向?qū)ο蟮母拍睿?br />
oop(面向?qū)ο蟮木幊?它能是其代碼更加簡潔易于維護并且具有更強的可重性
1、PHP面向?qū)ο螅ㄈ?/span>
四、OOP的高級實踐
4.3 Static-靜態(tài)成員
<?php
date_default_timezone_set("PRC");
/**
* 1. 類的定義以class關鍵字開始,后面跟著這個類的名稱。類的名稱命名通常每個單詞的第一個字母大寫。
* 2. 定義類的屬性
* 3. 定義類的方法
* 4. 實例化類的對象
* 5. 使用對象的屬性和方法
*/
class Human{
public $name;
public $height;
public $weight;
public function eat($food){
echo $this->name."'s eating ".$food."<br/>";
}
}
class Animal{
public $kind;
public $gender;
}
class NbaPlayer extends Human{
// 類的屬性的定義
public $name="Jordan";// 定義屬性
public $height="198cm";
public $weight="98kg";
public $team="Bull";
public $playerNumber="23";
private $age="44";
public $president="David Stern";
// 類的方法的定義
public function changePresident($newP){
$this->president=$newP;
}
public function run() {
echo "Running<br/>";
}
public function jump(){
echo "Jumping<br/>";
}
public function dribble(){
echo "Dribbling<br/>";
}
public function shoot(){
echo "Shooting<br/>";
}
public function dunk(){
echo "Dunking<br/>";
}
public function pass(){
echo "Passing<br/>";
}
public function getAge(){
echo $this->name."'s age is ".$this->age;
}
function __construct($name, $height, $weight, $team, $playerNumber){
print $name . ";" . $height . ";" . $weight . ";" . $team . ";" . $playerNumber."\n";
$this->name = $name; // $this是php里面的偽變量,表示對象自身
$this->height = $height; // 通過$this可以設置對象的屬性值
$this->weight = $weight;
$this->team = $team;
$this->playerNumber = $playerNumber;
}
}
/**
* 1. 類實例化為對象時使用new關鍵字,new之后緊跟類的名稱和一對括號。
* 2. 使用對象可以像使用其他值一樣進行賦值操作
*/
$jordan = new NbaPlayer("Jordan", "198cm","98kg","Bull","23");echo "<br/>";
$james=new NbaPlayer("James", "203cm", "120kg", "Heat", "6");echo "<br/>";
// 訪問對象的屬性使用的語法是->符號,后面跟著屬性的名稱
echo $jordan->name."<br/>";
// 調(diào)用對象的某個方法使用的語法是->符號,后面跟著方法的名稱和一對括號
$jordan->run();
$jordan->pass();
//子類調(diào)用父類的方法
$jordan->eat("apple");
//試著調(diào)用private,直接以及通過內(nèi)部的public函數(shù)
//$jordan->age;
$jordan->getAge();echo "<br/>";
$jordan->changePresident("Adam Silver");
echo $jordan->president."<br/>";
echo $james->president."<br/>";
直接從上述例子開始吧。
這里想得到的是,把兩位對象的某一個變量同時變掉?!胹tatic
public static $president="David Stern";
// 類的方法的定義
public static function changePresident($newP){
static::$president=$newP;//這里static換成self更符合規(guī)范
}
注意這里static的位置,以及,方法內(nèi)的::
調(diào)用的方法也有所變動。
echo NbaPlayer::$president;echo "<br/>";
NbaPlayer::changePresident("Adam Silver");
echo NbaPlayer::$president;echo "<br/>";
也就是像之前說的,靜態(tài)成員就是個常量,所以不針對某個具體的對象(不受具體對象的約束)——基于此,定義&賦值&調(diào)用都不需要具體的對象參與。
內(nèi)部調(diào)用要用self/static::$...
外部調(diào)用,類名::
用處就是所有的對象共用的數(shù)據(jù)。
--如果內(nèi)部調(diào)用時,變量在父類中
比如說,在上述例子中,父類human中寫這么一句話
public static $aaa="dafdfa";
然后在子類nbaplayer中,調(diào)用父類的靜態(tài)成員時,要
echo parent::$aaa;
而外部調(diào)用,按照上面說的,類名::,所以,直接父類類名即可
echo Human::$aaa;
--其他
在靜態(tài)方法中,是無法訪問其他變量的,也就是說,不能用$this->
--小結
/**
* 靜態(tài)成員
* 1. 靜態(tài)屬性用于保存類的公有數(shù)據(jù)
* 2. 靜態(tài)方法里面只能訪問靜態(tài)屬性
* 3. 靜態(tài)成員不需要實例化對象就可以訪問
* 4. 類內(nèi)部,可以通過self或者static關鍵字訪問自身的靜態(tài)成員
* 5. 可以通過parent關鍵字訪問父類的靜態(tài)成員
* 6. 可以通過類名稱在外部訪問類的靜態(tài)成員
*/
4.4 Final成員
--問題
不希望某個類擁有子類;
不希望子類修改父類中的某個變量(避免重寫?)
--final
》=php5版本
舉個例子
class BaseClass{
public function test(){
echo "BaseClass::test called<br/>";
}
public function test1(){
echo "BaseClass::test1 called<br/>";
}
}
class ChildClass extends BaseClass{
public function test(){
echo "ChildClass::test called<br/>";
}
}
$obj=new ChildClass();
$obj->test();
子類中編寫跟父類中完全一致的方法名(內(nèi)容可以不同),會完成對父類方法的重寫!
所以,不希望被重寫的父類中的方法,寫上final
復制代碼 代碼如下:
final public function test(){
依此類推,對于不想有子類的父類,在類名那里寫上final
復制代碼 代碼如下:
final class BaseClass{
--小結
/**
* 重寫和Final
* 1. 子類中編寫跟父類完全一致的方法可以完成對父類方法的重寫
* 2. 對于不想被任何類繼承的類可以在class之前添加final關鍵字
* 3. 對于不想被子類重寫(overwrite, 修改)的方法,可以在方法定義前面添加final關鍵字
*/
4.5 數(shù)據(jù)訪問
先把final都去掉
--parent
然后再子類中的方法中寫
parent::test();
運行后會發(fā)現(xiàn),依然可以通過parent的關鍵字調(diào)用父類中,即使是被重寫的數(shù)據(jù)
--self
然后在父類中的方法test中寫
self::test1();
運行后,發(fā)現(xiàn)self可以調(diào)用同一個類中的數(shù)據(jù)(其他方法/靜態(tài)變量/常量const)
--小結
/**
* 數(shù)據(jù)訪問補充
* 1. parent關鍵字可以用于調(diào)用父類被重寫的類成員
* 2. self關鍵字可以用于訪問類自身的成員方法,也可以用于訪問自身的靜態(tài)成員和類常量;不能用于訪問類自身的屬性;訪問類常量時不用在常量名稱前面加$符號
* 3. static關鍵字用于訪問類自身定義的靜態(tài)成員,訪問靜態(tài)屬性時需要在屬性名前面添加$符號
*/
4.6 對象接口
非常重要?。?!
--問題
不同的類,有著相同的行為,但相同的行為又有著不同的實現(xiàn)方法。
比如人和動物都會吃東西,但吃的方式方法又不太一樣。
--定義
接口就是把不同類的共同行為進行了定義,然后在不同的類里面實現(xiàn)不同的功能。
--栗子
復制代碼 代碼如下:
//定義一個接口
interface ICanEat{
public function eat($food);
}
可以看到,接口中并沒有方法的具體實現(xiàn),但必須有方法!
那么,下面是,“人類會吃”
//具體對象,連接到接口
class Human implements ICanEat{
public function eat($food){
echo "Human eating ".$food.".<br/>";
}
}
$obj=new Human();
$obj->eat("shit");
請忽略我給出的“食物”。
注意,不再用extends,而是implements。然后,同樣是方法名的完全相同。然后,對象必須/最好實現(xiàn)方法。
繼續(xù)
interface ICanEat{
public function eat($food);
}
//具體對象,連接到接口
class Human implements ICanEat{
public function eat($food){
echo "Human eating ".$food.".<br/>";
}
}
class Animal implements ICanEat{
public function eat($food){
echo "Animal eating ".$food.".<br/>";
}
}
$obj=new Human();
$obj->eat("shit");
$monkey=new Animal();
$monkey->eat("banana");
讓動物也吃起來!
--逆向操作
判斷某個對象是否連接了某個接口。
復制代碼 代碼如下:
var_dump($obj instanceof ICanEat);
會返回boolean值。
--更多的栗子
interface ICanPee extends ICanEat{
public function pee();
}
class Demon implements ICanPee{
public function pee(){
echo "Can demon pee?";
}
public function eat($food){
echo "Can demon eat ".$food;
}
}
$ghost=new Demon();
$ghost->pee();
$ghost->eat("shit");
接口本質(zhì)上也是類,可以被繼承/繼承,但是使用繼承接口的接口,所有父類、“爺類”的方法都要有具體實現(xiàn)。
--小結
/**
* 接口
* 1. 接口的基本概念和基本使用方法
* 2. 接口里面的方法沒有具體的實現(xiàn)
* 3. 實現(xiàn)了某個接口的類必須提供接口中定義的方法
* 4. 不能用接口創(chuàng)建對象,但是能夠判斷某個對象是否實現(xiàn)了某個接口
* 5. 接口可以繼承接口(interface extends interface)
* 6. 接口中定義的所有方法都必須是公有,這是接口的特性。
*/
aaaaaaaaaaaaaa
bu xiang xie le....................
ming tian yao ge ..............
以上內(nèi)容是小編給大家介紹的PHP面向?qū)ο笤斀猓ㄈ?,希望大家喜歡。
您可能感興趣的文章:- PHP面向?qū)ο蟪绦蛟O計之類常量用法實例
- PHP面向?qū)ο蟪绦蛟O計之接口用法
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (五) - PHP 命名空間
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (四) - 異常處理類Exception
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記(三) - 單例模式和工廠模式
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (二) - 靜態(tài)變量的屬性和方法及延遲綁定
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記(一) - 抽象類、對象接口、instanceof 和契約式編程
- php學習筆記 PHP面向?qū)ο蟮某绦蛟O計
- PHP5 面向?qū)ο蟪绦蛟O計
- PHP面向?qū)ο缶幊讨钊肜斫夥椒ㄖ剌d與方法覆蓋(多態(tài))
- PHP面向?qū)ο蟪绦蛟O計實例分析
相關文章
-
PHP命名空間(namespace)的動態(tài)訪問及使用技巧
上篇文章介紹了PHP命名空間的一些術語,其解析規(guī)則,本文我們來繼續(xù)講述PHP命名空間動態(tài)訪問及使用技巧,希望能有所幫助 2014-08-08
最新評論
面向?qū)ο?對象概念是面向?qū)ο蠹夹g的核心。在顯示世界里我們所面對的事情都是對象,如計算機、電視機、自行車等。在面向?qū)ο蟮某绦蛟O計中,對象是一個由信息及對信息進行處理的描述所組成的整體,是對現(xiàn)實世界的抽象.
對象的主要三個特性
對象的行為:可以對 對象施加那些操作,開燈,關燈就是行為。
對象的形態(tài):當施加那些方法是對象如何響應,顏色,尺寸,外型。
對象的表示:對象的表示就相當于身份證,具體區(qū)分在相同的行為與狀態(tài)下有什么不同。
面向?qū)ο竽P?/strong>
面向?qū)ο蟮母拍睿?br />
oop(面向?qū)ο蟮木幊?它能是其代碼更加簡潔易于維護并且具有更強的可重性
1、PHP面向?qū)ο螅ㄈ?/span>
四、OOP的高級實踐
4.3 Static-靜態(tài)成員
<?php date_default_timezone_set("PRC"); /** * 1. 類的定義以class關鍵字開始,后面跟著這個類的名稱。類的名稱命名通常每個單詞的第一個字母大寫。 * 2. 定義類的屬性 * 3. 定義類的方法 * 4. 實例化類的對象 * 5. 使用對象的屬性和方法 */ class Human{ public $name; public $height; public $weight; public function eat($food){ echo $this->name."'s eating ".$food."<br/>"; } } class Animal{ public $kind; public $gender; } class NbaPlayer extends Human{ // 類的屬性的定義 public $name="Jordan";// 定義屬性 public $height="198cm"; public $weight="98kg"; public $team="Bull"; public $playerNumber="23"; private $age="44"; public $president="David Stern"; // 類的方法的定義 public function changePresident($newP){ $this->president=$newP; } public function run() { echo "Running<br/>"; } public function jump(){ echo "Jumping<br/>"; } public function dribble(){ echo "Dribbling<br/>"; } public function shoot(){ echo "Shooting<br/>"; } public function dunk(){ echo "Dunking<br/>"; } public function pass(){ echo "Passing<br/>"; } public function getAge(){ echo $this->name."'s age is ".$this->age; } function __construct($name, $height, $weight, $team, $playerNumber){ print $name . ";" . $height . ";" . $weight . ";" . $team . ";" . $playerNumber."\n"; $this->name = $name; // $this是php里面的偽變量,表示對象自身 $this->height = $height; // 通過$this可以設置對象的屬性值 $this->weight = $weight; $this->team = $team; $this->playerNumber = $playerNumber; } } /** * 1. 類實例化為對象時使用new關鍵字,new之后緊跟類的名稱和一對括號。 * 2. 使用對象可以像使用其他值一樣進行賦值操作 */ $jordan = new NbaPlayer("Jordan", "198cm","98kg","Bull","23");echo "<br/>"; $james=new NbaPlayer("James", "203cm", "120kg", "Heat", "6");echo "<br/>"; // 訪問對象的屬性使用的語法是->符號,后面跟著屬性的名稱 echo $jordan->name."<br/>"; // 調(diào)用對象的某個方法使用的語法是->符號,后面跟著方法的名稱和一對括號 $jordan->run(); $jordan->pass(); //子類調(diào)用父類的方法 $jordan->eat("apple"); //試著調(diào)用private,直接以及通過內(nèi)部的public函數(shù) //$jordan->age; $jordan->getAge();echo "<br/>"; $jordan->changePresident("Adam Silver"); echo $jordan->president."<br/>"; echo $james->president."<br/>"; 直接從上述例子開始吧。 這里想得到的是,把兩位對象的某一個變量同時變掉?!胹tatic public static $president="David Stern"; // 類的方法的定義 public static function changePresident($newP){ static::$president=$newP;//這里static換成self更符合規(guī)范 }
注意這里static的位置,以及,方法內(nèi)的::
調(diào)用的方法也有所變動。
echo NbaPlayer::$president;echo "<br/>"; NbaPlayer::changePresident("Adam Silver"); echo NbaPlayer::$president;echo "<br/>";
也就是像之前說的,靜態(tài)成員就是個常量,所以不針對某個具體的對象(不受具體對象的約束)——基于此,定義&賦值&調(diào)用都不需要具體的對象參與。
內(nèi)部調(diào)用要用self/static::$...
外部調(diào)用,類名::
用處就是所有的對象共用的數(shù)據(jù)。
--如果內(nèi)部調(diào)用時,變量在父類中
比如說,在上述例子中,父類human中寫這么一句話
public static $aaa="dafdfa";
然后在子類nbaplayer中,調(diào)用父類的靜態(tài)成員時,要
echo parent::$aaa;
而外部調(diào)用,按照上面說的,類名::,所以,直接父類類名即可
echo Human::$aaa;
--其他
在靜態(tài)方法中,是無法訪問其他變量的,也就是說,不能用$this->
--小結
/**
* 靜態(tài)成員
* 1. 靜態(tài)屬性用于保存類的公有數(shù)據(jù)
* 2. 靜態(tài)方法里面只能訪問靜態(tài)屬性
* 3. 靜態(tài)成員不需要實例化對象就可以訪問
* 4. 類內(nèi)部,可以通過self或者static關鍵字訪問自身的靜態(tài)成員
* 5. 可以通過parent關鍵字訪問父類的靜態(tài)成員
* 6. 可以通過類名稱在外部訪問類的靜態(tài)成員
*/
4.4 Final成員
--問題
不希望某個類擁有子類;
不希望子類修改父類中的某個變量(避免重寫?)
--final
》=php5版本
舉個例子
class BaseClass{ public function test(){ echo "BaseClass::test called<br/>"; } public function test1(){ echo "BaseClass::test1 called<br/>"; } } class ChildClass extends BaseClass{ public function test(){ echo "ChildClass::test called<br/>"; } } $obj=new ChildClass(); $obj->test();
子類中編寫跟父類中完全一致的方法名(內(nèi)容可以不同),會完成對父類方法的重寫!
所以,不希望被重寫的父類中的方法,寫上final
final public function test(){
依此類推,對于不想有子類的父類,在類名那里寫上final
final class BaseClass{
--小結
/**
* 重寫和Final
* 1. 子類中編寫跟父類完全一致的方法可以完成對父類方法的重寫
* 2. 對于不想被任何類繼承的類可以在class之前添加final關鍵字
* 3. 對于不想被子類重寫(overwrite, 修改)的方法,可以在方法定義前面添加final關鍵字
*/
4.5 數(shù)據(jù)訪問
先把final都去掉
--parent
然后再子類中的方法中寫
parent::test();
運行后會發(fā)現(xiàn),依然可以通過parent的關鍵字調(diào)用父類中,即使是被重寫的數(shù)據(jù)
--self
然后在父類中的方法test中寫
self::test1();
運行后,發(fā)現(xiàn)self可以調(diào)用同一個類中的數(shù)據(jù)(其他方法/靜態(tài)變量/常量const)
--小結
/**
* 數(shù)據(jù)訪問補充
* 1. parent關鍵字可以用于調(diào)用父類被重寫的類成員
* 2. self關鍵字可以用于訪問類自身的成員方法,也可以用于訪問自身的靜態(tài)成員和類常量;不能用于訪問類自身的屬性;訪問類常量時不用在常量名稱前面加$符號
* 3. static關鍵字用于訪問類自身定義的靜態(tài)成員,訪問靜態(tài)屬性時需要在屬性名前面添加$符號
*/
4.6 對象接口
非常重要?。?!
--問題
不同的類,有著相同的行為,但相同的行為又有著不同的實現(xiàn)方法。
比如人和動物都會吃東西,但吃的方式方法又不太一樣。
--定義
接口就是把不同類的共同行為進行了定義,然后在不同的類里面實現(xiàn)不同的功能。
--栗子
//定義一個接口
interface ICanEat{
public function eat($food);
}
可以看到,接口中并沒有方法的具體實現(xiàn),但必須有方法!
那么,下面是,“人類會吃”
//具體對象,連接到接口 class Human implements ICanEat{ public function eat($food){ echo "Human eating ".$food.".<br/>"; } } $obj=new Human(); $obj->eat("shit");
請忽略我給出的“食物”。
注意,不再用extends,而是implements。然后,同樣是方法名的完全相同。然后,對象必須/最好實現(xiàn)方法。
繼續(xù)
interface ICanEat{ public function eat($food); } //具體對象,連接到接口 class Human implements ICanEat{ public function eat($food){ echo "Human eating ".$food.".<br/>"; } } class Animal implements ICanEat{ public function eat($food){ echo "Animal eating ".$food.".<br/>"; } } $obj=new Human(); $obj->eat("shit"); $monkey=new Animal(); $monkey->eat("banana");
讓動物也吃起來!
--逆向操作
判斷某個對象是否連接了某個接口。
var_dump($obj instanceof ICanEat);
會返回boolean值。
--更多的栗子
interface ICanPee extends ICanEat{ public function pee(); } class Demon implements ICanPee{ public function pee(){ echo "Can demon pee?"; } public function eat($food){ echo "Can demon eat ".$food; } } $ghost=new Demon(); $ghost->pee(); $ghost->eat("shit");
接口本質(zhì)上也是類,可以被繼承/繼承,但是使用繼承接口的接口,所有父類、“爺類”的方法都要有具體實現(xiàn)。
--小結
/**
* 接口
* 1. 接口的基本概念和基本使用方法
* 2. 接口里面的方法沒有具體的實現(xiàn)
* 3. 實現(xiàn)了某個接口的類必須提供接口中定義的方法
* 4. 不能用接口創(chuàng)建對象,但是能夠判斷某個對象是否實現(xiàn)了某個接口
* 5. 接口可以繼承接口(interface extends interface)
* 6. 接口中定義的所有方法都必須是公有,這是接口的特性。
*/
aaaaaaaaaaaaaa
bu xiang xie le....................
ming tian yao ge ..............
以上內(nèi)容是小編給大家介紹的PHP面向?qū)ο笤斀猓ㄈ?,希望大家喜歡。
- PHP面向?qū)ο蟪绦蛟O計之類常量用法實例
- PHP面向?qū)ο蟪绦蛟O計之接口用法
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (五) - PHP 命名空間
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (四) - 異常處理類Exception
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記(三) - 單例模式和工廠模式
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記 (二) - 靜態(tài)變量的屬性和方法及延遲綁定
- PHP 面向?qū)ο蟪绦蛟O計(oop)學習筆記(一) - 抽象類、對象接口、instanceof 和契約式編程
- php學習筆記 PHP面向?qū)ο蟮某绦蛟O計
- PHP5 面向?qū)ο蟪绦蛟O計
- PHP面向?qū)ο缶幊讨钊肜斫夥椒ㄖ剌d與方法覆蓋(多態(tài))
- PHP面向?qū)ο蟪绦蛟O計實例分析
相關文章
PHP命名空間(namespace)的動態(tài)訪問及使用技巧
上篇文章介紹了PHP命名空間的一些術語,其解析規(guī)則,本文我們來繼續(xù)講述PHP命名空間動態(tài)訪問及使用技巧,希望能有所幫助2014-08-08