gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:57:06 24 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 ***



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

更新

我创建了一个自动加载器,它将 require在我的 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 , 和 use的。一切正常。

最佳答案

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

1) We can just use namespace and require

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

第一种方式(命名空间和要求)方式

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/56849893/

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