2017-06-02 90 views
2

我嘗試重構我的代碼並使用自動加載系統。現在,我在做:自動加載名稱空間的類文件

的index.php:

namespace example_com; 
use example_com\Core\Application; 
require 'Application.php'; 
$app = new Application(); 
$app->MyCustomFunction(); 

我想消除需要線;每當我調用新的Application()或新的Class()時,我都會要求。

我試圖象下面這樣:

的index.php

namespace example_com; 
use example_com\Core\Application; 

spl_autoload_register(function($className) { 
    $namespace = str_replace("\\", "/", __NAMESPACE__); 
    $className = str_replace("\\", "/", $className); 
    $class = ROOT . (empty($namespace) ? "" : $namespace . "/") . "{$className}.php"; 
    include_once($class); 
}); 

//require 'Application.php';//remove this 
$app = new Application(); 
$app->MyCustomFunction(); 

Application.php

namespace example_com\Core; 
class Application 
{ 
    //..contruct, properties, functions 
} 

= DEBUG OUTOUT =

spl_autoload_register(function($className) { //$className: "example_com/Core/Application" 
    $namespace = str_replace("\\", "/", __NAMESPACE__); //$namespace: "example_com" 
    $className = str_replace("\\", "/", $className); 
    $class = ROOT . (empty($namespace) ? "" : $namespace . "/") . "{$className}.php"; //$className: "example_com/Core/Application" $namespace: "example_com" $class: "example_com/example_com/Core/Application.php" 

我打算使用這在s中的不同文件中AME項目

更新1: 文件夾結構

App/ 
--Controllers/ 
----XController.php 
----YController.php 
Core/ 
--Controllers/ 
----IBaseController.php 
----BaseController.php 
--Application.php 
index.php 
+0

所有的課程都在同一個基礎文件夾中嗎?我想你應該把所有的類都放在同一個文件夾中,這樣你就可以創建一個'spl_autoload_register()',它將加載到頁面頂部(可能在一個包含的配置類型文件中),並覆蓋所有的類你的應用?我不認爲我會按每班製作自動加載器。這可能會減慢你的應用程序。 – Rasclatt

+0

我所有的課程都不在同一個文件夾中。我編輯顯示我的文件夾結構的主題 – reladawrefurhost

回答

0

爲了澄清我大約在同一文件夾評論,您的文件夾結構似乎有組織的,我只是確認你不只是上課浮動無處不在。會議或類似的後,我將僅實現一個自動加載磁帶機,找兩個點(見底例如,如果在多點)

在您的配置文件:

define('DS',DIRECTORY_SEPARATOR); 

spl_autoload_register(function($class) { 
    # Set base path 
    $default = ROOT.DS.'Core'; 
    # Set client/vendor path (provided "App" is the 
    # name of the root containing vendor libraries) 
    $app  = ROOT.DS.'App'; 
    # Create path 
    $path = str_replace('\\',DS,$class).'.php'; 
    # Check first that class exists in core 
    if(is_file($inc = str_replace(DS.DS,DS,$default.DS.$path))) 
     require_once($inc); 
    # Check if the class is in the "App" folder 
    elseif(is_file($inc = str_replace(DS.DS,DS,$app.DS.$path))) 
     require_once($inc); 
}); 

如果有更多的地方(或「應用程序」表示僞類庫的名字),我會用json文件與路徑的目錄:

/Core/prefs/namespaces.json

["NewFolder/Classes","OtherFolder/Somewhere/Deeper/Classes","Vendor/Classes"] 

在您的配置文件:

define('DS',DIRECTORY_SEPARATOR); 

spl_autoload_register(function($class) { 
    $default = ROOT.DS.'Core'; 
    $app  = ROOT.DS.'App'; 
    $path = str_replace('\\',DS,$class).'.php'; 

    if(is_file($inc = str_replace(DS.DS,DS,$default.DS.$path))) 
     require_once($inc); 
    elseif(is_file($inc = str_replace(DS.DS,DS,$app.DS.$path))) 
     require_once($inc); 
    # Here is where you will fetch the array of namespaces 
    else { 
     # Fetch and decode 
     $namespaces = json_decode(file_get_contents(ROOT.DS.'Core'.DS.'prefs'.DS.'namespaces.json'),true); 
     # Check to make sure there are namespaces to loop over 
     if(is_array($namespaces) && !empty($namespaces)) { 
      # Loop 
      foreach($namespaces as $base) { 
       # Check if the class file exists and include if it does 
       if(is_file($inc = str_replace(DS.DS,DS,ROOT.DS.$base.DS.$path))) 
        require_once($inc); 
      } 
     } 
    } 
}); 

在上述情況下,我可能會再對可搜索的一個或兩個文件夾該主機或者所有的供應商庫(包括您Core庫)或兩個工作所以一個Core和一個Vendor文件夾。

相關問題