【问题标题】:Cannot declare class PodioItemField, because the name is already in use无法声明类 PodioItemField,因为该名称已在使用中
【发布时间】:2018-06-15 22:11:57
【问题描述】:

我正在尝试使用 Podios PHP 客户端库在 Podio 应用程序中创建一个新项目。

我使用他们示例页面中的代码,但目前我尝试:

// Create a field collection with some fields.
// Be sure to use the external_ids of your specific fields
$fields = new PodioItemFieldCollection(array(
  new PodioTextItemField(array("external_id" => "my-text-field", "values" => "FooBar")),
  new PodioProgressItemField(array("external_id" => "my-number-field", "values" => 75))
));

// Create the item object with fields
// Be sure to add an app or podio-php won't know where to create the item
$item = new PodioItem(array(
  'app' => new PodioApp(123), // Attach to app with app_id=123
  'fields' => $fields
));

// Save the new item
$item->save();

我收到以下错误:

PHP 致命错误:无法声明类 PodioItemField,因为 名称已在使用中 /var/www/html/podioproject/vendor/podio/podio-php/models/PodioItemField.php 在第 0 行

我不太明白错误的含义,所以我很难弄清楚加载错误的内容以及原因。

在 stackoverflow 上还有其他问题,人们回答将 include 更改为 include_once。我正在使用作曲家的自动加载器,所以该解决方案不适用

composer.json:

{
    "require": {
        "podio/podio-php": "^4.3",
        "slim/slim": "^3.10"
    }
}

【问题讨论】:

  • @RonvanderHeijden 但我只使用 composer autoloader,其余的都在他们的客户端库中处理 - 那么客户端库中的错误呢?
  • PodioItemField 类在哪里定义?,该类不在你的问题代码中
  • /vendor/podio/podio-php/models/PodioItemField.php。代码在github.com/podio/podio-php/blob/master/models/…
  • 肯定是namespace的问题,你检查过没有use语句直接使用namespace吗?
  • 我认为这个问题来自这样一个事实,文件models/PodioItemField.php包含许多类:class PodioItemField extends PodioObject {class PodioTextItemField extends PodioItemField { ' ...当composer需要一个类时,它总是加载这个类一次又一次地归档。此文件中的每个类都会发生这种情况。而PodioItemField 类之前已经找到了。解决方案:将所有这些类从文件models/PodioItemField.php 提取到它们自己的文件中,例如models/PodioTextItemField.php .... .

标签: php oop composer-php autoload podio


【解决方案1】:

你并没有直接做错什么,问题出在 podio-php 包上。

因为它在同一个文件中声明了多个类,这与 composer autoloader 的工作方式相冲突。

如果您查看ClassLoader::includeFile($file),您会发现它没有使用include_once 调用,而是使用普通的include

/**
 * Scope isolated include.
 *
 * Prevents access to $this/self from included files.
 */
function includeFile($file)
{
    include $file;
}

如果您查看发生错误的文件 (PodioItemField.php),您会发现其中包含 19 个不同类的定义!

也许在作曲家的自动加载器中使用include_once 会更好?坦率地说,我不知道为什么它改用include,但我不得不说,在任何情况下,每个文件都有多个类定义通常不被认为是好的或推荐的做法。所以一般来说不会有什么不同。

您使用该包的剩余选择是将其加载到作曲家之外。只需下载 podio/podio-php 包并将其包含在您的文件之一中:

require_once '/path/to/podio-php/PodioAPI.php';

项目设置不正确很糟糕,但最近似乎没有更新。也许您可以自己修复它并提交拉取请求! :)

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 2020-06-21
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多