1、以下代碼是類的聲明與實(shí)例化的知識(shí),主要使用到了類的聲明主要使用關(guān)鍵字class,類的實(shí)例化主要用到關(guān)鍵字new,對象的成員反問符使用:->來實(shí)現(xiàn):
<?php /** * 類的聲明與實(shí)例化 * 1. 類聲明: class; * 2. 類的實(shí)例化: new * 3. 對象成員的訪問:-> */ //用關(guān)鍵字class聲明一個(gè)類 class Stu{ } //用關(guān)鍵字 new 實(shí)例化一個(gè)類 $stu = new Stu(); //給當(dāng)前對象添加一些屬性和方法 $stu->name = "王豪杰"; $stu->sex = "男"; $stu->hello = function (){ return "這是一個(gè)自定義的類方法"; }; //使用對象訪問符:-> 來訪問對象中的成員(屬性和方法) echo $stu->name.':'.$stu->sex.'<br>'; //錯(cuò)誤的調(diào)用方式,因?yàn)楫?dāng)前對象方法不是一個(gè)普通函數(shù),而是一個(gè)對象方法 // echo $stu->hello(); //正確的調(diào)用方式,對象方法應(yīng)該以回調(diào)的方式運(yùn)行 echo call_user_func($stu->hello); ?>
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
說明:以上代碼主要介紹了類的聲明與實(shí)例化的知識(shí)點(diǎn),是面向?qū)ο蟮幕A(chǔ)知識(shí),需要熟練的掌握才能進(jìn)一步學(xué)習(xí)更多面向?qū)ο蟮闹R(shí)。
2,一下代碼主要介紹了類常量和類屬性的重載知識(shí)點(diǎn):
<?php /** * 類常量,對象初始化,屬性的重載 * 1. 類常量可用來創(chuàng)建對象之間的共享數(shù)據(jù) * 2. 對象初始化: 用構(gòu)造方法實(shí)現(xiàn),創(chuàng)建對象之前會(huì)自動(dòng)調(diào)用,完成對象的一些初始化工作 * 例如:對象屬性初始化,創(chuàng)建對象時(shí)自動(dòng)調(diào)用的方法等,方法名稱固定:__construct() * 3.屬性重載:在類的外部訪問不存在或者無權(quán)限訪問的屬性時(shí),會(huì)自動(dòng)觸發(fā)此類方法調(diào)用 * 屬性重載涉及四個(gè)方法:__get(),__set(),__isset(),__unset() */ class Student{ //類常量:所有對象共享,用類名加范圍解析符(::)訪問,且默認(rèn)為公共屬性public //類常量可用來創(chuàng)建對象之間的共享數(shù)據(jù) const COURSE_NAME = 'php中文網(wǎng)'; //聲明三個(gè)私有的屬性 private $name; private $course; private $grade; //構(gòu)造方法 public function __construct($name,$course,$grade) { $this->name = $name; $this->course = $course; $this->grade = $grade; //構(gòu)造方法中不僅可以初始化對象屬性,還可以調(diào)用類方法 echo $this->show(); } //輸出屬性內(nèi)容 public function show(){ return $this->name .'的《'.$this->course.'》課程的成績是:'.$this->grade.'分!'; } //更新屬性的重載,魔術(shù)方法__set() public function __set($name,$value){ if($name == 'grade'){ return $name.':屬性不能修改'; } $this->$name = $value; } //獲取屬性的重載 public function __get($name){ if($name == 'grade'){ return $name.':屬性不存在'; } return $this->$name; } //屬性檢測的重載 public function __isset($name){ if ($name == 'course') { return false; } return isset($this->$name); } //銷毀屬性的重載 public function __unset($name) { if ($name == 'grade' || $name == 'name') { return false; } unset($this->$name); } } //訪問類常量:類常量可以被該類的所有對象所共享,所以不屬于任何一個(gè)對象,應(yīng)該使用類來訪問 echo '站點(diǎn)名稱: ', Student::COURSE_NAME, '<br>'; //實(shí)例化Student,創(chuàng)建對象 $stu = new Student('小豪','PHP',100); var_dump($stu); //訪問屬性,因?yàn)閷傩匀勘环庋b,所以必須通過一個(gè)統(tǒng)一的外部接口訪問 echo $stu->show(); echo'<hr>'; //如果想簡化以上操作,可以在實(shí)例化之前,在構(gòu)造方法中調(diào)用屬性訪問接口方法 new Student('小杰','PHP', 99); echo '<hr>'; //屬性操作: 獲取,設(shè)置,檢測,銷毀 //獲取 echo '姓名: '.$stu->name.'<br>';// 訪問私有屬性,如類中無__get()會(huì)出錯(cuò),如有自動(dòng)觸發(fā) echo '成績: '.$stu->grade.'<br>'; // 可以在__get()進(jìn)行屬性訪問的權(quán)限控制 //設(shè)置 $stu->course = 'Java'; echo '課程: '. $stu->course.'<br>';// 訪問私有屬性,如類中無__set()會(huì)出錯(cuò),如有自動(dòng)觸發(fā) $stu->grade = 66; //檢測,因?yàn)間rade私有,所以外部檢測不到,如類中有__isset()方法就可以檢測到 echo isset($stu->name) ? '存在<br>' : '<span style="color:red">不存在</span><br>'; echo isset($stu->grade) ? '存在<br>' : '<span style="color:red">不存在</span><br>'; //銷毀 unset($stu->course); //echo $stu->course,'<br>'; //解除注釋,就會(huì)報(bào)錯(cuò)提示該屬性不存在 unset($stu->name); // 重載方法中__unset()不允許銷毀grade和name屬性 echo $stu->name,'<br>'; // 所以這里仍可以訪問到name屬性
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
運(yùn)行截圖:
說明:以上代碼通過實(shí)例實(shí)現(xiàn)了類常量和類屬性的重載技術(shù):其中類常量可用來創(chuàng)建對象之間的共享數(shù)據(jù),在類的外部訪問不存在或者無權(quán)限訪問的屬性時(shí),會(huì)自動(dòng)觸發(fā)魔術(shù)方法方法調(diào)用,重載包含上的系統(tǒng)函數(shù)主要有四個(gè):__get(),__set(),__isset(),__unset()。
3,以下代碼主要介紹了類的繼承與方法重寫,繼承關(guān)鍵字為extends:
<?php /** * 對象三要素之: 繼承與多態(tài) * 1. 繼承是指類之間的繼承,是代碼復(fù)用的重要手段,之前我們是通過"函數(shù)"實(shí)現(xiàn)的代碼復(fù)用 * 2. 繼承使用關(guān)鍵字: extends * 3. 引用父類成員: parent:: * 4. 子類可以將父類中的公共和受保護(hù)成員全部繼承 */ class Teacher{ //父類屬性 public $name; public $age; private $grade; const APP_NAME = '教師管理系統(tǒng)'; //父類構(gòu)造器 public function __construct($name ,$age){ $this->name = $name; $this->age = $age; } //屬性訪問重載 public function __get($name){ if(property_exists($this, $name)){ return $this->$name; } return '<br>屬性不存在'; } } class Student extends Teacher { //子類自有屬性 private $sex; const APP_NAME = '學(xué)生管理系統(tǒng)'; //類常量可以在子類中重寫 //子類將父類同名方法進(jìn)行重寫,根據(jù)傳入?yún)?shù)不同,實(shí)現(xiàn)不同的功能,這就是多態(tài)性 public function __construct($name, $age, $sex='male') { // $this->name = $name; // $this->age = $age; //引用父類的構(gòu)造方法來簡化代碼 parent::__construct($name, $age); $this->sex = $sex; } //將父類屬性重載方法重寫后,順利讀取子類屬性 //所以屬性重載方法__get()應(yīng)該設(shè)置在最終工作類中(例如本類Demo4_1),而不是父類Demo4中 //此時(shí),將父類Demo4中的__get()刪除,代碼執(zhí)行仍然正確 public function __get($name) { if (property_exists($this, $name)) { return $this->$name; } return '屬性不存在<br>'; } } $stu = new Student('whj',24); //訪問父類中的屬性 echo $stu->name.'<br>'; echo $stu->age.'<br>'; echo $stu->grade.'<br>'; // 父類私有屬性子類不可見,訪問不到 echo Student::APP_NAME. '<br>'; // 訪問類常量 echo $stu->sex. '<br>'; //取不到值,因?yàn)楦割恄_get()不能識(shí)別子類屬性
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
說明:繼承是指類之間的繼承,是代碼復(fù)用的重要手段,繼承使用關(guān)鍵字: extends,引用父類成員: parent::值得注意的是子類繼承父類只可以將父類中的公有和受保護(hù)的成員全部繼承,另外子類將父類同名方法進(jìn)行重寫,根據(jù)傳入?yún)?shù)不同,實(shí)現(xiàn)不同的功能,這就是多態(tài)性;
4,以下代碼主要介紹了類中靜態(tài)成員的聲明與訪問,其中靜態(tài)成員聲明的關(guān)鍵字為static:
<?php /** * 類中的靜態(tài)成員與訪問 * 1.類中靜態(tài)成員使用關(guān)鍵字:static 定義; * 2.靜態(tài)成員包括: 靜態(tài)屬性和靜態(tài)方法; * 3.靜態(tài)成員是屬于類的,我們應(yīng)該最終使用類來訪問; * 4.靜態(tài)屬性必須使用類來訪問,而靜態(tài)方法即可以用類,也可以用對象訪問; * 5.靜態(tài)成員是可以有訪問限制的: public,protected,private; * 6.靜態(tài)成員與對象無關(guān),所以內(nèi)部不允許使用偽變量: $this; * 7.訪問時(shí),類名后必須使用:范圍解析符:雙冒號(hào)[::] * 8.在類中引用自身使用關(guān)鍵字: self:: * * 范圍解析符的作用: * 1. 訪問靜態(tài)成員; * 2. 訪問類常量; * 3. 繼承上下文中引用被覆蓋成員 */ class Demo{ public static $pdo = null; protected static $db = [ 'type' => 'mysql', 'host' => 'localhost', 'dbname' => 'db100', 'user' => 'root', 'pass' => 123456 ]; public static function connect(){ $dsn = self::$db['type'].':host='.self::$db['host'].';dbname='.self::$db['dbname']; self::$pdo = new PDO($dsn,self::$db['user'],self::$db['pass']); } public static function select($table,$fields='*',$num=5) { $stmt = self::$pdo->prepare("SELECT {$fields} FROM {$table} LIMIT {$num}"); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } } //連接數(shù)據(jù)庫 Demo::connect(); //查詢數(shù)據(jù)庫 $result = Demo::select('user','name,id,password',5); //顯示結(jié)果 echo '<pre>'.var_dump($result);
點(diǎn)擊 "運(yùn)行實(shí)例" 按鈕查看在線實(shí)例
說明:靜態(tài)成員是屬于類的,我們應(yīng)該最終使用類(self)來訪問,靜態(tài)屬性必須使用類來訪問,而靜態(tài)方法即可以用類,也可以用對象訪問;靜態(tài)成員與對象無關(guān),所以內(nèi)部不允許使用偽變量: $this。
總結(jié):今天學(xué)習(xí)了關(guān)于面向?qū)ο蟮牡谝粋€(gè),也是最基礎(chǔ)的東西。類的聲明和實(shí)例化,以及類常量和屬性的重載和類的繼承與方法的重寫,還有靜態(tài)變量的使用,類的三大特征封裝,繼承,和多態(tài),這些特征使得類的使用變得非常的靈活和多變,只有掌握好最最基礎(chǔ)的知識(shí)點(diǎn)才能在使用的時(shí)候信手拈來,還是需要多動(dòng)手敲代碼,熟能生巧就是這個(gè)道理。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)