原文連結:https://www.cnblogs.com/Hebe0115/p/3484975.html
base.php在上文已經說過,是在PC中重要的一個檔案,基本常量、核心類檔案的載入都由它來完成。
9行,定義了一個常量 IN_PHPCMS,在系統的入口定義一個常量,在其他檔案就判斷是否這個常量被定義,防止某人直接越過架構直接進入某些頁面,
這個常量在後面的模組、模型操作檔案中都會存在,以後朋友們在開發的時候也要嚴格按照這個要求和規範。
12-26行,主要定義了很多常量,這裡主要是對$_SERVER這個伺服器變數的運用,列印這個數組便知曉了。
HTTP_REFERER這個常量在後面會經常用到,它只要用於返回上級,在PC中經常很showmessage一起用。如showmessage('參數錯誤', HTTP_REFERER);
SYS_START_TIME在這裡是為後面的程式執行效率做準備的,在系統函數/phpcms/libs/functions/global.func.php裡第260行的execute_time()函數結合來用,可得出程式的執行時間。
27-60行,基本上是沒法聊下去了,因為這裡面基本上都和pc_base這個PC的核心類有關,我們暫時先把這一塊放在這,聊完了pc_base這個類,這幾段代碼也就能明白了,
pc_base這個類過長,也沒法很好的截圖,那麼我就直接以程式碼數來定位座標,方便大家閱讀。
pc_base是一個類檔案,關於這個類大家需要先清楚靜態方法及靜態變數,不明白的朋友要先惡補一下,否則將不好理解。
pc_base這個類裡面的方法很多都異曲同工,我們拿幾個典型的方法來開刀,他是load_sys_class 。(以下代碼解釋以Cnblogs的代碼編輯器為主,所以同學們要開啟原代碼以對準行數)
/** * 載入系統類別方法 * @param string $classname 類名 * @param string $path 擴充地址 * @param intger $initialize 是否初始化 */ public static function load_sys_class($classname, $path = '', $initialize = 1) { return self::_load_class($classname, $path, $initialize); }
76-78行,從注釋上看的出來,load_sys_class方法的三個參數分別是類名稱,路徑和是否執行個體化。同時把3個變數傳入了_load_class方法,那麼_load_class便是我們需要重點研究的方法了。
/** * 載入類檔案函數 * @param string $classname 類名 * @param string $path 擴充地址 * @param intger $initialize 是否初始化 */ private static function _load_class($classname, $path = '', $initialize = 1) { static $classes = array(); if (empty($path)) $path = 'libs'.DIRECTORY_SEPARATOR.'classes'; $key = md5($path.$classname); if (isset($classes[$key])) { if (!empty($classes[$key])) { return $classes[$key]; } else { return true; } } if (file_exists(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) { include PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php'; $name = $classname; if ($my_path = self::my_path(PC_PATH.$path.DIRECTORY_SEPARATOR.$classname.'.class.php')) { include $my_path; $name = 'MY_'.$classname; } if ($initialize) { $classes[$key] = new $name; } else { $classes[$key] = true; } return $classes[$key]; } else { return false; } }
107行,static變數,我做項目來使用static主要是倆個方面1、算數累加 2、判斷是否重複。
108行,如果$path為空白,那麼路徑就為libs/class/這個目錄,同時這也是系統的類庫,開發過程可以把第三方類庫放這裡。
110行,加密了路徑和名稱,目前還不知道作用,我們先往下看。
111-117行,判斷設定了$classes[$key],目前程式走到這裡,這個判斷是false,但具體作用我們還不知道,先放著,繼續往下看。
113-114行,如果這個檔案存在,那麼載入它。
115-118行,這個主要是判斷是否有自己的方法,以防升級出錯。
117-121行, 這裡$initialize為真就初始化這個類,同時賦值給$classes[$key],看到這裡你就該明白111-117行為什麼要做這個判斷了嗎。如果這個變數有值得話表示已經載入過了就不在重複載入以確保執行效率。這裡在多說一點,變數$initialize =0或是1的區別在於載入類檔案之後是繼承還是使用裡面的方法。
這個方法到這裡算結束了,主要是載入你指定的類檔案,如果檔案已經載入過了就不重複載入,然後執行是否初始化這個操作。
load_sys_class($classname, $path = '', $initialize = 1) /phpcms/libs/classes/$classname.class.php
load_app_class($classname, $m = '', $initialize = 1) /phpcms/modules/ROUTE_M/classes/$classname.class.php
load_model($classname) /phpcms/model/$classname.class.php
load_sys_func($func) /phpcms/libs/functions/$func.func.php
load_app_func($func, $m = '') 如果 $m為空白 /phpcms/modules/ROUTE_M/functions/$func.func.php 否則 /phpcms/modules/$m/functions/$func.func.php