本篇文章主要介紹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()
注意:其它的魔術方法都是在類中添加起作用,這是唯一一個不在類中添加的方法
只要在頁面中使用到一個類,只要用到類名,就會自動將這個類名傳給這個參數
<?phpfunction __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
<?phpclass One{ function fun1(){ echo "The Class One<br>"; }}?>
two.class.php
<?phpclass Two{ function fun2(){ echo "The Class Two<br>"; }}?>
three.class.php
<?phpclass 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);?>
以上就是本文的全部內容,希望對大家的學習有所協助。