2017-11-25 95 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