gpt4 book ai didi

php - 面向对象风格 PHP 中的命名空间使用

转载 作者:行者123 更新时间:2023-12-04 17:04:41 25 4
gpt4 key购买 nike

我一直在 PHP 中摆弄 Namespace 并试图让它工作,但它失败了

让我展示示例代码:

测试\ View \类\MainController.php

<?php
namespace test\views\classes;

class MainController
{
public function echoData()
{
echo 'ECHOD';
}
}

测试\ View \index.php
<?php
require_once '..\autoloader\autoloader.php';

use test\views\classes\MainController;

$cont = new MainController();

$cont->echoData();

测试\自动加载器\自动加载器.php
<?php

spl_autoload_register(null, FALSE);

spl_autoload_extensions('.php');


function classLoader($class)
{
$fileName = strtolower($class) . '.php';

$file = 'classes/' . $fileName;

if(!file_exists($file))
{
return FALSE;
}

include $file;
}

spl_autoload_register('classLoader');

抛出错误:
Fatal error: Class 'test\views\classes\MainController' not found in ..\test\views\index.php on line 6

我是不是错过了什么!

编辑:当 index.php 和 maincontroller.php 都在同一目录中而不使用自动加载器但使用 require_once('maincontroller.php'); 时,代码工作正常;
如果它们位于不同的目录中并且具有自动加载功能,则不起作用。任何人都可以解决这个问题。

谢谢

最佳答案

您的代码中存在多个问题:

命名空间分隔符 (\) 在 Linux/Unix 中不是有效的路径分隔符。你的自动加载器应该做这样的事情:

$classPath = str_replace('\\', '/', strtolower($class)) . '.php';
if (!@include_once($classPath)) {
throw new Exception('Unable to find class ' .$class);
}

另外,路径都是相对的。您应该设置包含路径。如果您的网站结构是这样的:
bootstrap.php
lib/
test/
views/
index.php
classes/
maincontroller.php
autoloader/
autoloader.php

您的 bootstrap.php 应该类似于:
$root = dirname(__FILE__);
$paths = array(
".",
$root."/lib",
get_include_path()
);
set_include_path(implode(PATH_SEPARATOR, $paths));
include 'lib/test/autoloader/autoloader.php';

现在,在您的 test/views/index.php 中,您可以只包含 Bootstrap :
include '../../bootstrap.php';

关于php - 面向对象风格 PHP 中的命名空间使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11671970/

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