在php中,自動加載一般都是通過魔術方法__autoload來實現的,在程序中,當需要一個類的定義文件時(如實例化一個對象,集成自一個類),如找不到類定義文件時,就會自動觸發__autoload方法,所以我們可以在該方法中編寫代碼完成類的加載。要編寫代碼實現類的自動加載,很重要的兩點一是文件結構規劃,二是類的命名,尤其是命名,從命名中要體現出該類的所屬文件,比如PersonController,一看就知道是一個控制器,UserModel,一看便知是模型,這樣就可以到對應的目錄下去加載該類。針對你所列出的文件結構和文件命名,顯然不符合上述規則,所以想通過__autoload實現自動加載有難度。
創新互聯建站-專業網站定制、快速模板網站建設、高性價比尋烏網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式尋烏網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋尋烏地區。費用合理售后完善,10余年實體公司更值得信賴。
很多開發者寫面向對象的應用程序時對每個類的定義建立一個 PHP 源文件。一個很大的煩惱是不得不在每個腳本開頭寫一個長長的包含文件列表(每個類一個文件)。
在 PHP 5 中,不再需要這樣了。可以定義一個 __autoload() 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。
Tip
spl_autoload_register() 提供了一種更加靈活的方式來實現類的自動加載。因此,不再建議使用 __autoload() 函數,在以后的版本中它可能被棄用。
Note:
在 5.3.0 版之前,__autoload 函數拋出的異常不能被 catch 語句塊捕獲并會導致一個致命錯誤。從 5.3.0+ 之后,__autoload 函數拋出的異常可以被 catch 語句塊捕獲,但需要遵循一個條件。如果拋出的是一個自定義異常,那么必須存在相應的自定義異常類。__autoload 函數可以遞歸的自動加載自定義異常類。
Note:
自動加載不可用于 PHP 的 CLI 交互模式。
Note:
如果類名比如被用于 call_user_func(),則它可能包含一些危險的字符,比如 ../。 建議您在這樣的函數中不要使用用戶的輸入,起碼需要在__autoload() 時驗證下輸入。
Example #1 自動加載示例
本例嘗試分別從 MyClass1.php 和 MyClass2.php 文件中加載 MyClass1 和 MyClass2 類。
?php
function __autoload($class_name) {
require_once $class_name . '.php';
}
$obj = new MyClass1();
$obj2 = new MyClass2();
?
Example #2 另一個例子
本例嘗試加載接口 ITest。
?php
function __autoload($name) {
var_dump($name);
}
class Foo implements ITest {
}
/*
string(5) "ITest"
Fatal error: Interface 'ITest' not found in ...
*/
?
Example #3 自動加載在 PHP 5.3.0+ 中的異常處理
本例拋出一個異常并在 try/catch 語句塊中演示。
?php
function __autoload($name) {
echo "Want to load $name.\n";
throw new Exception("Unable to load $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e-getMessage(), "\n";
}
?
以上例程會輸出:
Want to load NonLoadableClass.
Unable to load NonLoadableClass.
Example #4 自動加載在 PHP 5.3.0+ 中的異常處理 - 沒有自定義異常機制
本例將一個異常拋給不存在的自定義異常處理函數。
?php
function __autoload($name) {
echo "Want to load $name.\n";
throw new MissingException("Unable to load $name.");
}
try {
$obj = new NonLoadableClass();
} catch (Exception $e) {
echo $e-getMessage(), "\n";
}
?
以上例程會輸出:
Want to load NonLoadableClass.
Want to load MissingException.
Fatal error: Class 'MissingException' not found in testMissingException.php on line 4
不僅僅thinkphp,MVC框架思路是一樣的。主要在一個核心類完成。
tp 是在App.class.php里完成。
1,讀取配置
配置文件里的配置
2,自動加載
核心類文件比如數據庫類文件,模板文件等,模型類文件等
自動加載,模塊,控制器等。
3,請求分發
實例化控制器。執行邏輯業務。
總之,這個文件完成把得到數據層數據,再分發到模板層。
說來簡單,其實也有點小復雜。
php 中有個魔術方法__autoload ,這個函數在找不到類的時候就會調用,自動加載就是在這里實現的。通過指定自動加載類的路徑,只要保證文件名和類名一樣。就可以自動加載。這也是為什么你看很多源碼中類的名字和文件名一樣的原因,這樣可以實現自動加載,不需要include.
這個和ajax技術密切相關.
ajax技術通俗來講 就是保證頁面不刷新的情況下.吧數據通過服務端展現給瀏覽器.
所以這里樓主可以使用ajax來實現.一下給出一個ajax例子
select?id="select"
option/option
/select
//此時select框是沒有任何數據的
給他加上value值改變觸發的事件
$("#select").change(function(){
$.get('index.php',data,function(res){
$("#select").append('option?value="'+res.val+'"'+res.content+'/option');//把獲取到的信息append到select框下
},'json');
});
//或者樓主是要這種情況.選中select的其中某個選項在加載數據
select?id="select"
option?value="1"/option
/select
$("#select").change(function(){
//這里假設選中了value?=1的option
var?val?=?$("#select").val();
$.get('index.php',{value:val},function(res){
sonsole.log(res);//打印從服務器獲取到的信息
},'json');
});
傳統上,在PHP里,當我們要用到一個class文件的時候,我們都得在文檔頭部require或者include一下:
?php
require_once('../includes/functions.php');
require_once('../includes/database.php');
require_once('../includes/user.php');
...
但是一旦要調用的文檔多了,就得每次都寫一行,瞅著也不美觀,有什么辦法能讓PHP文檔自動加載呢?
?php
function
__autoload($class_name)
{
require
"./{$class_name}.php";
}
對,可以使用PHP的魔法函數__autoload(),上面的示例就是自動加載當前目錄下的PHP文件。當然,實際當中,我們更可能會這么來使用:
?php
function
__autoload($class_name)
{
$name
=
strtolower($class_name);
$path
=
"../includes/{$name}.php";
if(file_exists($path)){
require_once($path);
}else{
die("the
file
{$class_name}
could
not
be
found");
}
}
也即是做了一定的文件名大小寫處理,然后在require之前檢查文件是否存在,不存在的話顯示自定義的信息。
類似用法經常在私人項目,或者說是單一項目的框架中見到,為什么呢?因為你只能定義一個__autoload
function,在多人開發中,做不到不同的developer使用不同的自定義的autoloader,除非大家都提前說好了,都使用一個__autoload,涉及到改動了就進行版本同步,這很麻煩。
也主要是因為此,有個好消息,就是這個__autoload函數馬上要在7.2版本的PHP中棄用了。
Warning
This
feature
has
been
DEPRECATED
as
of
PHP
7.2.0.
Relying
on
this
feature
is
highly
discouraged.
那么取而代之的是一個叫spl_autoload_register()的東東,它的好處是可以自定義多個autoloader.
//使用匿名函數來autoload
spl_autoload_register(function($class_name){
require_once('...');
});
//使用一個全局函數
function
Custom()
{
require_once('...');
}
spl_autoload_register('Custom');
//使用一個class當中的static方法
class
MyCustomAutoloader
{
static
public
function
myLoader($class_name)
{
require_once('...');
}
}
//傳array進來,第一個是class名,第二個是方法名
spl_autoload_register(['MyCustomAutoloader','myLoader']);
//甚至也可以用在實例化的object上
class
MyCustomAutoloader
{
public
function
myLoader($class_name)
{
}
}
$object
=
new
MyCustomAutoloader;
spl_autoload_register([$object,'myLoader']);
值得一提的是,使用autoload,無論是__autoload(),還是spl_autoload_register(),相比于require或include,好處就是autoload機制是lazy
loading,也即是并不是你一運行就給你調用所有的那些文件,而是只有你用到了哪個,比如說new了哪個文件以后,才會通過autoload機制去加載相應文件。
當然,laravel包括各個package里也是經常用到spl_autoload_register,比如這里:
/**
*
Prepend
the
load
method
to
the
auto-loader
stack.
*
*
@return
void
*/
protected
function
prependToLoaderStack()
{
spl_autoload_register([$this,
'load'],
true,
true);
}
分享標題:java源代碼加密工具,java密碼加密解密工具類
地址分享:http://m.kartarina.com/article10/heidgo.html
成都網站建設公司_創新互聯,為您提供建站公司、網站收錄、搜索引擎優化、小程序開發、關鍵詞優化、品牌網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