命名空间中的 PHP 自动加载 [英] PHP Autoloading in Namespaces

查看:36
本文介绍了命名空间中的 PHP 自动加载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的命名空间中的自动加载有一个小问题.如此处的 PHP 手册所示:http://us.php.net/manual/en/language.namespaces.rules.php 你应该能够使用全限定名自动加载命名空间函数,例如gluecommonis_email().

I have had a slight problem with autoloading in my namespace. As shown on the PHP manual here: http://us.php.net/manual/en/language.namespaces.rules.php you should be able to autoload namespace functions with a full qualified name e.g. gluecommonis_email().

我有一个函数 spl_autoload_register(array($import, "load"));在初始命名空间中,但是每当我尝试从初始命名空间调用 gluecommonis_email() 时,它都不会传递该自动加载函数,但是当使用 new is_email() (在类的上下文中)时,它会传递.我不明白手册说我可以从完全限定的名称自动加载,但我不能:.

Thing is I have a function spl_autoload_register(array($import, "load")); within the initial namespace but whenever I try and call gluecommonis_email() from the initial namespace it will not pass that autoload function but when using new is_email() (in the context of a class) it will. I don't get it the manual says I can autoload from fully qualified names but I can't :.

这是我的代码:

namespace glue;

require_once 'import.php';

use glueimport as import;
use gluecore
outer as router;

$import = new import();

spl_autoload_register(array($import, "load"));

/** Works and echos glue
outer **/
$router = new router();

/** Don't do nothing **/
$cheese = gluecommonis_email($email);

我也试过这个代码:

namespace glue;

require_once 'import.php';

use glueimport as import;
use gluecore
outer as router;
use gluecommon;

$import = new import();

spl_autoload_register(array($import, "load"));

/** Works and echos glue
outer **/
$router = new router();

/** Don't do nothing **/
$cheese = commonis_email($email);

最后是这段代码:

namespace glue;

require_once 'import.php';

use glueimport as import;
use gluecore
outer as router;
use gluecommonis_email as F;

$import = new import();

spl_autoload_register(array($import, "load"));

/** Works and echos glue
outer **/
$router = new router();

/** Don't do nothing **/
$cheese = F($email);

推荐答案

这是唯一正确的答案.

每个命名空间都需要自己的 spl_autoload_register() 函数.

此外,spl_autoload_register() 语法在 5.3 中更改:

also, spl_autoload_register() syntax changed in 5.3:

spl_autoload_register(__NAMESPACE__ . "\className::functionName"));

以下应该有效:

namespace glue;

require_once 'import.php';

use glueimport as import;
use gluecore
outer as router;

$import = new import();

spl_autoload_register(__NAMESPACE__ . "\$import::load"));

/** Works and echos glue
outer **/
$router = new router();

/** Don't do nothing **/
$cheese = gluecommonis_email($email);

<小时>

这是一些可以正常工作的实时代码!

在../WebPageConsolidator.inc.php:

in ../WebPageConsolidator.inc.php:

class WebPageConsolidator
{
    public function __construct() { echo "PHP 5.2 constructor.
"; }
}

在 test.php 中:

in test.php:

<?php

namespace WebPage;

class MyAutoloader
{
    public static function load($className)
    {
        require '../' . __NAMESPACE__ . $className . '.inc.php';
    }
}

spl_autoload_register(__NAMESPACE__ . "\MyAutoloader::load");

class Consolidator extends WebpageConsolidator
{
    public function __construct()
    {
        echo "PHP 5.3 constructor.
";

        parent::__construct();
    }
}

// Output: 
// PHP 5.3 constructor.
// PHP 5.2 constructor.

所以我知道它有效.

这篇关于命名空间中的 PHP 自动加载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