(codeigniter / Neo4j) PHP: пространство имен и автозагрузчик

1

Поскольку я пытаюсь установить библиотеку Neo4jPHP в codeigniter (v2.2.x), у меня возникают раздражающие проблемы в отношении пространств имен. Я искал 4 часа без успеха.

Короче говоря, существует каталог библиотек, в котором необходимо скопировать Neo4jPHP. Таким образом, в 'libraries/' есть каталог 'Everyman/Neo4j/', который содержит все классы Neo4j php.

Кроме того, в том же каталоге "library" есть класс с функцией автозагрузчика, целью которого является загрузка классов Neo4j (которые находятся в "Everyman/Neo4j/").

Внутри "библиотек"

- libraries/
     |-- Everyman/
             |-- Neo4j/
                   |-- Client.php
                   |-- some_other_classes.php
     |-- Neo4j.php

Затем, где-то в моем коде, в глобальном пространстве имен, я пытаюсь создать экземпляр класса клиента:

$client = new Client();

Но я получаю ошибку Class 'Client' не найден.

В клиенте класса указано следующее пространство имен: Everyman\Neo4j.

Я должен признать, что я нашел 2 обходных пути для этой проблемы:

Из вызывающего кода используйте полное имя:

new Everyman\Neo4j\Client();

Или, в Client.php, удалите пространство имен.

В этих двух случаях он работает. Тем не менее, я хотел бы назвать класс Client с этими двумя условиями: 1. Я не хочу ничего изменять из библиотеки Neo4jPhp. 2. Я действительно не хочу использовать полное имя (Everyman\Neo4j\Client). Я хочу использовать "новый клиент()".

Вы, ребята, знаете, как я могу это достичь (да, я не очень понимаю пространства имен и загрузчиков).

В Neo4j.php (файл с загрузчиком)

 <?php
    class Everyman{

    public function __construct()
    {
        spl_autoload_register(array($this,'autoload'));
    }

    public function autoload($sClass){
            $sLibPath = __DIR__.DIRECTORY_SEPARATOR;
    //Below, i modified the instruction so that the class file
    //can be found. However, the class is not found.
            $sClassFile = 'Everyman'.DIRECTORY_SEPARATOR.'Neo4j'.str_replace('\\',DIRECTORY_SEPARATOR,$sClass).'.php';
            $sClassPath = $sLibPath.$sClassFile;
            if (file_exists($sClassPath)) {
                require($sClassPath);
            }
        }
    }

Так что это. Кажется, я дал вам всю информацию, которую я имею. Если никто не сможет мне помочь, мне придется использовать "new Everyman\Ne4j\Client();" (который работает).

Может показаться глупым обратиться за помощью, поскольку я уже нашел 2 обходных решения, но я действительно хочу узнать, как правильно справиться с этой проблемой (если это возможно).

Благодарю.

  • 0
    это основы PHP и автозагрузки классов в 2015 году. Я предлагаю вам уделить время чтению основ composer getcomposer.org/doc/01-basic-usage.md
Теги:
codeigniter
namespaces
neo4j
autoloader

3 ответа

2
Лучший ответ

Кажется, код вроде $client = new Everyman\Neo4j\Client('localhost', 7474); является официальным: https://github.com/jadell/neo4jphp#connection-test

Так что это не работает.

Я действительно не хочу использовать полное имя (Everyman\Neo4j\Client). Я хочу использовать "новый клиент()".

Я не знаю, чего ты действительно хочешь. Но тогда как насчет того, чтобы ввести код в свой код, который вы используете Everyman\Neo4j\Client:

use Everyman\Neo4j\Client;

а также

$client = new Client();

См. Http://php.net/manual/en/language.namespaces.importing.php

0

Спасибо за ответ. По какой-то причине команда "Использовать Everyman\Neo4j\Client" не работала, и я решил не проводить дальнейшее расследование этой проблемы.

Поэтому я решил придерживаться вызова "$ client = new Everyman\Neo4J\Client();" вместо того, чтобы пытаться достичь "$ client = new Client();".

Спасибо за ваши предложения.

Лоик.

0

Поддерживаемый способ установки neo4jphp - использовать Composer (https://getcomposer.org/). Это хорошая идея, чтобы узнать, как использовать Composer, поскольку с ним можно установить большое количество библиотек PHP. Он также настраивает автозагрузку для вас, поэтому вам не нужно беспокоиться о путях и пространствах имен.

Если вы не хотите каждый раз писать new Everyman\Neo4j\Client(), вы можете поместить инструкцию use в начало своего скрипта: use Everyman\Neo4j\Client; а затем new Client();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню