2

我有两个文件,如下所述:

路径:index.php

<?php
// Composer autload
require_once 'vendor/autoload.php';

//The commented code below works:
//$loader = new Twig_Loader_String();
//$twig = new Twig_Environment($loader);
//echo $twig->render('Hello {{ name }}!', array('name' => 'Fabien'));

//Bad proposal solution. How to avoid to explicit load all files with namespaces?
//  Please see the 'Important edit' below.
//include_once 'Core/Twig/Twig.php';
use Core\Twig\Twig as Twig;

$twig = new Twig();
var_dump($twig);

路径:Core/Twig/Twig.php

<?php
namespace Core\Twig;

class Twig
{
    public function configure()
    {
        $loader = new \Twig_Loader_String();
        $twig = new \Twig_Environment($loader);
        //just for testing
        echo $twig->render('Hello {{ name }}!', array('name' => 'Fabien'));
    }
}

但我遇到了一个致命错误:Class 'Core\\Twig\\Twig' not found.

我该如何解决这个问题?

PS:我尝试了命名空间的一些变体(如Core\TwigCore),使用(如Twig,,Core\TwigCore\Twig as Twig和新的(如Twig\Twig()Core\Twig)。不幸的是,没有任何效果。

重要编辑: 我明白为什么 php 没有找到类。需要一条类似的线include_once 'Core/Twig/Twig.php'。但问题仍然存在......我该如何避免这种情况?避免包含所有带有命名空间的文件?或者,如何在需要时自动加载这些文件?

4

2 回答 2

2

您可能错误地标记了命名空间。查看此命名空间入门中的“命名空间导入:使用关键字”部分。

路径:lib/vendor/core/Twig.php

<?php
namespace lib\vendor\core;

class Twig
{
    //Your code
}

路径:index.php

use lib\vendor\core\Twig;
$twig = new Twig();
var_dump($twig);
于 2013-03-24T15:53:35.457 回答
0

经过几次测试,我得到了答案。检查vendor/autoload.php.

我们需要一些不明确的东西(至少对我来说)。

composer.json我们需要把

psr-0 : {
    "MyNamespace" : "MyOwnVendorName"
}

对于这种情况,应运行以下代码:

Path: index.php

<?php
// Composer autload
require_once 'vendor/autoload.php';

use classes\MyApp\Twig\Twig;

$twig = new Twig;
var_dump($twig);

Path: core/classes/MyApp/Twig/Twig.php

<?php
namespace MyApp\Twig;

class Twig
{
    public function configure()
    {
        $loader = new \Twig_Loader_String();
        $twig = new \Twig_Environment($loader);
        //just for testing
        echo $twig->render('Hello {{ name }}!', array('name' => 'Fabien'));
    }
}

composer.json

{
    "psr-0" : {
        "MyApp" : "core/classes/"
    }
}

然后运行php composer.phar udpate

于 2013-04-09T00:34:31.230 回答