使用名称空间时找不到PHP类
我是这个命名空间的新东西。
我有两个类(单独的文件)在我的基础目录中,说目录src/
class1.php
和class2.php
。
class1.php
namespace srcutilityTimer;
class Timer{
public static function somefunction(){
}
}
class2.php
namespace srcutilityVerification;
use Timer;
class Verification{
Timer::somefunction();
}
当我执行class2.php
,我得到了致命错误
PHP致命错误:类'计时器'未找到路径/到/ class2.php在线***
我在SO上读过某处,我需要为此创建自动加载器。 如果是这样,我该如何创建一个,如果不是,那么还有什么问题呢?
UPDATE
我创建了一个自动加载器,这将require
我的PHP脚本的所有必需的文件。 所以,现在class2.php会像这样结束。
namespace srcutilityVerification;
require '/path/to/class1.php'
use Timer;
//or use srcutilityTimer ... both doesn't work.
class Verification{
Timer::somefunction();
}
这也不起作用,并且它表明没有找到类。 但是,如果我删除所有的namespaces
,并use
's。 一切正常。
我们可以通过两种方式来解决名称空间问题
1)我们可以使用命名空间和要求
2)我们可以使用Composer并使用自动加载!
第一种方法(命名空间和要求)的方式
Class1.php(定时器类)
namespace Utility;
class Timer
{
public static function {}
}
Class2.php(验证类)
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和自动加载方式)
制作composer.json文件。 根据你的例子“src / Utility”,我们需要在src文件夹之前创建一个composer.json文件。 例如:在名为myApp的文件夹中,您将拥有composer.json文件和src文件夹。
{
"autoload": {
"psr-4": {
"Utility":"src/utility/"
}
}
}
现在进入该文件夹,在composer.json文件所在的文件夹位置打开终端。 现在输入终端!
composer dump-autoload
这将创建一个供应商文件夹。 因此,如果您有一个名为“MyApp”的文件夹,您将看到供应商文件夹,src文件夹和一个composer.json文件
Timer.php(Timer类)
namespace Utility;
class Timer
{
public static function somefunction(){}
}
Verification.php(验证类)
namespace Utility;
require "../../vendor/autoload.php";
use UtilityTimer;
class Verification
{
Timer::somefunction();
}
当你有一个复杂的文件夹结构时,这种方法更强大!
您将需要实施自动加载器,因为您已经在SO中阅读过它。
您可以在http://www.php-fig.org/psr/psr-4/上查看自动加载标准PSR-4,您可以看到PSR-4自动加载的示例实现,以及一个用于处理多个名称空间的示例类实现https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader-examples.md。
链接地址: http://www.djcxy.com/p/58123.html