面向對象的工具

OOP的魔術方法

PHP通過類和方法等語言結構支持面向對象的編程。同時也通過對象相關的函數和內置類爲面向對象提供廣泛支持

__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();
發佈了53 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章