1. 程式人生 > >PHP面向對象的工具

PHP面向對象的工具

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面向對象的工具