gpt4 book ai didi

命名空间中的 PHP 自动加载

转载 作者:可可西里 更新时间:2023-10-31 22:10:45 26 4
gpt4 key购买 nike

我在我的命名空间中自动加载时遇到了一个小问题。如此处的 PHP 手册所示:http://us.php.net/manual/en/language.namespaces.rules.php您应该能够使用完整的限定名称自动加载命名空间函数,例如\glue\common\is_email().

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

这是我的代码:

namespace glue;

require_once 'import.php';

use glue\import as import;
use glue\core\router as router;

$import = new import();

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

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

/** Don't do nothing **/
$cheese = \glue\common\is_email($email);

我也试过这段代码:

namespace glue;

require_once 'import.php';

use glue\import as import;
use glue\core\router as router;
use glue\common;

$import = new import();

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

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

/** Don't do nothing **/
$cheese = common\is_email($email);

最后是这段代码:

namespace glue;

require_once 'import.php';

use glue\import as import;
use glue\core\router as router;
use glue\common\is_email as F;

$import = new import();

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

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

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

最佳答案

这是唯一正确的答案。

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

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

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

以下应该有效:

namespace glue;

require_once 'import.php';

use glue\import as import;
use glue\core\router as router;

$import = new import();

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

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

/** Don't do nothing **/
$cheese = \glue\common\is_email($email);

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

在 ../WebPageConsolidator.inc.php 中:

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

在 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.\n";

parent::__construct();
}
}

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

所以我知道它有效。

关于命名空间中的 PHP 自动加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642282/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com