PHP面向對象的工具
阿新 • • 發佈:2018-01-11
pri pub 我們 進行 時也 false gpo 個數 包含
PHP通過類和方法等語言結構支持面向對象的編程。同時也通過對象相關的函數和內置類為面向對象提供廣泛支持
OOP的魔術方法
__autoload()自動加載類方法
常規引入類文件的問題 1.如果要包含多個類文件,是不是全都引入? 2.引入多個類文件,如果有些用不到,就會產生浪費 3.引入了類文件,可能會遺漏,比如說,創建一個對象,而這個對象的類文件沒有導入。就會產生錯誤 PHP引入了__autoload()內置方法來自動包含類文件。__autoload()應該被寫成單個參數的方法。當PHP引擎遇到試圖實例化未知類的操作時,會調用__autoload()方法,並將類名當作字符串參數傳遞給它.即當你試圖實例化類時,會調用__autoload()方法,加載意圖實例化的類文件 提示:此時要註意文件命令規範,一個類文件要以.class.php的後綴結尾
#文件名稱 Computer.class.php 提示: 這裏的Computer類名首字母大寫 vim Computer.class.php class Computer{ public $_name = "聯想"; public function __construct() { echo "<meta charset=utf8>"; } public function _run(){ return "我被運行了"; } } vim demo1.php function__autoload($_className){ require $_className.".class.php"; } $computer1 = new Computer(); echo $computer1->_name; echo $computer1->_run();
__call()屏蔽錯誤方法
//PHP采用了__call()內置方法屏蔽了對象調用方法時產生的錯誤,當對象調用一個不存在的方法時,會自動調用__call()方法。 提示:$methodName參數是一個字符串,$arguments是一個數組。私有方法,僅允許類內部調用
雖然在日誌會出現警告信息,但是為了程序的安全性,可以忽略! class Computer{ public $_name = "聯想"; public function __construct() { echo "<meta charset=utf8>"; } // $_methodname 是一個字符串 // $arguments 是一個參數數組 public function __call($_methodname, $arguments) { echo $_methodname ."方法錯誤,您調用的方法不存在,請查看當前類是否存在此方法<br>"; print_r($arguments); } } $computer1 = new Computer(); echo $computer1->_name; // 調用一個不存在的方法,並寫入參數 $computer1->_run("張三","開啟","筆記本","開啟win7系統");
__toString()打印對象的引用
//PHP使用__toString()內置方法來打印對象的引用。沒有使用__toString()的對象是產生一個錯誤,當打印對象的時候會自動調用__toString()方法。 提示:為了安全,應當設置為私有方法,僅允許類內部調用 class Computer{ public $_name = "聯想"; public function __construct() { echo "<meta charset=utf8>"; } private function __toString() { return "我是__toString方法運行的結果"; } } $computer1 = new Computer(); // 可以在輸入一個對象的引用 echo $computer1; // 同樣也可以在類實例化時輸出 echo new Computer();
__clone()克隆方法
首先要對比下三種模式
#分別實例化對象 $computer1 = new Computer(); $computer2 = new Computer();
#實例化一個對象,將引用賦值給另一個變量 $computer1 = new Comoputer(); $computer2 = $computer1;
#克隆模式 $computer1 = new Computer(); $computer2 = clone $computer1;
// PHP可以在類中定義一個__clone()內置方法來調整對象的克隆行為。當一個對象被克隆的時候自動執行__clone()方法,而復制的對象可以在其方法體內進行調整。 class Computer{ public $_name = "聯想"; public function __construct() { echo "<meta charset=utf8>"; } public function _run(){ echo $this->_name; } public function __clone() { $this->_name="IBM"; } } function diffComputer() { $computer1 = new Computer(); $computer1->_name = "DELL"; $computer2 = new Computer(); $computer1->_run(); $computer2->_run(); } function transComputer(){ $computer1= new Computer(); $computer2 = $computer1; $computer1->_name="DELL"; $computer2->_run(); } function cloneComputer(){ $computer1 = new Computer(); // 此時僅克隆了 $computer1為 $computer2 // 克隆後在當前時刻即將 $computer2指向堆內存中_name字段修改為 "IBM" 克隆函數中已定義 // 即可以理解為 在克隆的同時已修改了堆內存的屬性 $computer2 = clone $computer1; $computer2->_run(); $computer1->_run(); } echo "diffComputer function====>"; diffComputer(); echo "<br>"; echo "transComputer function=====>"; transComputer(); echo "<br>"; echo "cloneCompuer function=====>"; cloneComputer();
類函數和對象函數
PHP提供了一系列強大的函數來檢測類和對象。以便在第三方系統,運行時知道正在使用的是哪個。
//class_exists()函數接受表示類的字符串,檢查並返回布爾值。如果類存在,返回true,否則返回false. echo class_exists(‘Computer’);
//get_class()函數獲取對象的類名,如果不是對象,則返回false. echo get_class($computer);
// get_class_methods()函數獲取類中的方法(公共的),以數組的形式返回出來。 print_r(get_class_methods($computer));
// get_class_vars()函數獲取類中的字段(公共的),以數組的形式返回出來 print_r(get_class_vars(‘Computer‘));
// get_parent_class()函數獲取子類的父類,如果沒有返回false; echo get_parent_class("NoteComputer");
// interface_exists()函數確定接口是否存在,如果存在返回true,否則返回false echo interface_exists(‘Computer‘);
// is_a()函數確定對象是否是類或者這個類的父類時,返回true,否則返回false echo is_a($computer."Computer");
// is_subclass_of()函數確定對象是否是類的子類,是返回true,否則返回false echo is_subclass_of($NoteComputer,"Computer");
// method_exists()函數確定對象的方法是否存在,是返回true,否則返回false echo method_exists($computer,‘_run‘);
OOP的反射API
// PHP5的類和對象並沒有告訴我們類內部的一切,而只是報告了它們的公共成員。要充分了解一個類,需要知道其私有成員和保護成員,還要知道其方法所期望的參數,對此,使用反射API. 學習反射API可以翻閱PHP手冊閱讀Reflection這個類
// 獲得反射API的轉儲信息 $rc = new ReflectionClass("Computer"); Reflection::export($rc);
// 獲得PHP內置的類庫的信息 Reflection::export(new ReflectionClass(‘Reflection‘));
//獲取類裏的某個元素 $_rc = new ReflectionClass(‘Comoputer‘); echo $_rc->getFileName(); echo $_rc->getName();
PHP面向對象的工具