Поскольку я пытаюсь установить библиотеку 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 обходных решения, но я действительно хочу узнать, как правильно справиться с этой проблемой (если это возможно).
Благодарю.
Кажется, код вроде $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
Спасибо за ответ. По какой-то причине команда "Использовать Everyman\Neo4j\Client" не работала, и я решил не проводить дальнейшее расследование этой проблемы.
Поэтому я решил придерживаться вызова "$ client = new Everyman\Neo4J\Client();" вместо того, чтобы пытаться достичь "$ client = new Client();".
Спасибо за ваши предложения.
Лоик.
Поддерживаемый способ установки neo4jphp - использовать Composer (https://getcomposer.org/). Это хорошая идея, чтобы узнать, как использовать Composer, поскольку с ним можно установить большое количество библиотек PHP. Он также настраивает автозагрузку для вас, поэтому вам не нужно беспокоиться о путях и пространствах имен.
Если вы не хотите каждый раз писать new Everyman\Neo4j\Client()
, вы можете поместить инструкцию use
в начало своего скрипта: use Everyman\Neo4j\Client;
а затем new Client();