1. 程式人生 > >詳解spl_autoload_register()函式以及自動載入不同目錄的類

詳解spl_autoload_register()函式以及自動載入不同目錄的類

在瞭解spl_autoload_register()函式之前,先來看另一個函式:__autoload。 

一、__autoload 

這是一個自動載入函式,在PHP5中,當我們例項化一個未定義的類時,就會觸發此函式。看下面例子:

printit.class.php

<?php

class PRINTIT {

 function doPrint() {

  echo 'hello world';

 }

}

?>

index.php

例1

<?

function__autoload( $class ) {

 $file = $class . '.class.php'; 

 if ( is_file($file) ) { 

  require_once($file); 

 }

}

$obj = newPRINTIT();

$obj->doPrint();

?>

執行index.php後正常輸出hello world。在index.php中,由於沒有包含printit.class.php,在例項化printit時,自動呼叫__autoload函式,引數$class的值即為類名printit,此時printit.class.php就被引進來了。 

在面向物件中這種方法經常使用,可以避免書寫過多的引用檔案,同時也使整個系統更加靈活。

例2(呼叫不同目錄的類)

<?php

function__autoload($_ClassName){

         if(substr($_ClassName,-6)=='Action'){

                   requireROOT_PATH.'/action/'.$_ClassName.'.class.php';

         }elseif(substr($_ClassName,-5)=='Model'){

                   requireROOT_PATH.'/model/'.$_ClassName.'.class.php';         

         }else{

                   requireROOT_PATH.'/includes/'.$_ClassName.'.class.php';

         }

}

?>

註釋:

ROOT_PATH:為定義的根目錄常量

action目錄存放控制類,model目錄存放模型類,includes存放其他類

類名嚴格定義,諸如class IndexAction{}、class ManageModel{}、class Tool{}等

二、spl_autoload_register() 

再看spl_autoload_register(),這個函式與__autoload有與曲同工之妙,看個簡單的例子: 

例1:

<?

functionloadprint( $class ) {

 $file = $class . '.class.php'; 

 if (is_file($file)) { 

  require_once($file); 

 }

}

spl_autoload_register('loadprint' );

$obj = newPRINTIT();

$obj->doPrint();

?>

將__autoload換成loadprint函式。但是loadprint不會像__autoload自動觸發,這時spl_autoload_register()就起作用了,它告訴PHP碰到沒有定義的類就執行loadprint()。

spl_autoload_register()呼叫靜態方法

<?

class test {

 public static function loadprint( $class ) {

  $file = $class . '.class.php'; 

  if (is_file($file)) { 

   require_once($file); 

  }

 }

}

spl_autoload_register(  array('test','loadprint')  );

//另一種寫法:spl_autoload_register(  "test::loadprint"  );

$obj = newPRINTIT();

$obj->doPrint();

?>

例2:(呼叫不同目錄的類)

define('PATH_ROOT',realpath(dirname(__FILE__)));  //根目錄

define('DS',DIRECTORY_SEPARATOR);//路徑分割 win下\ linux下/

define('PATH_CLASS',PATH_ROOT.DS.'includes/class/');

define('PATH_MODEL',PATH_ROOT.DS.'includes/model/');

define('PATH_CONTROL',PATH_ROOT.DS.'includes/control/');

spl_autoload_register("cms_autoload_class");

functioncms_autoload_class($str_className) {

    $_arr_class= explode("_", strtolower($str_className));

    print_r($_arr_class );

    switch ($_arr_class[0]) {

        case "class":

            require(PATH_CLASS . $_arr_class[1]. ".class.php");

            break;

        case "model":

            if (isset($_arr_class[2])&& !fn_isEmpty($_arr_class[2])) {

                //fn_isEmpty函式最後會解釋

                require(PATH_MODEL .$_arr_class[1] . "_" . $_arr_class[2] . ".class.php");

            } else {

                require(PATH_MODEL .$_arr_class[1] . ".class.php");

            }

            break;

        case "control":

            if (isset($_arr_class[3])&& !fn_isEmpty($_arr_class[3])) {

                require(PATH_CONTROL .$_arr_class[1] . DS . $_arr_class[2] . DS . $_arr_class[3] .".class.php");

            } else {

                require(PATH_CONTROL .$_arr_class[1] . DS . $_arr_class[2] . ".class.php");

            }

            break;

    }

}

