1、以下代碼主要介紹了匿名對象和匿名類的使用方法以及匿名類的三種使用場景:
<?php header("content-type:text/html; charset=utf8"); /* *匿名類 *1.php7.0+才支持 *2.匿名類類似于匿名函數(shù) *3.匿名類適合于一次性的創(chuàng)建與引用 *4.匿名類總是于new一并用 */ class BadPerson{ private $name = '西門大官人'; public function story($name) { return $this->name.'喜歡上了:<span style="color:red">'.$name.'</span>'; } } //有三種方式訪問story() //1.對象 $badPerson = new BadPerson(); echo $badPerson->story('金蓮妹妹').'<hr>'; //2.匿名對象 echo (new BadPerson())->story('綠茶妹妹').'<hr>'; //3.匿名類 echo (new class { private $name = '西門大官人'; public function story($name) { return $this->name.'喜歡上了:<span style="color:red">'.$name.'</span>'; } })->story('神仙姐姐').'<hr>'; //匿名類的三種使用場景 //1.匿名類中可以使用構(gòu)造方法 echo (new class ('歐陽克'){ private $name; //匿名類中的構(gòu)造方法 public function __construct($name){ $this->name = $name; } public function story($name) { return $this->name.'喜歡上了: <span style="color:red">'.$name.'</span>'; } })->story('黃蓉').'<hr>'; //2.在匿名類中可以繼承其他類中的成員 class Kuhgfu{ protected $skill; //技能 public function __construct($art=''){ $this->skill = $art; } public function show() { return $this->skill ? : '排山倒海'; } } echo (new class ('西門慶','葵花點穴手') extends Kuhgfu{ private $name ; //匿名類中的構(gòu)造方法 public function __construct($art='',$name) { parent::__construct($art); $this->name = $name; } public function story($name) { return $this->name.'喜歡上了: <span style="color:red">'.$name.'</span>'; } public function show() { return $this->name.'的絕招是: '.'<span style="color:red">'.parent::show().'</span>'; } })->show().'<hr>'; //3.可以在類中嵌套一個匿名類 class Animal { //宿主類,扮演父類的角色 public $name = '狗'; protected $color ='黑色'; private $type = '哈士奇'; protected function info() { return '售價3000元'; } public function demo1() { //宿主類中的私有成員不能在匿名類中直接使用 //可以通過在匿名類中創(chuàng)建一個構(gòu)造方法將宿主類中的成員進行注入 //將宿主類中的私有成員屬性作為匿名類中的構(gòu)造方法的參數(shù)傳入即可 return (new class ($this->type) extends Animal { //1.在匿名類中創(chuàng)建一個屬性用來接受宿主的私有屬性 private $type; //2.創(chuàng)建一個構(gòu)造方法 public function __construct($type){ $this->type = $type; } public function demo2(){ return '我是嵌套匿名類中的方法'.__METHOD__; } public function show(){ return '動物的名稱是:'.$this->name.'<br>'. '動物的顏色是:'.$this->color.'<br>'. '動物的種類是:'.$this->type.'<br>'; } }); } } //訪問匿名類中的 demo2() echo (new Animal())->demo1()->demo2(); echo '<hr>'; echo (new Animal())->demo1()->show();
說明:以上代碼主要介紹了匿名對象及匿名類的使用方法及場景,匿名類只能在php7.0之后的版本中才可以使用,其中匿名類的三種使用場景主要有:1.匿名類中可以使用構(gòu)造方法;2.在匿名類中可以繼承其他類中的成員;3.匿名類可以在類中嵌套一個匿名類,其原理是:通過在匿名類中創(chuàng)建一個構(gòu)造方法將宿主類中的成員進行注入,將宿主類中的私有成員屬性作為匿名類中的構(gòu)造方法的參數(shù)傳入即可。
2、以下代碼主要介紹了Trait類技術(shù):
<?php header("content-type:text/html; charset=utf8"); /** * *Triat 是什么東西? *1.php 只能實現(xiàn)單繼承,trait打破了限制 *2.trait 是代碼復(fù)用機制(函數(shù),類的繼承) *3.trait 使用類的語法,但不是類,所以不能實例化 *4.trait * **/ if (!class_exists('Person')){ class Person { protected $name; public function __construct($name = '小明'){ $this->name =$name; } public function study($course='php'){ return $this->name.'在學(xué)習(xí):'.$course; } } } //創(chuàng)建一個trait 特性類 trait Course { public $frient = '小紅'; public function study($name='踢足球'){ return $this->name.'在學(xué)習(xí)'.$name; } } trait Recreation { public $friend = '小軍'; public function study($name='打籃球'){ return $this->name.'和'.$this->friend.$name; } } //問題1:父類Person 與 trait類Course之間的關(guān)系? //trait類位于Person與Student類之間 class Student extends Person { // use Course;//導(dǎo)入了一個trait類 // use Recreation; use Course, Recreation { Course::study insteadof Recreation; Recreation::study as MySport; } } $student = new Student(); echo $student->study().'<hr>'; echo $student->MySport().'<hr>'; ?>
說明:Trait類在php中的使用是非常重要的,它打破了php中類的單繼承的限制,可以使用Trait類實現(xiàn)代碼復(fù)用機制,它使用類的語法,但不是類,所以不能實例化。
3、以下代碼主要介紹了類的自動加函數(shù)的使用方法:
<?php header("content-type:text/html; charset=utf8"); /** * *類的自動加載 * **/ // require './class/Demo1.php'; // require './class/Demo2.php'; spl_autoload_register(function($className){ require './class/'.$className.'.php'; //存在命名空間的情況下 // $className = str_replace("\\","/", $className); // require './class/'.$className.'.php'; }); echo Demo1::CLASS_NAME.'<hr>'; echo Demo2::CLASS_NAME.'<hr>'; ?>
說明:類的自動加載主要是用spl_autoload_register()函數(shù)結(jié)合匿名方法得到類名,再通過拼接路徑得到此類的存在路徑從而實現(xiàn)類的自動加載;
4、以下代碼主要介紹了對象的序列化和反序列化的實現(xiàn)方法及使用的對應(yīng)的函數(shù):
<?php /* *序列化&反序列化 * */ $num = 300; echo serialize($num),'<hr>'; $name = 'coolper'; echo serialize($name),'<hr>'; $course = ['php','javascripr','html']; echo serialize($course),'<hr>'; class Db { //連接數(shù)據(jù)庫與返回值 public $db = null; public $host; public $user; public $pass; //構(gòu)造方法 public function __construct($host='127.0.0.1',$user='root',$pass='root'){ $this->host = $host; $this->user = $user; $this->pass = $pass; //確保實例化對象的時候能自動連接數(shù)據(jù)庫 $this->connect(); } private function connect() { $this->db=mysqli_connect($this->host,$this->user,$this->pass); } //對象序列化的時候自動調(diào)用 public function __sleep() { return ['host','user','pass']; } //反序列化: public function __wakeup() { $this->connect(); } } $obj = new Db(); /** *對象序列化 *1.只保存對象中的屬性,不保存方法 *2.只保存類名,不保存對象名 **/ echo serialize($obj),'<br>'; $tmp = serialize($obj); @var_dump(unserialize($tmp)); ?>
說明:以上代碼介紹了對象的序列化和反序列話,其中對象序列化使用的函數(shù)為serialize(),自動調(diào)用類中的sleep()方法將對象轉(zhuǎn)化為字符串保存下來,而對象的反序列化則使用unserialize(),自動調(diào)用類中的wakeuo()方法將轉(zhuǎn)化為字符串的對象重新轉(zhuǎn)化為對象,其中sleep()函數(shù)中的返回值限制序列化的對象。
總結(jié):對面向?qū)ο缶幊痰幕纠斫猓?/p>
我的理解就是面向?qū)ο笸活惖氖挛锟偨Y(jié)起來,然后把相同的屬性進行統(tǒng)一管理,實現(xiàn)代碼高效,規(guī)范和重用的目的,復(fù)就是把面向?qū)ο蟮娜筇卣骶褪欠庋b,繼承和多態(tài),封裝就是把一些重要的信息給封閉起來不是誰都可以隨便訪問,達到了重要信息保護的作用,三種范圍限制符private、protected、public;繼承則是將一類事物共有的屬性和行為抽象成一個父類,每一個子類是一個特殊的父類--有父類的行為和屬性,也有自己特有的行為和屬性。這樣做擴展了已存在的代碼塊,進一步提高了代碼的復(fù)用性;多態(tài)是面向?qū)ο蟮纳A,多態(tài)允許父類指向子類的對象,使代碼更加的靈活,功能更加的強大,面向?qū)ο笫蔷幊痰闹匾枷?,其中包括的知識點,例如對象的實例化,類的構(gòu)造方法、接口,抽象,系統(tǒng)方法,靜態(tài)函數(shù)等等都是需要建立在這一重要的思想上。
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號