詳解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用於多分類過程中,它將多個神經元的輸出,
php 擴充套件開發講解網址 菜鳥學php擴充套件 之 hello world(一) 菜鳥學php擴充套件 之 自動生成的擴充套件框架詳解(二) 菜鳥學php擴充套件 之 詳解擴充套件函式的傳參(如何獲取引數)(三) 菜鳥學php擴充套件 之 詳解php擴充套件的變數(四) 菜鳥學php擴充套件 之
菜鳥學php擴充套件 之 hello world(一) https://blog.csdn.net/u011957758/article/details/72234075 菜鳥學php擴充套件 之 自動生成的擴充套件框架詳解(二) https://blog.csdn.net/u
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