php如何使用自動載入(重寫url形成單一入口)
阿新 • • 發佈:2019-02-11
事情是這樣的,昨天我面了個試,發現自己對自動載入瞭解的很片面,於是我就去看自動載入的機制,而網上的例子講的都是方法含義,於是我自己寫了個簡單的例子。
什麼是自動載入了?在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伺服器可看見效果如下:
若使用錯誤不存在路徑的會報錯如下:
最後測試的專案結構如下: