gpt4 book ai didi

项目子文件夹中的 PHP 命名空间

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

我最近一直在用 PHP 中的命名空间苦苦挣扎。以面向对象的方式开始一个新项目,我想从结构到功能都准备好项目。

正如我所说,它是用面向对象的 PHP 开发的。使用 教义作为 ORM,项目的全局结构如下所示:

/admin
|- /index.php
/css
/fonts
/img
/js
/src
|- /controller
|- /model
|- /system
|- /utils
|- /Singleton.php
|- /view
/vendor
/index.php

好的,让我们举一个简单的例子。

我有位于以下路径的 Singleton 类:src/system/utils/Singleton.php
<?php

namespace system\utils;

/**
* Base class for singleton use cases
*/
class Singleton
{
/**
* Returns the *Singleton* instance of this class.
* @staticvar Singleton $instance The *Singleton* instance of this class.
* @return Singleton the *Singleton* instance.
*/
public static function getInstance() {
static $instance = null;
if ($instance === null) {
$instance = new static();
}
return $instance;
}

// Private constructor, only local construction allowed
protected function __construct() {
}

// Private cloner, only current instance
private function __clone() {
}

// Private wakeup function, to prevent unserializing
private function __wakeup() {
}
}

如您所见,此类使用命名空间 system\utils .
然后,在 /index.php主文件夹中的文件,要使用此类,我执行以下操作:
<?php
require_once 'bootstrap.php';
use system\utils\Singleton;

$singleton = Singleton::getInstance();
var_dump($singleton);
?>

(注意: bootstrap.php 是 Doctrine 的配置文件。我知道它使用某种自动加载,这可能是我在这里暴露的问题的一部分,所以你可以在最后找到它的内容这篇文章的)

这个例子工作得很好。伟大的。
但。如果我做完全相同的测试不在 /index.php但是 /admin/index.php ,它失败了,PHP 说它找不到类 Singleton。

我在这里真的很困惑,因为我认为命名空间是项目体系结构中每个类的某种“唯一”标识符,然后可用于检索项目结构中任何位置的一个类。显然,我错了,谷歌搜索根本没有帮助我。

我最好的猜测是自动加载和那种东西,因为我知道 Doctrine 使用它。也许我在配置 ORM 时遗漏了一些东西。前面说了,这里是我的 /bootstrap.php的内容包含所有配置设置。
<?php
// bootstrap.php
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

require_once "vendor/autoload.php";

// Create a simple "default" Doctrine ORM configuration for Annotations
$isDevMode = true;
$config = Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src/model/entities/"), $isDevMode);

// database configuration parameters
$conn = array(
'driver' => 'pdo_mysql',
'host' => 'host',
'port' => 'port',
'charset' => 'utf8',
'dbname' => 'database',
'user' => 'database',
'password' => 'database'
);

// obtaining the entity manager
$entityManager = EntityManager::create($conn, $config);

我不知道这是否有帮助,但我可以在/src 文件夹内的任何位置正确使用命名空间,但它似乎在主目录的另一个子文件夹中不起作用。

如果有人清楚地解释了这里发生的事情以及如何在 PHP 中管理命名空间,以及最终我如何对我的代码进行更正,那么很高兴您能分享您的知识。

编辑:

好的,所以它肯定与自动加载有关。我设法通过编写正确的 use 使其工作命名空间声明并声明 __autoload函数需要文件一次 ../src/ .
<?php
use system\utils\Singleton;

$singleton = Singleton::getInstance();
$singleton->manageSession();

function __autoload($className)
{
echo "Autoloading $className.php in ../src/";
require_once("../src/$className.php");
}

require_once '../bootsrap.php';
?>

这输出 Autoloading system\utils\Singleton.php in ../src/
所以它有效,我可以继续使用该解决方案。问题是我认为这是一种解决方法,而不是解决方案。我仍然相信我做错了什么并且可以优化它,但无法弄清楚如何......如果你有一些知识可以分享,我全神贯注!

提前致谢,并为这篇大帖子感到抱歉。如果您需要任何类型的其他信息,请询问。

最佳答案

问题是您在 admin/index.php 中所做的完全相同,在这种情况下是错误的。

问题在于以下行:

require_once 'bootstrap.php';

这告诉 php 查找文件 bootstrap.php首先相对于包含/需要文件的文件,如果失败,则在配置的包含路径中。

它不包含在您的目录结构中,但从它的外观来看, bootstrap.phpindex.php 处于同一级别.要解决您的问题,请替换 admin/index.php 中的上述行具有以下内容:
require_once '../bootstrap.php';

关于项目子文件夹中的 PHP 命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22310228/

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