2011-04-08 89 views
3

一個PHP項目,需要使用PHP的__autoload()功能,以下被認爲是管理的獨立功能的最佳實踐的OOP模式的優點工作時:提供自動加載功能的最佳實踐

例子是簡化爲簡潔

TL的緣故;博士:如何單機功能加載常用的處理:

  • 僞自動加載(通過__callStatic魔例如)[選項1]
  • 抽象輔助類分組的靜態方法[選項2]
  • 替代

還要注意,我已經發布了一個與選項1有關的參數/參考問題的相關問題,可以在這裏找到:__callStatic(), call_user_func_array(), references, and PHP 5.3.1

鑑於index.php

function __autoload($class){ 
    require $class . '.class.php'; 
} 

選項1;一個抽象類Core(或Library,或任何),該 「自動加載」 功能:

## Core.class.php 
abstract class Core{ 
    public static function __callStatic($function, $arguments){ 
     if(!function_exists($function)){ 
      require $function . '.function.php'; 
     } 
     return call_user_func_array($function, $arguments); 
    } 
} 

## SayHello.function.php 
function sayHello(){ 
    echo 'Hello'; 
} 

## SayGoodbye.function.php 
function sayGoodbye(){ 
    echo 'Goodbye'; 
} 

## index.php 
Core::sayHello(); // Hello 
Core::sayGoodbye(); // Goodbye 

選項2;將相關功能集成到抽象的「幫手」類被靜態調用:

## SayStuff.class.php 
abstract class SayStuff{ 
    public static function sayHello(){ 
     echo 'Hello'; 
    } 
    public static function sayGoodbye(){ 
     echo 'Goodbye'; 
    } 
} 

## index.php 
SayStuff::sayHello(); // Hello 
SayStuff::sayGoodbye(); // Goodbye 

回答

1

主要是因爲它使用call_user_func *這將是慢於直接調用函數我不會用「選項1」。

如果你只需要一些並不真正綁定在一起的輔助函數,那麼我可能會包含一個helpers.php文件,它只包含所有我沒有封裝在靜態類中的幫助函數列表,因爲封裝在這種情況下並沒有真正實現任何東西。大部分時間助手功能將用於每個請求,因此在每個請求中包含此文件不會造成任何傷害...

+0

**感謝rATRIJS; **我也在思考這些問題,這可能會嚴重影響遞歸函數。隨着時間的推移,我寫了很多函數,基本上擴展了PHP的核心功能,雖然有些可能用在給定的項目中,但有些不會。將它們劃分爲邏輯組(類別)是很困難的,因爲它們的一般性,然而這是我仍在考慮的選項。作爲一個單一的大型圖書館,每次加載它們都不是最佳的(我不認爲),因爲當我完成整合我的圖書館時,它會變得非常龐大。 – Dan 2011-04-09 00:59:41

+0

我在「選項1」中注意到的另一個問題是帶參數傳遞的參數的函數,當然根本不工作。已經忘記了這個警告。 – Dan 2011-04-09 01:47:51

4

我沒有看到確切的問題在這裏,但因爲標題包含「最佳實踐」,這裏有一個忠告,我」最近發現:

seems to be preferable to use PHP's SPL autoload functions instead of __autoload()(關於「大衛解剖」博客的好例子)。

引用鏈接的博客文章:

使用SPL 版本(即我可以看到最新)的最大好處是:

  • 超過可使用一個功能/已註冊 - 功能 鏈接在一起,並按順序使用 直到加載類文件的一個功能 。 +功能也可以在運行中未註冊。
  • 有一些不錯的錯誤處理可以實現(見 例3),儘管一些帽子 try/catch,所以這可能不符合你的 編碼風格。
  • 使用不同的擴展名(即不是.php或.php.inc或.php。公司)如果 你這麼選擇 spl_autoload_extensions()
  • 確保'我的'自動加載類不被覆蓋!如果 __autoload()稍後運行,我的spl_autoload_register()'編輯功能 將不會被替換。
+1

除此之外,使用符合PSR-0的自動裝載器可能是個好主意。有關更多信息,請參閱http://groups.google.com/group/php-standards/web/psr-0-final-proposal – mfonda 2011-04-08 22:00:38

+1

**感謝Frosty Z; **我非常欣賞'SPL'的建議, 'SPL'自動加載。我肯定會開始在未來的項目中實現它,而不是提供'__autoload'的核心。我會爲我的問題添加一個** tl; dr **以進行求和。 – Dan 2011-04-08 22:19:01