【问题标题】:Class not found even though it is located where I am looking for it即使它位于我要查找的位置,也找不到类
【发布时间】:2013-03-14 23:34:32
【问题描述】:

我正在尝试加载一个类,以便我在类文档的帮助下编写的 PHP 脚本能够工作。

由于我的服务器运行的是 PHP 5.3,文档建议像这样加载类:

spl_autoload_register(function($class){
    if (file_exists('/webgit/webroot/home/myUsername/www/elastica/lib/' . $class . '.php')) {
       echo " found \n ";
       require_once('/webgit/webroot/home/myUsername/www/elastica/lib/' . $class . '.php');
    }
    else {
       echo " not found! ";
    }
});

唯一不同的是我在 if 和 else 套件中包含了 echo。 此外,myUsername 实际上是我在服务器文件系统路径中的用户名。

然后,它(文档)建议我像这样创建一个类的新实例:

$elasticaClient = new \Elastica\Client();

但是,我收到一个错误,即找不到该类。这正是打印的内容,包括错误和我的 if-else 套件:

没有找到!致命错误:在第 17 行的 /webgit/webroot/home/myUsername/www/elastica/index.php 中找不到类“Elastica\Client”

第 17 行是我尝试创建类实例的行。

现在,index.php 是上面代码所在的位置,它位于我的服务器上的 /webgit/webroot/home/myUsername/www/elastica/

所有的类文件都在/webgit/webroot/home/myUsername/www/elastica/lib/中

所以,我不明白为什么它无法找到/加载类。

如果能帮助我解决这个问题,我将不胜感激!

【问题讨论】:

  • 保存你的类的文件的完整路径名是什么(你没有告诉我们文件名。)
  • @MikeBrant 我刚刚意识到从未定义过类。对于这部分代码,我只是编写了文档中的示例。但是,要回答您的问题,lib 目录中似乎有多个类似于类的文件。
  • 那么这是一个无效的问题吗?如果未定义该类,您为什么希望它加载?
  • @MikeBrant 不,该类已定义。变量 $class 没有值。文档从未说过要给它一个价值。它说示例中的第一个代码是我的问题中的第一个代码块,然后是第二个代码块。

标签: php class elasticsearch elastica


【解决方案1】:

not found! - 表示找不到文件。文件,而不是类。

变量 $class 包含具有命名空间Elastica\Client 的完整类名。你确定你有/webgit/webroot/home/myUsername/www/elastica/lib/Elastica\Client.php 文件吗?

查看How do I use PHP namespaces with autoload?,了解PSR-0

【讨论】:

  • 啊,没错,就是找不到文件。但是我在 /webgit/webroot/home/myUsername/www/elastica/lib/Elastica/ 中有一个 client.php 为什么文件系统路径中的最后一个斜杠是反斜杠?
  • 已编辑答案。 $class == 'Elastica\Client'。连接后文件名将是/webgit/webroot/home/myUsername/www/elastica/lib/Elastica\Client.php。不要忘记 linux 文件系统是区分大小写的。
  • 啊,我不知道这是否有区别,但 Client.php 位于此处:/webgit/webroot/home/myUsername/www/elastica/lib/Elastica/Client.php这是一个 linux 服务器,但该文件的路径似乎与它正在寻找的相同......
  • 您必须替换\ to /$class = str_replace('\\', '/', $class);
  • 我应该在哪里添加该行?在关闭之前的 spl_autoload_register 函数内部?在那个函数之前?还是在创建类实例之前就在它之后?或者就在它之前 file_exists ?
【解决方案2】:

由于过度错误而被删节。不过,Mike 在 cmets 中有一个链接值得保留。

【讨论】:

  • 反斜杠是一种 PHP 命名空间语法。 php.net/manual/en/language.namespaces.rationale.php
  • 我也从未在类名中看到\。这就是为什么我对此感到困惑。是的,使用我从 GitHub 获得的文件的默认设置,该类位于 lib 目录中的多个文件中。 1.) 啊,我什至没有想到这一点。接得好! 2.) 我不完全理解问题编号 2 的含义。是的,lib/Elastica/ 目录中有一个 Client.php。我会试试这个,让你知道。
  • @MikeBrant 是的,文档称之为命名空间。
  • 删除第一个反斜杠并将第二个反斜杠更改为正斜杠后,我仍然收到该错误。
  • 是的,在阅读了上面@Mike 链接上的命名空间之后,我意识到我错了。我会删除我的答案,但我认为他的链接很有价值,所以我将编辑我所说的大部分内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多