您好,登錄后才能下訂單哦!
本篇內容介紹了“PHP面向對象中常用的關鍵字和魔術方法的作用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
PHP面向對象中常用的關鍵字
final
1.final不能修飾成員屬性(類中常量不是用這個關鍵字)
2.final只能修飾類和方法
作用:
使用final修飾的類不能被子類繼承
使用final修飾的方法不能被子類覆蓋
用來限制類不被繼承,方法不被覆蓋就使用final
<?php //final修飾的類不能被繼承 final class Person{ var $name; var $age; var $sex; function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function fun1(){ echo $this->name; } } //Student類繼承類用final修飾的Person類,所以會報錯 class Student extends Person{ } $stu=new Student("zs",20,"nan"); $stu->fun1(); ?>
static(靜態關鍵字)
1.使用static可以修飾成員屬性和成員方法,不能修飾類
2.用static修飾的成員屬性,可以被同一個類的所有對象共享
3.靜態的數據是存在內存中的數據段中(初始化靜態段)
4.靜態的數據是在類被第一次加載時分配到內存中的,以后再用到類時就直接從數據段中獲取
5.什么是類被加載?只要在程序中使用到這個類(有這個類名出現)
6.靜態方法(static修飾的方法),不能訪問非靜態的成員(在非靜態方法中可以訪問靜態成員)
因為非靜態的成員,就必須用對象來訪問,訪問內部成員使用的就是$this,而靜態方法不用使用對象調用,也就沒有對象,$this也就不能代表對象,非靜態的成員還必須使用對象
如果你確定一個方法中不使用非靜態成員,則可以將這個方法聲明為即靜態方法
注意:靜態的成員都要使用類名去訪問,不要創建對象,不用對象訪問
類名::靜態成員
如果在類中使用靜態成員,可以使用self代表本類
const
1.它只能修飾成員屬性
2.類中聲明常量屬性使用const
3.訪問方式和static靜態成員屬性一樣(在類外部使用 類名::常量 在類內部使用 self::常量)
4.常量一定要在聲明的時候就給初值
<?php //定義一個類“人們” class Person{ protected $name; protected $age; protected $sex; static $country="中國"; //聲明一個常量 const RUN="走"; //構造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function getCountry(){ //如果在類中使用靜態成員,可以使用self代表本類 return self::$country; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } protected function eat(){ echo "吃飯!<br>"; } function run(){ //在類的內部使用常量 self::常量 echo self::RUN."<br>"; } //聲明靜態的方法 static function hello(){ echo "你好<br>"; } }
PHP面向對象中常用的魔術方法
__call()
作用:調用對象中不存在的方法時,就會出現系統報錯,然后程序退出。
什么時候自動調用:就會在調用一個對象中不存在的方法時就會自動調用
處理一些不存在的錯誤調用
這個方法需要兩個參數
<?php //定義一個類“人們” class Person{ protected $name; protected $age; protected $sex; static $country="中國"; //聲明一個常量 const RUN="走"; //構造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function getCountry(){ //如果在類中使用靜態成員,可以使用self代表本類 return self::$country; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } protected function eat(){ echo "吃飯!<br>"; } function run(){ //在類的內部使用常量 self::常量 echo self::RUN."<br>"; } //處理一些不存在的錯誤調用 //就會在調用一個對象中不存在的方法時就會自動調用 function __call($methodName,$args){ //$methodName調用不存在方法的方法名 $args里面的參數 echo "你調用的方法{$methodName}(參數:"; print_r($args); echo ")不存在<br>"; } //聲明靜態的方法 static function hello(){ echo "你好<br>"; } } $p=new Person("張三",20,"女"); $p->test(10,20,30); $p->demo("aa","bb"); $p->say(); ?>
__toString()
直接輸出對象引用的時候自動調用,用來快速獲取字符串表示的最快捷的方法
<?php //定義一個類“人們” class Person{ protected $name; protected $age; protected $sex; static $country="中國"; //聲明一個常量 const RUN="走"; //構造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } function __toString(){ return self::$country."<br>{$this->name}<br>{$this->age}<br>{$this->sex}<br>".self::RUN; } } $p=new Person("張三",21,"女"); echo $p; ?>
__clone()
克隆對象使用clone()處理
原本(原來的對象)
復本(復制出來的對象)
__clone()就是在克隆對象時自動調用的方法
只要一個對象一創建,就要有初始化的動作,和構造方法__constuct作用相似
在__clone()方法中的$this關鍵字代表的是復本的對象,$that代表原本對象
<?php //定義一個類“人們” class Person{ var $name; protected $age; protected $sex; static $country="中國"; //聲明一個常量 const RUN="走"; //構造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } function __clone(){ $this->name="王五"; $this->age=18; $this->sex="男"; } function __destruct(){ echo $this->name."<br>"; } } $p=new Person("張三",21,"女"); $p->say(); //這并不能叫做克隆對象,因為在析構時只析構一次 /*$p1=$p; $p1->name="李四"; $p1->say();*/ $p1= clone $p; $p1->say(); ?>
__autoload()
注意:其它的魔術方法都是在類中添加起作用,這是唯一一個不在類中添加的方法
只要在頁面中使用到一個類,只要用到類名,就會自動將這個類名傳給這個參數
<?php function __autoload($className){ include "./test/".$className.".class.php"; } $o=new One; $o->fun1(); $t=new Two; $t->fun2(); $h=new Three; $h->fun3(); ?>
test里的文件
one.class.php
<?php class One{ function fun1(){ echo "The Class One<br>"; } } ?>
two.class.php
<?php class Two{ function fun2(){ echo "The Class Two<br>"; } } ?>
three.class.php
<?php class Three{ function fun3(){ echo "The Class Three<br>"; } } ?>
對象串行化(序列化):將一個對象轉為二進制串(對象是存儲在內存中的,容易釋放)
使用時間:
1.將對象長時間存儲在數據庫或文件中時
2.將對象在多個PHP文件中傳輸時
serialize(); 參數是一個對象,返回來的就是串行化后的二進制串
unserialize(); 參數就是對象的二進制串,返回來的就是新生成的對象
__sleep()
是在序列化時調用的方法
作用:就是可以將一個對象部分串行化
只要這個方法中返回一個數組,數組中有幾個成員屬性就序列化幾個成員屬性,如果不加這個方法,則所有成員都被序列化
__wakeup()
是在反序列化時調用的方法
也是對象重新誕生的過程
<?php //定義一個類“人們” class Person{ var $name; protected $age; protected $sex; static $country="中國"; //聲明一個常量 const RUN="走"; //構造方法 function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } function say(){ echo "我的名字:{$this->name},我的年齡:{$this->age},我的性別:{$this->sex}。<br>"; } function __clone(){ $this->name="王五"; $this->age=18; $this->sex="男"; } //是在序列化時調用的方法,可以部分串行化對象 function __sleep(){ return array("name","age"); } //是在反序列化時調用的方法,也是對象重新誕生的過程。可以改變里面的值 function __wakeup(){ $this->name="sanzhang"; $this->age=$this->age+1; } function __destruct(){ } } ?>
read.php
<?php require "11.php"; $str=file_get_contents("mess.txt"); $p=unserialize($str); echo $p->say(); ?>
write.php
<?php require "11.php"; $p=new Person("張三",18,"男"); $str=serialize($p); file_put_contents("mess.txt",$str); ?>
“PHP面向對象中常用的關鍵字和魔術方法的作用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。