比如控制類檔案的存放目錄為includes/control/setup/update.class.php

update.class.php檔案中的類名為 CONTROL_SETUP_UPDATE;

不難看出,類名CONTROL_SETUP_UPDATE與目錄名和類檔名的.class字首保持一致

利用$_arr_class = explode("_",strtolower($str_className));對類名引數$str_className進行分割,得到陣列$_arr_class =Array ( [0] => control, [1] =>setup, [2] => update ),分割成的陣列元素恰好就是目錄名以及類檔名.class的字首,然後對陣列元素進行判斷,若條件成立則required類檔案。

若想向縱深一級的目錄進行延伸,比如類檔案的存放目錄為:

includes/control/setup/manage/update.class.php那麼類名為CONTROL_SETUP_MANAGE_UPDATE

分割的陣列$_arr_class =Array ( [0] => control, [1] =>setup, [2] => manage, [3] => update)

若想向根目錄下的五級目錄進行延伸,則需要修改程式,得到$_arr_class[4]進行條件判斷。

知識擴充套件:fn_isEmpty()函式

PHP中判斷變數為空的幾種方法小結

1. isset功能:判斷變數是否被初始化

說明:它並不會判斷變數是否為空,並且可以用來判斷陣列中元素是否被定義過

if (!isset($b))echo '$b 未被初始化' . "";

2. empty功能:檢測變數是否為"空"

說明:任何一個未初始化的變數、值為 0 或 false 或 空字串"" 或 null的變數、空陣列、沒有任何屬性的物件,都將判斷為empty==true

注意1:未初始化的變數也能被empty檢測為"空"

functionfn_isEmpty($data) {

    if (!isset($data)) {

    returntrue;

    }

         if ($data === null) {

                   return true;

         }

         if (is_array($data) ||is_object($data)) {

    if(empty($data)) {

               returntrue;

    }

         } else {

    if(empty($data) || trim($data) === "") {

               returntrue;

    }

         }

         return false;

}

相關推薦

spl_autoload_register()函式以及自動載入不同目錄

在瞭解spl_autoload_register()函式之前,先來看另一個函式:__autoload。  一、__autoload  這是一個自動載入函式,在PHP5中,當我們例項化一個未定義的

softmax函式以及相關求導過

注意:圖片看不到,直接進知乎吧https://zhuanlan.zhihu.com/p/25723112 這幾天學習了一下softmax啟用函式,以及它的梯度求導過程,整理一下便於分享和交流! softmax函式 softmax用於多分類過程中,它將多個神經元的輸出,

