【问题标题】:autoload class map with composer autoload使用作曲家自动加载自动加载类映射
【发布时间】:2014-05-26 00:25:56
【问题描述】:

目录:

myproject:
   src:
      MyProject:
           Foo:
              Foo.php

在文件 autoload_namespaces.php 中

return array(
    'MyProject' => array($vendorDir . '/myproject/src'),
);

如果声明如下:

class Bar extends MyProjext\Foo\Foo
{

}

或:

use MyProjext\Foo\Foo;

class Bar extends Foo
{

}

它工作,但我想声明不使用'use MyProjext\Foo\Foo;'或'扩展 MyProjext\Foo\Foo'

class Bar extends Foo
{

}

这是错误:'class Foo not found',有人可以帮助我吗?

【问题讨论】:

  • Bar 类的命名空间是什么?
  • class Bar 没有命名空间,类似 laravel,类 BaseController 扩展了 Controller,类 BaseController 没有命名空间,类 Controller 命名空间是 Illuminate\Routing\Controller
  • 显示从<?php开始的类声明

标签: php composer-php autoload


【解决方案1】:

你说:

它工作,但我想声明不使用'use MyProjext\Foo\Foo;'或者 '扩展 MyProjext\Foo\Foo'

这意味着这有效:

use MyProject\Foo\Foo;

class Bar extends Foo
{

}

但这不起作用(你想让它起作用):

class Bar extends Foo
{

}

它不起作用,因为 Bar 类试图从全局范围扩展 Foo 类,但 Foo 类在 MyProject\Foo namespace 下声明,并且它存储在 MyProject/Foo 目录中,所以错误正在发生,这是合乎逻辑的。

如果你想使用这个代码(没有任何namespace):

class Bar extends Foo
{

}

然后确保 Foo 类在全局命名空间中可用,并在 Foo 类声明之前找到类似 namespace MyProject\Foo; 的行并删除该行并在使用之前包含类 Foo它(通过扩展)创建类Bar。所以,它可能看起来像这样:

// You may need to adjust the path
require_once("MyProject/Foo/Foo.php");

class Bar extends Foo
{

}

使用namespace 更好,所以尽量坚持下去,如果没有namespace,你当前的autoloading 技术可能会失败,除非你在不使用namespace 的情况下重写它。

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 2021-12-18
    • 2014-08-15
    • 2013-12-09
    • 2013-03-05
    • 2015-09-24
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多