1、一個對象克隆另一個對象的時候,類里邊的__clone方法自動執行。
只要一個對象一誕生,就要有初始化的動作。如果副本對象和原來的對象一模一樣就會有問題,所以,這個時候需要調用__clone()方法。__clone()里邊的$this代表副本中的對象。$that代表原對象。
class A{
public $num = 1;
public function show(){
echo $this->num;//1
}
function __clone(){
echo ++$this->num;//2
}
}
$a = new A();
$b = $a;
echo intval($a===$b);//1
echo $a->show();
$b = clone $a;
//echo intval($a===$b);//0,內容雖然一樣,但是在內存中的地址不同
2、實例化的對象不可以直接用echo輸出,但是如果類中有__toString方法,就可以輸出相應的信息。
class B{
private $host;
private $dbname;
private $user;
private $pwd;
function __construct($host,$dbname,$user,$pwd){
$this->host = $host;
$this->dbname = $dbname;
$this->user = $user;
$this->pwd = $pwd;
}
public function connect(){
echo '連接數據庫';
}
public function gettable(){
echo '獲得表名';
}
public function insert(){
echo '插入數據庫';
}
function __toString(){
$method = get_class_methods(__CLASS__);//獲得當前類的所有方法(數組形式)
$methodString = implode('、',$method);
//return $methodString;//__construct、connect、gettable、insert、__toString
$vars = get_object_vars($this);//獲得當前對象的所有屬性(數組形式)
$varsString = implode('、',$vars);
return $varsString;//localhost、mydb、admin、admin
}
}
$b = new B('localhost','mydb','admin','admin');
echo $b;//如果類中沒有__toString方法會報錯
如果沒有toString()方法,直接輸出對象對發生致命性錯誤。
輸出對象時應注意:echo或print_r函數后面直接跟輸出的對象,中間不要加其他多余的字符,否則__toString()方法不會被執行,例如這種情況:echo '輸出對象'.$obj;
3、實例化的對象執行沒有定義的方法或無權限訪問的方法會報錯,但是通過__call方法可以避免報錯,并輸出一些提示信息!
class C{
public function show(){
echo 'show';
}
function __call($methodName/*方法名*/,$args/*參數*/){
echo $methodName;
}
}
$c = new C();
$c->go();
4、__get():當我們調用一個權限上不允許調用的屬性或不存在的屬性時,__get魔術方法會自動調用,并且自動傳參,參數值是屬性名。
class Person{
public $name = 'fxxy';
protected $age = 23;
private $sex = 'man';
function __get($var){
echo '你想訪問我的'.$var.'屬性';
}
}
$person = new Person();
echo $person->name;//fxxy
echo $person->age;//你想訪問我的age屬性
echo $person->sex;//你想訪問我的sex屬性
echo '<pre/>';
print_r($person);
5、__set():當我們給一個權限上不允許直接訪問或者是不存在的屬性設置屬性值時,__set魔術方法會自動調用,并且自動傳參,第一個參數數屬性名,第二個參數是屬性值。
class Person{
public $name;
protected $age;
private $sex;
public function __set($a,$b){
echo '你想給我的'.$a.'賦值'.'并且值是'.$b.'<br/>';
}
}
$person = new Person();
$person->name = 'fxxy';//fxxy
$person->age = '28';//你想給我的age賦值并且值是28
$person->sex = 'man';//你想給我的sex賦值并且值是man
echo $person->name.'<br/>';
6、用isset()判斷某個某個屬性屬性是否存在時,__isset()自動執行。
用unset()清除一個權限上不允許訪問或者是不存在的屬性時,__unset()自動執行。
class Person{
public $name = 'fxxy';
protected $age = '28';
private $sex = 'man';
function __isset($a){
echo '你想判斷我的'.$a.'值是否存在'.'<br/>';
}
function __unset($b){
echo '你想刪除我的'.$b.'屬性值'.'<br/>';
}
}
$person = new Person();
if(isset($person->name)){
echo $person->name.'<br/>';
}
if(isset($person->sex)){
echo '有這個值'.'<br/>';
}else{
echo '沒有這個值'.'<br/>';
}
unset($person->age);
/*
//運行結果如下:
fxxy
你想判斷我的sex值是否存在
沒有這個值
你想刪除我的age屬性值
*/
7、__sleep():在使用serialize()函數時,如果實例化的對象包含__sleep()方法,則會先執行__sleep()方法,這個方法返回一個數組,數組元素就是類屬性,可以包括全部的類屬性,也可以隨便包括其中的幾個。
__wakeup():unserialize()函數可以重新還原一個被serialize()函數序列化的對象,__wakeup()方法則是恢復在序列中可能丟失的數據庫連接及相關工作!
class Person{
public $name;
public $sex;
private $age;
public function __construct($name,$sex,$age){
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
public function __sleep(){
return array('name','age');
}
public function __wakeup(){
$age+=1;
return $this->name;
}
}
$person = new Person('fxxy','man',28);
$p1 = serialize($person);
echo $p1.'<br/>';
$p2 = unserialize($p1);
echo $p2->name;
因為對象是存儲在內存中的,為了提高程序運行效率,當某個對象使用完成之后,就會被垃圾回收機制回收,所以它不可能永久的保存在內存中,這樣的話如果其他頁面也需要用到這個對象,就比較困難了,這個時候可以把對象利用serialiaze()方法序列化,然后保存在到一個或數據庫中,這樣的話其他頁面就可以隨時調用了,然后想要刪除這個序列化的對象也是很簡單的。
8、__autoload()方法:
其他的魔術方法都是在類中添加起作用,這是一個唯一不在類中添加的方法。
只要在頁面中使用到一個類,只要用到類名,就會自動將類名傳給__autoload()的參數。
這里用到4個文件:test.php、OneAction.class.php、TwoAction.class.php、ThreeAction.class.php。
test.php文件中的代碼是:
function __autoload($className){
include $className.'.class.php';
}
$one = new OneAction();
$two = new TwoAction();
$three = new ThreeAction();
OneAction.class.php文件中的代碼是:
<?php
class OneAction{
public function __construct(){
echo 'oneAction'.'<br/>';
}
}
?>
TwoAction.class.php文件中的代碼是:
<?php
class TwoAction{
public function __construct(){
echo 'twoAction'.'<br/>';
}
}
?>
ThreeAction.class.php文件中的代碼是:
<?php
class ThreeAction{
public function __construct(){
echo 'threeAction'.'<br/>';
}
}
?>
需要注意的是:__autoload()方法中的參數是類名,當本腳本中實例化對象的時候找不到某個類,就會自動調用autoload魔術方法,所以魔術方法內部的inlude文件地址與類的名稱要相對應!
- 0、php安裝
- 1、選擇PHP作為首選后端語言的原因
- 2、PHP基本語法
- 3、PHP中變量和常量的區別
- 4、PHP中單引號和雙引號的區別
- 5、PHP檢測數據類型的幾種方式
- 6、PHP數據類型轉換
- 7、return、break、continue的區別
- 8、PHP代碼重用
- 9、字符串移除或添加函數
- 10、PHP中字符串大小寫切換以及翻轉和加密
- 11、PHP字符串截取和截取函數
- 12、PHP字符串替換和比較函數
- 13、PHP字符串url解析和實體轉換
- 14、addslashes在預定義字符串前添加反斜杠
- 15、PHP中的數組基本概念
- 16、數組函數implode、explode、in_array、each、list
- 17、PHP數組函數(count、reset、end、next、current、key)
- 18、ZendStudio軟件破解安裝包免費下載
- 19、【圖文】ZendStudio漢化方法
- 20、數組函數in_array、array_search、array_change_key_case、array_chu
- 21、關閉PHP提示的方法(運行出現Notice : Use of undefined constant 的完美解決方案
- 22、PHP數組函數(array_diff_ukey、array_diff_uassoc、array_intersect
- 23、PHP數組函數(array_fill、array_filter、array_flip、array_key_exis
- 24、PHP數組去重及向前向后刪除元素的函數
- 25、PHP數組函數(array_map、array_walk、array_walk_recursive)
- 26、PHP數組函數(compact、extract)
- 27、PHP數組函數(array_merge、array_merge_recursive)
- 28、PHP數組函數(range、array_count_values、array_product)
- 29、PHP數組函數(array_reduce、array_slice、array_splice、array_sum)
- 30、PHP數組排序函數總結
- 31、PHP中面向對象的基本概念及定義對象的方法
- 32、PHP創建對象與構造函數
- 33、PHP對象的釋放
- 34、PHP面向對象的特性(抽象、封裝、繼承、多態)
- 35、PHP面向對象的public、private、protected之間的區別
- 36、PHP面向對象中的final和const的用法
- 37、PHP面向對象的static關鍵字
- 38、PHP中的單例模式
- 39、$this、self、parent詳解
- 40、PHP中面向對象的抽象類和抽象方法
- 41、PHP面向對象中的接口interface
- 42、PHP面向對象中的魔術方法
- 43、面向對象方法get_object_vars、is_subclass_of、interface_exists
- 44、PHP中的數學函數方法總結
- 45、PHP文件處理disk_total_space、disk_free_space、dirname、file_exis
- 46、PHP目錄操作rename和scandir
- 47、PHP操作目錄opendir、readdir、glob
- 48、PHP打開fopen、讀取fread、寫入文件fwrite
- 49、PHP文件處理file_get_contents、file_put_contents、fgetc、fgets、fg
- 50、PHP截取字符串出現亂碼的解決方法(UTF8和GBK)
- 51、PHP文件內容分頁操作,避免亂碼
- 52、PHP文件操作函數file、set_include_path、copy
- 53、PHP文件操作函數filemtime、filectime、fileatime、touch
- 54、PHP文件操作指針函數feof、ftell、fseek、rewind、fpassthru
- 55、PHP文件操作pathinfo、realpath、flock、tempnam、tmpfile
- 56、設置php.ini配置實現表單文件上傳流程
- 57、PHP將上傳到臨時文件夾的文件移動到服務器指定文件夾內
- 58、PHP+input表單實現多文件上傳
- 59、PHP通過超鏈接實現文件下載
- 60、發送header文件頭信息實現文件下載
- 61、PHP中的日期時間_時區時間戳函數使用
- 62、PHP操作COOKIE緩沖區影響COOKIE傳遞方式
- 63、PHP中SESSION定義、建立、刪除方式
- 64、PHP.INI配置文件中關于session的設置
- 65、HP中Session緩存的概念與用法
- 66、PHP自定義Session處理機制
- 67、通過MYSQL數據庫操作Session會話完整源碼類
- 68、PHP連接數據庫實現分頁代碼
- 69、HTTP緩存實現原理詳解
- 70、PHP連接數據庫實現搜索+分頁功能
- 71、PHP圖像處理之建立畫布填充顏色、打開不同圖像類型處理
- 72、PHP顏色或圖像填充及不同填充方式
- 73、PHP圖像處理之畫線&定義線樣式&寬度&風格&筆刷
- 74、PHP圖像處理:繪制色素及矩形圖
- 75、PHP圖像處理之畫圓、弧線、網站餅狀統計圖繪制
- 76、PHP圖像處理之繪制多邊行及文字繪制
- 77、PHP 圖像處理之獲得文字寬高屬性&圖片水印函數功能
- 78、PHP生成圖片驗證碼demo【OOP面向對象版本】
- 79、PHP圖像處理 圖像處理之處理文字及獲得文字尺寸屬性,imagecopymerge imagecop
- 80、替換用戶輸入的QQ表情
- 81、PHP封裝MYSQL數據庫操作類源碼
- 82、PHP與XML技術結合使用解析