【问题标题】:PHP Namespaces: why isn't my class found?PHP 命名空间:为什么找不到我的课程?
【发布时间】:2015-08-17 09:53:18
【问题描述】:

我已经阅读了一些关于 PHP 中的命名空间以及 compser 如何处理命名空间的自动加载的内容。我无法弄清楚为什么找不到我的班级。有人可以帮忙吗?

我正在使用 Laravel,以下是相关位:

composer.json相关内容:

"autoload": {
    "classmap": [
        "app/commands",
        "app/controllers",
        "app/models",
        "app/database/migrations",
        "app/database/seeds",
        "app/tests/TestCase.php",
        "app/libraries"
    ],
    "psr-0": {
        "Facebook\\":"vendor/facebook/php-sdk-v4/src/"
    }
}

执行composer dump-autoload 会在vendor/composer/autoload_namespaces.php 中给我以下行:

'Facebook\\' => array($vendorDir . '/facebook/php-sdk-v4/src'),

我的供应商文件夹结构回复:Facebook 是:

vendor
   |__ facebook
         |__ php-sdk-v4
                  |__ src
                       |__ Facebook
                              |__ ..
                              |__ Facebook.php
                              |__ ..

尝试$facebook = new Facebook($config)给了我

Symfony\Component\Debug\Exception\FatalErrorException (E_UNKNOWN) 找不到类“Facebook”

我做错了什么?!

【问题讨论】:

  • facebok 是错字还是?
  • @vonUbisch 是的,这是一个错字,刚刚更正了。

标签: php laravel composer-php


【解决方案1】:

供应商文件夹中的任何内容都应自动加载,因此使用这些行没有意义

"psr-0": {
    "Facebook\\":"vendor/facebook/php-sdk-v4/src/"
}

您是否已将这些行添加到您的 composer.json 并以通常的 composer 方式安装库?

"require": {
    "facebook/php-sdk-v4": "~5.0"
}

【讨论】:

  • 你是对的。删除 psr-0 没有任何效果,因此使用 composer 的require 安装它已经加载了命名空间。
【解决方案2】:

Facebook 是类的名称,但Facebook 似乎也是您的命名空间的名称。

在这种情况下,你可以这样实例化它:

$facebook = new \Facebook\Facebook($config);

【讨论】:

  • 好的,当我执行new Facebook\Facebook($config) 时,找到了该类。但是当我将 psr-0 更改为 "Facebook\\":"vendor/facebook/php-sdk-v4/src/Facebook" 并执行 new Facebook($config) 时,它找不到它。你能解释一下为什么吗?
  • 因为每个类都必须存在于一个命名空间中。如果您想在实例化时为自己节省额外的Facebook\ ,可以在文件开头添加use Facebook;
猜你喜欢
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
相关资源
最近更新 更多