gpt4 book ai didi

使用命名空间时找不到 PHP 类

转载 作者:可可西里 更新时间:2023-11-01 12:47:29 25 4
gpt4 key购买 nike

我是这个命名空间的新手。

我的基本目录中有 2 个类(单独的文件),比如 class1.phpclass2.php 在目录 src/ 中.

class1.php

namespace \src\utility\Timer;

class Timer{
public static function somefunction(){

}
}

class2.php

namespace \src\utility\Verification;
use Timer;

class Verification{
Timer::somefunction();
}

当我执行 class2.php 时,我得到了一个 fatal error

PHP Fatal error: Class 'Timer' not found in path/to/class2.php at line ***

我在 SO 的某处读到,我需要为此创建自动加载器。如果是,我该如何创建一个,如果不是,那么还有什么问题?

更新

我创建了一个自动加载器,它将要求 我的 php 脚本之上的所有必需文件。所以,现在 class2.php 会变成这样。

namespace \src\utility\Verification;
require '/path/to/class1.php'
use Timer;
//or use src\utility\Timer ... both doesn't work.

class Verification{
Timer::somefunction();
}

这也不起作用,它显示找不到该类。但是,如果我删除所有 namespaces,然后使用 。一切正常。

最佳答案

我们可以通过两种方式解决命名空间问题

1) We can just use namespace and require

2) We can use Composer and work with the autoloading!

第一种方式(Namespace and require)方式

Class1.php (Timer Class)

namespace Utility;

class Timer
{
public static function {}
}

Class2.php (Verification Class)

namespace Utility;
require "Class1.php";

//Some interesting points to note down!
//We are not using the keyword "use"
//We need to use the same namespace which is "Utility"
//Therefore, both Class1.php and Class2.php has "namespace Utility"

//Require is usually the file path!
//We do not mention the class name in the require " ";
//What if the Class1.php file is in another folder?
//Ex:"src/utility/Stopwatch/Class1.php"

//Then the require will be "Stopwatch/Class1.php"
//Your namespace would be still "namespace Utility;" for Class1.php

class Verification
{
Timer::somefunction();
}

第二种方式(使用Composer和自动加载方式)

Make composer.json file. According to your example "src/Utility" We need to create a composer.json file before the src folder. Example: In a folder called myApp you will have composer.json file and a src folder.

   {
"autoload": {
"psr-4": {
"Utility\\":"src/utility/"
}
}
}

现在转到那个文件夹,在有 composer.json 文件的文件夹位置打开你的终端。现在输入终端!

   composer dump-autoload

这将创建一个供应商文件夹。因此,如果您有一个名为“MyApp”的文件夹你会看到 vendor 文件夹、src 文件夹和一个 composer.json 文件

Timer.php(Timer Class)

namespace Utility;

class Timer
{
public static function somefunction(){}
}

Verification.php (Verification Class)

namespace Utility; 
require "../../vendor/autoload.php";
use Utility\Timer;

class Verification
{
Timer::somefunction();
}

当你有一个复杂的文件夹结构时,这个方法更强大!!

关于使用命名空间时找不到 PHP 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36787079/

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