【问题标题】:Mustache.php initiated from within a namespace - include(): failed to open stream从命名空间内启动的 Mustache.php - include(): 无法打开流
【发布时间】:2017-11-26 23:50:18
【问题描述】:

当使用简单的自动加载器时,Mustache.php 从命名空间 webpage 内启动会正确呈现数据,但还会返回一长串关于未能包含其许多文件的警告。按照官方documentation 的建议,通过要求其Autoloader.php 加载Mustache。

我发现了几个讨论类似问题的帖子(12)。典型的解决方案是在Mustache_Autoloader::register(); 前面添加\ 以将其加载到全局命名空间中。但是,这似乎对我不起作用。

在 Google Cloud PHP 开发服务器 (5.5.26) 和成熟的 PHP 服务器 (7.1.9) 上都会生成相同的警告列表。

最少的代码如下。

目录结构:

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

index.php的内容:

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

new \webpage\home;

home.php的内容:

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!'));
    }
}

请注意,在输出的最底部是一个正确渲染的字符串“Hello 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!

您知道如何解决吗?谢谢。

【问题讨论】:

    标签: php namespaces mustache.php


    【解决方案1】:

    PHP 在尝试加载文件时按顺序尝试每个注册的自动加载器。一旦一个自动加载器成功加载文件,它就会停止尝试。在您的情况下,它在尝试 Mustache 自动加载器之前在 index.php 中尝试自动加载器。

    index.php中的自动加载器太幼稚了:

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

    这段代码盲目地调用include,使用它给出的任何类名,不管这样的文件是否存在。从输出中可以看出,它试图在 controllers 中为 Mustache 使用的每个类包含一个文件。

    代码并没有完全失败,因为在您的自动加载器无法加载文件后,PHP 会尝试下一个注册的自动加载器(Mustache 附带的那个)并成功加载必要的文件。

    您可以通过在包含文件之前检查文件的存在来修复您的自动加载器代码。您还可以通过在尝试加载文件之前检查类上的 webpage\ 命名空间前缀来使其更智能。

    【讨论】:

    • 我明白了,这就是原因!我已经使用if (is_file($_SERVER['DOCUMENT_ROOT'] . '/app/controllers/' . $class . '.php')) 来检查文件是否存在并且是否有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    • 2020-11-17
    • 2013-06-01
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    相关资源
    最近更新 更多