当我尝试在codeigniter(v2.2.x)中安装Neo4jPHP库时,我遇到了有关命名空间的恼人问题。我一直在寻找4个小时没有成功。
简而言之,有一个库目录,其中必须复制Neo4jPHP。所以在'libraries /'中,有一个目录'Everyman / Neo4j /',它包含所有Neo4j php类。
此外,在相同的'libraries'目录中,有一个带有自动加载器功能的类,其目的是加载Neo4j类(在'Everyman / Neo4j /'中)。
“图书馆”内部
- libraries/
|-- Everyman/
|-- Neo4j/
|-- Client.php
|-- some_other_classes.php
|-- Neo4j.php
然后,在我的代码中的某个地方,在全局命名空间中,我尝试实例化类客户端:
$client = new Client();
但是我收到错误类'客户'未找到。
在类客户端中,指定了以下命名空间: Everyman \ Neo4j 。
我必须承认我找到了2个解决此问题的方法:
从调用代码中,使用完全限定名称:
new Everyman\Neo4j\Client();
或者,在Client.php中,删除命名空间。
在这2个案例中,它有效。但是,我想将这两个条件称为客户端类: 1.我不想修改Neo4jPhp库中的任何内容。 2.我真的不想使用完全限定名称(Everyman \ Neo4j \ Client)。我想使用“new 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 :(得分:0)
支持的安装neo4jphp的方法是使用Composer(https://getcomposer.org/)。学习如何使用Composer是个好主意,因为可以使用它安装大量的PHP库。它还为您设置自动加载,因此您不必自己担心路径和名称空间。
如果您不想每次都写new Everyman\Neo4j\Client()
,可以在脚本顶部添加use
语句:use Everyman\Neo4j\Client;
然后new Client();
答案 1 :(得分:0)
感谢您的回答。 出于某种原因,'使用Everyman \ Neo4j \ Client'命令不起作用,我决定不再对此问题进行进一步调查。
所以我决定坚持调用'$ client = new Everyman \ Neo4J \ Client();',而不是试图实现'$ client = new Client();'。
感谢您提出的建议。
卢瓦克。