【问题标题】:how to use include_once() with namespace in laravel如何在 laravel 中使用 include_once() 和命名空间
【发布时间】:2015-08-27 04:45:41
【问题描述】:

我是 laravel 的新手,正在导入一个现有的 php 站点。 我创建了一个名为“List”的控制器,然后我需要创建一个类的对象,编码在一个由 include_once() 包含的文件中,如图所示,

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;


$INCLUDE_ROOT = 'path/to/file';
include_once($INCLUDE_ROOT . "ServiceDetails.class.php");

class Lists extends Controller
{
    public function show()
    {
        $objServiceDetails= new ServiceDetails;
        .........
        ........
     }
 }

但我遇到了类似的错误

致命错误:找不到类“App\Http\Controllers\ServiceDetails”

我对命名空间“use”和“as”不太了解。 可能这就是为什么我无法解决这个问题。 当创建一个新对象时,它只在命名空间位置搜索类,但我认为它也应该在包含的文件中查找。

【问题讨论】:

  • 是的,但是你在一个命名空间中(想象它是一个文件夹),所以 ServiceDetails 在“当前文件夹”(App\Http\Controllers)中。尝试使用new \ServiceDetails,或者该类的完整命名空间(如果有的话)
  • @DamienPirsy,谢谢好友,当我使用new \ServiceDetails 时它可以工作,但它是一个巨大的项目,因此在控制器中包含大量文件,并且正在创建很多时间对象,是任何其他方式结束命名空间的范围,以便我们可以正常创建对象?

标签: php laravel namespaces laravel-5


【解决方案1】:

如果当前文件中存在命名空间,PHP 将尝试在当前命名空间中查找类,如果找不到,则会出现致命错误。您应该打开ServiceDetails.class.php 类以验证文件开头是否有namespace ...;(在&lt;?php 之后)。如果没有,您可以在您的Lists 文件之后简单地添加:

use App\Http\Controllers\Controller;

下面一行:

use ServiceDetails

如果是,您应该复制该命名空间并添加以下行:

use namespaceyoucopied\ServiceDetails;

当然在namespaceyoucopied 的地方你需要放置正确的复制命名空间,所以它看起来像这样:

use A\B\C\ServiceDetails;

你也可以看看How to use objects from other namespaces and how to import namespaces in PHP或者PHP namespaces manual

【讨论】:

    【解决方案2】:

    您只需为该类添加一个use 语句,以便当前文件中的类可以“看到”它。

    <?php
    namespace App\Http\Controllers;
    
    $INCLUDE_ROOT = 'path/to/file';
    include_once($INCLUDE_ROOT . "ServiceDetails.class.php");
    
    use App\Http\Controllers\Controller;
    use Namespace\To\ServiceDetails;
    
    class Lists extends Controller
    {
        public function show()
        {
            $objServiceDetails= new ServiceDetails;
            .........
            ........
         }
     }
    

    但是,如果您正在使用 Laravel 并这样做,那么您并没有充分利用自动加载功能。我建议您将此文件放在应用程序的命名空间目录中,并使其遵循PSR-4。然后 Laravel 会为你加载这个,它会让你的类文件看起来很干净。

    将文件放在如下路径中:/path/to/projectRoot/app/Lib/ServiceDetails.php。然后使文件如下所示,使其遵循 PSR-4:

    <?php namespace App\Http\Controllers;
    
    use App\Http\Controllers\Controller;
    use App\Lib\ServiceDetails;
    
    class Lists extends Controller
    {
        public function show()
        {
            $objServiceDetails= new ServiceDetails;
            .........
            ........
         }
     }
    

    【讨论】:

    • 谢谢,我认为它是标准的,但实际上它是一个巨大的应用程序,因此包含大量文件并且正在创建许多对象,因此很难将每个 include() 更改为命名空间。
    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2013-01-20
    • 1970-01-01
    • 2015-03-15
    • 2014-11-12
    • 2015-05-24
    • 2014-10-19
    • 1970-01-01
    相关资源
    最近更新 更多