无法声明类PodioItemField,因为该名称已在使用中

时间:2018-06-15 06:54:15

标签: php oop composer-php autoload podio

我正在尝试使用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"
    }
}

1 个答案:

答案 0 :(得分: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个不同类的定义!

podioitemfield file structure

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

您使用该软件包的剩余选项是将其加载到composer之外。只需下载 podio / podio-php 包,并将其包含在您的一个文件中:

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

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