1. 程式人生 > >php如何使用自動載入(重寫url形成單一入口)

php如何使用自動載入(重寫url形成單一入口)

事情是這樣的,昨天我面了個試,發現自己對自動載入瞭解的很片面,於是我就去看自動載入的機制,而網上的例子講的都是方法含義,於是我自己寫了個簡單的例子。

什麼是自動載入了?在php5之前是沒有自動載入的,所以檔案之間的引入單純靠的是 大量的require/include,但是如果一個檔案存在很多require那事情就大了,於是這時候引入了自動載入機制。

自動載入機制一開始是隻有一個__autoload($class_name) {}  函式的,就是如果我們例項化類找不到該類就去呼叫這個函數了,但是後來發現不同的包的對映方式都是不一樣的,

但悲催的是自動載入往往就是看類名與磁碟對映規則,所以這時候引入spl_autoload_register(),這個會用spl的__autoload替換掉原來的__autoload,並且可以自定義方法名如下:

function autoload($class_name) {  //假如我是自己命名的方法
    # 執行你的載入操作
}
於是我們逐漸改用他,接下來我就會用spl的自動載入寫一個demo,比如訪問 http://www.autoload.com/admin/goods/index 時會載入到 檔案 ./admin/goods/index.class.php,步驟如下:

①首先是配置一個虛擬主機,廢話不多說教程百度有:https://jingyan.baidu.com/article/49ad8bce7661355834d8fad6.html

②然後在所配置的虛擬主機的根目錄下 新增 .htaccess 內容如下:

<IfModule mod_rewrite.c>
    RewriteEngine On
    
    RewriteRule ^ index.php [L]
</IfModule>
注:該作用是 將訪問該主機的請求全部指向index.php檔案進行處理。

③修改index.php檔案,對其自動載入方法進行改寫對應的對映規則如下:

<?php
global $paths;
//自動載入函式~用於載入類方法進來
function autoload($class_name) {
	global $paths;
	if(file_exists($paths['0'].'/'.$paths['1'].'.class.php')) {
		require($paths['0'].'/'.$paths['1'].'.class.php');
	}else {
		die('404');
	}
}

// 確保spl 自動載入棧已被初始化
if(false === spl_autoload_functions()){      
    if(function_exists('autoload')){ 
		spl_autoload_register('autoload');   
    }
 }  

//這裡先獲取請求url,然後例項化一個類,此時會通過自動載入將類方法載入進來
$base_path = ltrim($_SERVER['REQUEST_URI'], '/');
$paths = explode('/', $base_path);
//例項化類,並呼叫對應的方法
$obj = new $paths['1']();
if(method_exists($obj, $paths['2'])) {
	$obj->$paths[2]();
}else {
	die('404');
}

④在當前根目錄建立對應的檔案 admin/goods.class.php 並程式碼如下:
<?php
class goods {
	public function index() {
		echo '這裡是admin/goods.class.php下的index方法';
	}
}

⑤此時重啟下apache伺服器可看見效果如下:


若使用錯誤不存在路徑的會報錯如下:


最後測試的專案結構如下: