gpt4 book ai didi

php命名空间自动加载目录

转载 作者:行者123 更新时间:2023-12-04 16:57:53 27 4
gpt4 key购买 nike

我有一个这样的类结构(树):

- garcha/
| - html/
| Tag.php
| VTag.php
| etc..

什么有效: (由 spl_autoload_register 自动加载)
use garcha\html;

$tag = new html\Tag('a');

无法工作:
use garcha\html;

$tag = new Tag('a');

要实现它没有: (我不想逐行写每个类文件的 use 语句,指向类目录并使用没有父命名空间的类)
use garcha\html\Tag;
use garcha\html\VTag;
...

我不喜欢这种方式,因为它很无聊,需要更多时间,不太灵活(您可能会更改文件结构、类名等..)

简而言之:我正在尝试自动加载命名空间类目录并在其中使用具有非限定名称的类。

自动加载功能:
class AutoLoader 
{
protected static $pathes = array();

/**
* add pathes
*
* @param string $path
*/
public static function addPath($path)
{
$path = realpath($path);

if ($path)
{
self::$pathes[] = $path . DIRECTORY_SEPARATOR;
}
}

/**
* load the class
* @param string $class
* @return boolean
*/
public static function load($class)
{
$classPath = $class.'.php'; // Do whatever logic here

foreach (self::$pathes as $path)
{
if (is_file($path . $classPath))
{
require_once $path . $classPath;

return true;
}
}

return false;
}
}

添加路径:
AutoLoader::addPath(BASE_PATH.DIRECTORY_SEPARATOR.'vendor');

自动加载工作,问题是如何处理
use garcha\html; // class directory

并使用没有前导的类 html
$tag = new Tag('p'); // not $tag = new html\Tag('p');

最佳答案

您可以尝试不同的解决方案:

第一:您可以添加 garcha/html在您的 pathes变量如 ::addPath('garcha/html')
第二:尝试在您的自动加载器中使用以下代码

foreach (glob("garcha/*.php") as $filename)
{
require_once $filename;
}
glob基本上会匹配所有以 .php 结尾的文件然后您可以使用它们将它们添加到您的 pathes变量或仅包含它们。

注:您需要稍微修改您的自动加载器以在其中使用上面的循环。

编辑:
试试这个:
public static function load($class) 
{
// check if given class is directory
if (is_dir($class)) {
// if given class is directory, load all php files under it
foreach(glob($class . '/*.php') as $filePath) {
if (is_file($filePath))
{
require_once $filePath;

return true;
}
}
} else {
// otherwise load individual files (your current code)
/* Your current code to load individual class */
}

return false;
}

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

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