Не удается загрузить класс с помощью require_once при использовании пространства имен

Я использую Slim для разработки простого REST API и столкнулся со странной проблемой. По сути, я настроил API для загрузки всех классов с помощью автозагрузчика через композитор:

"autoload": {
    "psr-4": {
        "App\\Controllers\\": "app/controllers",
        "App\\Helpers\\": "app/helpers",
        "App\\Models\\": "app/models",
        "App\\Services\\": "app/services",
        "Core\\": "src/core",
        "Core\\Helpers\\": "src/helpers",
        "Core\\Libraries\\": "src/libraries"
    }
}

Я создал класс с именем GoogleSync, который должен включать Google API php library, поэтому я включил его следующим образом:

<?php namespace Core\Libraries;

defined('BASEPATH') or exit('No direct script access allowed');

require_once __DIR__ . '/external/google-api-php-client/Google_Client.php';
require_once __DIR__ . '/external/google-api-php-client/contrib/Google_CalendarService.php';


class GoogleSync
{
    /**
     * Google API Client
     *
     * @var Google_Client
     */
    protected $client;

    public function __construct($api_settings)
    {
        var_dump(file_exists(__DIR__ . "/external/google-api-php-client/Google_Client.php"));
        $this->client = new Google_Client();
    }
}

Я получаю следующую ошибку:

Неустранимая ошибка: необработанная ошибка: класс Core\Libraries\Google_Client не найден в A:\Programmi\MAMP\htdocs\ci3-api\src\libraries\GoogleSync.php:44

по странной причине, если я включу в класс Google_Client следующее пространство имен:

Core\Libraries

код может загрузить класс. Поэтому я подозреваю, что require_once не может внедрить класс, потому что есть логика автозагрузчика, но я могу ошибаться.

Кроме того, метод file_exist в конструкторе возвращает true.

Что творится?


person sfarzoso    schedule 02.08.2019    source источник
comment
Вы вызываете его в пространстве имен, поэтому он пытается использовать это пространство имен, возможно, попробуйте создать его экземпляр следующим образом: $this-›client = new \Google_Client(); игнорировать пространство имен.   -  person Mark Overton    schedule 02.08.2019
comment
Спасибо, проблему было действительно легко решить, если вы ответите на вопрос, я приму, хорошего дня.   -  person sfarzoso    schedule 02.08.2019


Ответы (1)


Вы вызываете его в пространстве имен, поэтому он пытается использовать это пространство имен, возможно, попробуйте создать его следующим образом: $this->client = new \Google_Client();, чтобы игнорировать пространство имен.

Возможный дубликат этого вопроса.

person Mark Overton    schedule 02.08.2019