neo4jphp:无法实例化抽象类Everyman \ Neo4j \ Transport

时间:2014-10-26 19:16:55

标签: class neo4j autoload neo4jphp

也许是一个简单的问题,但对我来说,Neo4j是一个障碍。我将带有composer的neo4jphp安装在与我的应用程序相同的目录中。已创建Vendor-Subfolder,并且下面的everyman / neo4j文件夹可用。对于第一个测试,我使用了示例中的代码片段:

spl_autoload_register(function ($className) {

  $libPath = 'vendor\\';  
  $classFile = $className.'.php';
  $classPath = $libPath.$classFile;
  if (file_exists($classPath)) {
    require($classPath);
  }
});

require('vendor/autoload.php'); 

use everyman\Neo4j\Client,
    everyman\Neo4j\Transport;

$client = new Client(new Transport('localhost', 7474));
print_r($client->getServerInfo()); 

我总是在错误

上找到答案
  

致命错误:无法实例化抽象类Everyman \ Neo4j \ Transport

谷歌搜索让我收到Josh Adell的评论

  

您无法实例化Everyman \ Neo4j \ Transport,因为它是一个抽象类。您必须根据需要实例化Everyman \ Neo4j \ Transport \ Curl或Everyman \ Neo4j \ Transport \ Stream

所以我认为我只需要将use-statements改为

use everyman\Neo4j\Client,
    everyman\Neo4j\Transport\Curl;

但这不起作用,调试显示,自动加载器只能获得" Transport.php"而不是" everyman \ Neo4j \ Transport \ Curl.php"。对于" Client.php"它仍在工作("供应商\ everyman \ Neo4j \ Client.php")所以我猜测use-statement是错误的或代码无法处理额外的子文件夹结构。

使用

  

需要('药业://neo4jphp.phar');

工作正常,但我读到这已被弃用,应该由composer / autoload取代。

任何人都有提示要改变什么或遇到同样的问题?

谢谢你的时间, Balael

3 个答案:

答案 0 :(得分:1)

Curl是默认传输。如果要使用Stream而不是Curl,则只需要实例化自己的Transport对象。如果您真的想要实例化自己的Curl Transport,那么对现有代码的最简单修改就是将use语句修改为:

use everyman\Neo4j\Client,
    everyman\Neo4j\Transport\Curl as Transport;

此外,如果您使用的是Composer软件包,则无需注册自己的自动加载功能。 vendor/autoload.php为你做到了。

答案 1 :(得分:1)

谢谢Josh,我正在尝试,但似乎我仍然卡在某处。我使用默认的CURL很好 - 所以我把代码缩小到

require('vendor/autoload.php'); 
   use everyman\Neo4j\Client;
    $client = new Everyman\Neo4j\Client('localhost', 7474);
    print_r($client->getServerInfo());` 

文件夹结构是主要的(这里是文件和带有内容的composer.json

{
   "require": {
      "everyman/Neo4j": "dev-master"
    }
}

并在子文件夹"供应商"我们有" autoload.php"和子文件夹中的每个人都有相关的内容。当我运行文件时,我出来了

Fatal error: Class 'Everyman\Neo4j\Client' not found 

当我有自动加载功能时不会发生这种情况。我想我在某处犯了一个错误 - 你能给我一个提示吗? 非常感谢,B

答案 2 :(得分:0)

嗯......我只是在尝试,似乎在use-statement和类实例化中不需要Transport CLASS。这似乎有效:

require('vendor/autoload.php'); 

    use everyman\Neo4j\Client;

$client = new Client();
print_r($client->getServerInfo()); 

也适用于拥有专用服务器/端口:

$client = new Everyman\Neo4j\Client('localhost', 7474);

如果您有更多的意见,我会很乐意了解更多信息 - 谢谢,所有输入和输入我非常感激。

Balael