getClass()和getClassLoader()區別 以及ClassLoader及用途(檔案載入載入

 1.1 幾個相關概念ClassLoader負責載入系統的所有Resources(Class,檔案,來自網路的位元組流等),通過ClassLoader從而將資源載入JVM   每個class都有一個reference,指向自己的ClassLoader。Class.getClassLoader()   arra

箭頭函式和普通函式的區別以及箭頭函式的注意事項、不適用場景

箭頭函式是ES6的API,相信很多人都知道,因為其語法上相對於普通函式更簡潔,深受大家的喜愛。就是這種我們日常開發中一直在使用的A

spl_autoload_register()函數

執行 再看 對象 gpo 參數 面向對象 使用 實例 來看 在了解這個函數之前先來看另一個函數:__autoload。 一、__autoload 這是一個自動加載函數,在PHP5中,當我們實例化一個未定義的類時,就會觸發此函數。看下面例子: prin

Mysql5.5以及5.7版本忘記管理員密碼處理機制

rest entos 之前 密碼重置 emc type hello mys 相關 簡介 使用Mysql時,如果忘記了其他用戶的密碼,可以使用root用戶重新設置,但是如果忘記了root的密碼,就需要采用下面的操作進行處理 實驗環境 系統環境:centos7.4 服務器IP

【C/C++開發】C++ 函式以及 delete 和delete[]的整理

轉自:http://hi.baidu.com/bystander1983/item/bf0b5c12b077cfec9913d651 delete和delete[] 的區別: C++告訴我們在回收用 new 分配的單個物件的記憶體空間的時候用 delete,回收用 new[] 分配的一組物

Javascript函式中with

Javascript函式中with,with函式方便用來引用某個物件中已有的屬性,但是不能用來給物件新增屬性,要給物件建立新的屬性,下面通過程式碼給大家講解。 js函式中with函式的用法分析 定義 方便用來引用某個物件中已有的屬性,但是不能用來給物件

ThinkPHP函式--D函式:例項化模型

D方法:應該是用的比較多的方法了,用於例項化自定義模型類,是ThinkPHP框架對Model類例項化的一種封裝,並實現了單例模式,支援跨專案和分組呼叫,呼叫格式如下: D('[專案://][分組/]模型','模型層名稱') 方法的返回值是例項化的模型物件。 D方法可以自動檢測模型類,如果存在自

一文“工廠模式”以及python語言的實現

一、什麼是“工廠模式”——factory pattern 工廠模式,也稱之為“簡單工廠模式”或者是“靜態工廠模式” 工廠模式(Factory Pattern)是 程式設計中 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。在工廠模式

【python】map函式的用法之函式並行作用解析

Python函式程式設計中的map(func, seq1[, seq2,…]) 函式是將func作用於seq中的每一個元素,其中seq須是可迭代物件,並將所有的呼叫的結果作為一個list返回。如果func為None,作用同zip()。 本文參考自:Python中map()函式淺析一文,感謝精彩分享。 下面

mybatis (八)------ 懶載入

目錄 1、需求:查詢訂單資訊,有時候需要關聯查出使用者資訊。 2、什麼是懶載入? 3、具體例項 4、總結   本章我們講如何通過懶載入來提高mybatis的查詢效率。   本章所有程式碼:百度雲盤/java例項/java框架—mybatis/mybatis懶載入.zip

webpack 外掛 html-webpack-plugin 的 實現html檔案自動生成

最近在學習webpack,接觸到的第一個外掛就是html-webpack-plugin,那麼今天就來詳解一下它的用法吧。 先來上一個例子: let htmlWebpackPlugin = require('html-webpack-plugin') const path

B+tree以及mysql的索引原理 一

最近在學mysq的索引,網上查了很多資料但都沒有很好理解的,現在先講講b+tree 動態查詢樹主要有:二叉查詢樹(Binary Search Tree),平衡二叉查詢樹(Balanced Binary Search Tree),紅黑樹 (Red-Black Tree )

Linux Shell命令自動補全

在Linux命令列下,輸入字元後,按兩次Tab鍵,shell就會列出以這些字元打頭的所有可用命令。如果只有一個命令匹配到,按一次Tab鍵就自動將這個命令補全。比如,想更改密碼,但只記得這個命令前幾個字母是pass。這時候,按Tab鍵,shell就自動輸出 passwd 命令,

機器學習概念篇:一文函式和凸優化,乾貨滿滿

在機器學習各種優化問題中,凸集、凸函式和凸優化等概念經常出現,其是各種證明的前提條件,因此認識其性質對於優化問題的理解尤為重要,本文便就凸集、凸函式和凸優化等各種性質進行闡述,文末分享一波凸優化的學習資料和視訊! 一、幾何體的向量表示 在介紹凸集等概念之前

C++繼承之二——派生成員函式函式隱藏、建構函式與相容覆蓋規則)

  在這一篇文章開始之前,我先解決一個問題。   在上一篇C++繼承詳解之一——初探繼承中,我提到了在派生類中可以定義一個與基類成員函式同名的函式,這樣派生類中的函式就會覆蓋掉基類的成員函式。   在譚浩強的C++程式設計這本書第十一章,351頁最下面有這麼

Java中Class、用法以及泛化

在前面我們將類的載入的時候,類載入一共有5步,載入,驗證,準備,解析和初始化。其中載入階段,除了將位元組碼載入到方法區,還生成了這個了的Java.lang.Class物件。那麼這個Class物件到底有什麼用呢? 前面的關於反射的文章,我們多次都用到了Class類,可以用這個

【C++】的六大預設的成員函式函式以及建構函式和解構函式的呼叫順序

                                              解構函式 一.解構函式定義               解構函式也是特殊的成員函式,他的作用和建構函式相反。 class Box { public: //建構函式 Box(i