2017-11-25 115 views
0

使用簡單的自動加載器時,從名稱空間webpage內啓動的Mustache.php呈現數據正確,但也返回一長串警告,其文件。根據其官方documentation的推薦,鬍鬚需要加入Autoloader.phpMustache.php從命名空間中啓動 - include():未能打開流

我發現了幾篇文章(1,2),討論了類似的問題。典型的解決方案是在Mustache_Autoloader::register();之前加上\以將其加載到全局名稱空間中。但是,這似乎並不適合我。

在Google Cloud PHP Development Server(5.5.26)和成熟的PHP服務器(7.1.9)上都會生成相同的警告列表。

最小代碼如下。

目錄結構:

內容 index.php
. 
│ index.php 
└───app 
    ├───controllers 
    │ └───webpage 
    │   home.php 
    └───vendor 
     └───Mustache 
       Autoloader.php 

內容的 home.php
function autoloader($class) 
{ 
    include($_SERVER['DOCUMENT_ROOT'] . '/app/controllers/' . $class . '.php'); 
} 
spl_autoload_register('autoloader'); 

new \webpage\home; 

namespace webpage; 

class home 
{ 
    function __construct() 
    { 
     require $_SERVER['DOCUMENT_ROOT'] . '/app/vendor/Mustache/Autoloader.php'; 

     \Mustache_Autoloader::register(); 

     $mustache = new \Mustache_Engine(); 

     echo $mustache->render('Hello {{planet}}', array('planet' => 'World!')); 
    } 
} 

注意,在輸出的最底層是一個正確呈現字符串「你好,世界」。

Warning: include(D:/project/app/controllers/Mustache_Engine.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Engine.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Loader_StringLoader.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Loader_StringLoader.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Loader.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Loader.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Cache_NoopCache.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Cache_NoopCache.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Cache_AbstractCache.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Cache_AbstractCache.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Cache.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Cache.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Logger.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Logger.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Parser.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Parser.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Tokenizer.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Tokenizer.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Compiler.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Compiler.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Template.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Template.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_Context.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_Context.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 

Warning: include(D:/project/app/controllers/Mustache_HelperCollection.php): failed to open stream: No such file or directory in D:\project\index.php on line 5 

Warning: include(): Failed opening 'D:/project/app/controllers/Mustache_HelperCollection.php' for inclusion (include_path='.;D:\project;C:\Program Files (x86)\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\php\sdk') in D:\project\index.php on line 5 
Hello World! 

你有什麼想法如何解決它?謝謝。

回答

1

PHP嘗試在嘗試加載文件時按順序註冊每個自動加載器。一旦一個自動加載器成功加載文件,它就會停止嘗試。在你的情況下,它試圖使用index.php中的自動加載器,然後嘗試使用Mustache自動加載器。

而且在index.php自動加載磁帶機是太天真:

function autoloader($class) 
{ 
    include($_SERVER['DOCUMENT_ROOT'] . '/app/controllers/' . $class . '.php'); 
} 
spl_autoload_register('autoloader'); 

此代碼盲目地與任何類名它給了,這樣的文件是否存在調用include。你可以從輸出中看到,它試圖在Mustache使用的每個類中包含一個controllers的文件。

代碼沒有完全失敗,因爲在您的自動加載器無法加載文件後,PHP會嘗試下一個註冊的自動加載器(附帶Mustache的那個),併成功加載必要的文件。

您可以在包含它之前通過檢查文件的存在來修復自動加載器代碼。在嘗試加載文件之前,您還可以通過在類上檢查webpage\名稱空間前綴來使其更智能一些。

+0

我明白了,這就是爲什麼!我使用了'if(is_file($ _ SERVER ['DOCUMENT_ROOT']。'/ app/controllers /'。$ class。'.php'))'來檢查文件是否存在並且工作。謝謝! – Glen