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

我是这个命名空间的新东西。

我有两个类(单独的文件)在我的基础目录中,说目录src/ class1.phpclass2.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

上一篇: PHP class not found when using namespace

下一篇: once will not work, include will