找不到php类文件,即使它存在

Posted

技术标签:

【中文标题】找不到php类文件,即使它存在【英文标题】:php class file not found, even though it exists 【发布时间】:2017-08-17 05:38:30 【问题描述】:

所以我正在尝试在 linux 实例上使用 php 设置 Web 套接字,并且有两个文件。这两个文件都在我的 /var/www/html 目录中。第一个名为Chat.php,包含以下代码:

<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Chat implements MessageComponentInterface 
    public function onOpen(ConnectionInterface $conn) 
    

    public function onMessage(ConnectionInterface $from, $msg) 
    

    public function onClose(ConnectionInterface $conn) 
    

    public function onError(ConnectionInterface $conn, \Exception $e) 
    


?>

第二个名为chat-server.php,包含以下代码:

<?php
use Ratchet\Server\ioserver;
use MyApp\Chat;

require dirname(__DIR__) . '/html/vendor/autoload.php';

$server = IoServer::factory(
    new Chat(),
    8084
);

$server->run();

?>

当我尝试运行 chat-server.php 时,我收到以下错误消息:

PHP Fatal error: Class 'MyApp\Chat' not found in /var/www/html/chat-server.php on line 8

很明显,当我尝试发起new Chat() 时它不喜欢它,因为它找不到类。为什么不呢?

【问题讨论】:

因为课程不在chat-server.php,所以在Chat.php。您需要将 Chat.php 包含到 chat-server.php 中,以便它知道类定义。 这不是use MyApp\Chat;在做什么吗? 不,这只是为了让您在实例化它时可以将类称为Chat 而不是MyApp\Chat 的绝对名称。你仍然需要像include "Chat.php"; 这样的东西。 也就是说,没有use MyApp\Chat,您需要使用new MyApp\Chat() 而不仅仅是new Chat()。但无论哪种情况,您仍然需要包含/要求它。 好的,现在当我运行文件时,它说 PHP 致命错误:Interface 'Ratchet\MessageComponentInterface' not found in /var/www/html/Chat.php on line 6 【参考方案1】:

我建议你重新生成 Composer 自动加载器(autoload.php),在你第一次编辑 composer.json 文件后,在 autoload 属性下添加如下内容:

"psr-4": "MyApp\\": "/"

这将定义命名空间到目录之间的新映射。 然后,要重新生成自动加载脚本,只需键入:

composer dumpautoload -o

此外,要求自动加载器应放在脚本的顶部。 更多详情请查看 composer 官方关于自动加载的文档:https://getcomposer.org/doc/01-basic-usage.md#autoloading

【讨论】:

以上是关于找不到php类文件,即使它存在的主要内容,如果未能解决你的问题,请参考以下文章

即使文件存在,Composer 也找不到 composer.json 文件

CSS 模块在 Codesandbox 中不起作用 - 即使它们存在也找不到文件

ld 找不到库,即使它们存在

使用包时,即使在同一文件夹中也找不到依赖于其他类的类

JasperException - 即使存在标签也找不到文件

即使元素存在于数组中,也总是找不到输出[重复]