如何在laravel中使用带有命名空间的include_once()

时间:2015-06-11 13:04:53

标签: php laravel namespaces laravel-5

我是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”并不了解。 可能这就是为什么我无法解决这个问题。 在创建一个新对象时,它只在命名空间位置搜索类,但我认为它也应该查看包含的文件。

2 个答案:

答案 0 :(得分:3)

如果当前文件中存在命名空间,PHP将尝试在当前命名空间中查找类,如果找不到它,则会出现致命错误。您应该打开ServiceDetails.class.php类来验证文件开头是否有namespace ...;<?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 PHPPHP namespaces manual

答案 1 :(得分:2)

您只需要为该类添加use语句,以便当前文件中的类可以&#34;参见&#34;它

<?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;
        .........
        ........
     }
 }