簡體   English   中英

__autoload vs包括家庭

[英]__autoload vs include family

我今天發現了__autoload函數,在閱讀了這個函數的官方手冊頁后,有一點我完全沒有。

使用__autoload()和讓我們說require_once之間的區別是什么?

因為它看起來像自動加載是新的時尚方式來做所需的包括對我而言,使用require_once更好。 因此,__ autoload必須被定義到所有的php文件中,這意味着在那里寫下它的代碼,如果我把所有的 includes / require_once / ...等放到一個文件中讓我們把它叫做main_header.php那么我需要做的就是在我的網絡應用程序文件中寫一行代碼:

<?php require_once('main_header.php');  ?> 

我錯了嗎?

我可以看到自動加載的兩件事情(不一定是__autoload ;更喜歡更現代的spl_autoload_register ):

  1. 您不需要顯式包含類。 當然,你可以像你的例子一樣制作一個main_header.php ,然后下一個項目生效。
  2. 如果您只使用其中的10個,則不必加載100個類。

還值得指出的是,在對尚未定義的類的對象進行反序列化時也會觸發自動加載,這會使事情變得無比實用。 當然,在unserialize還有另一個鈎子(配置設置為unserialize_callback_func ),因此自動加載在技術上並不是必需的。 這絕對更好。

第一:使用spl_autoload_register()而不是__autoload()

當您嘗試訪問不存在的類時,將調用自動加載器。 使用include()您只需要包含一個類。 主要的區別在於,使用自動加載器只包含類,如果真的需要/使用它。

通常,您在一個文件中定義自動加載器,並在每個請求中包含此自動加載器。 如果你使用bootstrapping(意思是:一個文件,捕獲每個請求並將其重定向到適當的目標),它只需要在那里定義自動加載器。 所以它不需要在每個文件中定義它。

Autoloader用於延遲初始化。 它是最有效的MVC架構,而不是在這里和那里包含文件的網站,並在每個文件中定義數據庫連接字符串(這很糟糕)。

將自動加載與MVC框架一起使用可以節省資源並為模塊化帶來很多好處。 由於您不必包含具有類的文件,因此您只需在當前所在的控制器中實例化所需的類。

基本上,這是一個OOP的事情。 如果你沒有使用對象方法來構建你的網站,那么你不應該擔心它包含/ require是什么對你有用。

為工作選擇合適的工具。 自動加載用於在使用之前加載尚未定義的類的源代碼。 因此,您可以實例化目前尚未滿足文件的類。

如果您使用類並且您希望在中心位置需要文件,而不是在不同文件中使用單個點,這是有意義的。

但是,如果你正在使用包含並且需要讓我們說建立一個帶有菜單和頁腳的網站,這沒有意義。 Autoload不適用於此:

<html>
  <head><title>Reciepes collection - My Homepage</title></head>
  <body>
<?php include('header.html'); ?>
<h1>My Reciepes collection</h1>
<p>Cooking is one of my favorite hobbies .... (</p>....)
<?php include('footer.html'); ?>
  </body>
</html>

如果您正在使用require來加載函數,則也不能使用自動加載。

所以只是因為自動加載看起來有些人對你感興趣,這並不意味着它符合你的需求。

我個人在項目中使用它,我不想處理類的需求,以及我希望能夠從模塊化目錄和庫結構中動態加載類的項目。

我只使用spl_autoload_register()來注冊一個或多個自動加載實現。 這是在PHP中注冊自動加載功能的推薦方法,因為它允許有多個自動加載器。

我認為這取決於個人偏好。 對我來說,autoload是一種典型的php類型的東西 - 一種骯臟的“魔術引用” - 類似的黑客,它只存在,因為他們懶得坐下來為這個問題編寫一個干凈的解決方案 - 在這種情況下,足夠包裝系統+可捕獲的ClassNotFound異常。 在我們解決這個問題之前,我會堅持要include

所有的答案都是正確和充分的。 我只是想加上我的兩分錢。

首先,* _once函數很慢。 不要使用它們。

其次,在我正在開發的應用程序中,我有很多我依賴的類,我並不總是知道頁面中需要哪些類。

而不是創建一個main.php頁面,包括所有很多類; 顯然浪費資源和時間(包含和要求是昂貴的),我使用自動加載來包含這些文件,當頁面需要它們時。 因此,我所做的只是代碼,並自動添加類。

這也改善了您的代碼和目錄結構,因為您在命名類和文件時遵循系統。

只是一個補充。 在資源使用和速度方面(要求的降序和速度的增加順序):

Require_once(); include_once(); require(); 包括()

制作包括最好和最快。

另一個注意事項:包含和要求可能會在單元測試時變得很大。

我不知道如何防止要求/包括任何東西。 測試助手 ,可以做一些有用的事情,比如防止退出或死亡,但他們仍然無法模擬包含或要求。

Mockery建議使用自動加載來模擬公共靜態方法。

Autoload和包含家庭功能都有自己的位置。

Autoload用於在基於OO的腳本(即類和接口)中延遲加載模塊,並在使用new或靜態調用尚未加載的類的方法時調用。 這會觸發自動加載以運行嘗試加載(通常通過包含)相關類或接口的函數。 這種方法的優點是類只在需要時加載。 任何未使用的類都不會被加載。

對於那些仍需要include系列的項目,Autoload不能用於加載非類或接口的程序片段。

至於必須為每個需要自動加載的腳本添加自動加載功能? 在這種情況下,您將自動加載功能放在自己的文件中,並將其包含在需要自動加載的腳本中。 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM