【问题标题】:PHP class not found but it's included未找到 PHP 类,但它已包含在内
【发布时间】:2012-01-19 09:53:30
【问题描述】:

我正在包含一个 PHP 类

require_once($ENGINE."/classUser.php");

但是当代码执行时我收到这个错误:

致命错误:在中找不到类“用户” C:\xampp\htdocs\WebName\resources\engine\ajax\signup.php 在第 12 行

我仍然无法弄清楚问题所在。我 99% 确定它是正确的。

“$ENGINE”是正确的,类也是正确的(Netbeans 建议我使用类方法和变量)。

注册.php:

<?php

/* Created on: 13/12/2011
 * Author: 
 * 
 * Description: User signup procedure.
 */

require_once("../settings.php");
require_once($ENGINE."/classUser.php");

$user = new User();
$user->createUser($_POST["username"], $_POST["email"], $_POST["password"]);


?>

classUser.php:

<?php

/* Created on: 13/12/2011
 * Author: 
 * 
 * Description: This class manages users.
 */

require_once("settings.php");
require_once($LIBRARY."/cassandraphp/cassandra.php");

class User {

    public function createUser($username, $email, $password){
        $cassandra = Cassandra::createInstance($CASSANDRASERVER);
        $cassandra->set(
                "user.".$username,
                array(
                    'ID' => uniqid(),
                    'Username' => $username,
                    'Email' => $email,
                    'Password' => $password
                )
        );
    } 
}

?>

【问题讨论】:

    标签: php


    【解决方案1】:

    检查以确保您的环境不会对您的开始标签挑剔。我的配置要求:

    <?php
    

    如果我尝试使用:

    <?
    

    然后我得到和你一样的错误。

    【讨论】:

    • 这是我遇到的问题。我的解决方案是将以下内容添加到 php.ini:short_open_tag = On see:php.net/manual/en/ini.core.php#ini.short-open-tag
    • 如果你没有访问 php.ini 的权限,你可以将这个添加到 .htaccess 中:php_value short_open_tag 1
    • 耶稣。谢谢这么多)
    • 这也是我的问题。祝福你。
    • 我自己花了 5 个小时来解决这个问题。因为我的问题是作曲家转储没有找到我在 laravel 中的 customPackage。所以这就是我用谷歌搜索的。那么现在我知道用谷歌搜索什么了,哈哈
    【解决方案2】:
    if ( ! class_exists('User')) 
        die('There is no hope!');
    

    【讨论】:

    • 我们都完蛋了!厄运!
    • 根据“die”消息,您要查找的类应该是“Hope”。
    • @SeanKendle 我猜这就是神谕的工作原理……神在呼唤Hope,但实际上他们的意思是User
    【解决方案3】:

    我遇到了这个问题,解决方案是命名空间。包含的文件包含在其自己的命名空间中。显而易见的事情,容易被忽视。

    【讨论】:

    • 该死的为什么你让我想起我的旧代码,太糟糕了:(
    • 这里也一样。而且该课程正在其他地方使用,所以我知道它应该可以正常工作。但另一个地方与这个不同的是在同一个命名空间下。
    • 这里有同样的问题。 如何解决这个问题?我试过“使用命名空间名/类名”但没有运气,但它不能包含在方法中。见stackoverflow.com/a/33355711/1066234
    • 就我而言,我删除了“命名空间库;”从包含的文件中,然后将每个必要的 PHP 文件包含到我使用 require_once 的函数中。
    【解决方案4】:

    首先检查$ENGINE."/classUser.php" 是否是现有文件的有效名称。 试试这个:

    var_dump(file_exists($ENGINE."/classUser.php"));
    

    【讨论】:

    • 无用...如果找不到或无法读取文件,require_once() 会以致命错误终止脚本。
    • 'http://localhost' 有点担心……你为什么不用本地文件系统?
    • 您可以包含 URL,但在您的情况下,您尝试包含的不是文件的内容,而是它的输出,当然它是空的。
    • 为了一般的理智(并减少可能出错的事情的数量),(并使世界变得更美好),除非您必须包含文件(并且如果你这样做,改变你的设计!)
    • $ENGINE 变量对我来说没有意义 - 它应该指向您的主 PHP 引擎,而不是 HTTP 路径。
    【解决方案5】:

    也可能是,您错误地注释掉了诸如 require_once __DIR__.'/../vendor/autoload.php'; 之类的行——您的命名空间未加载。

    或者您忘记向作曲家添加类映射,因此类不会自动加载且不可用。例如,

    "autoload": {
        "psr-4": {
            "": "src/"
        },
        "classmap": [
            "dir/YourClass.php",
        ]
    },
    "require": {
        "php": ">=5.3.9",
        "symfony/symfony": "2.8.*",
    

    【讨论】:

      【解决方案6】:

      当我这样做时问题就消失了

      sudo service apache2 restart
      

      【讨论】:

        【解决方案7】:

        作为一个更系统化和结构化的解决方案,您可以定义存储类的文件夹并创建一个自动加载器 (__autoload()),它将在定义的位置搜索类文件:

        require_once("../settings.php");
        define('DIR_CLASSES', '/path/to/the/classes/folder/'); // this can be inside your settings.php
        
        $user = new User();
        $user->createUser($_POST["username"], $_POST["email"], $_POST["password"]);
        
        function __autoload($classname) { 
            if(file_exists(DIR_CLASSES . 'class' . $classname . '.php')) {
                include_once(DIR_CLASSES . 'class' . $classname . '.php'); // looking for the class in the project's classes folder
            } else {
                include_once($classname . '.php'); // looking for the class in include_path
            }
        } 
        

        【讨论】:

          【解决方案8】:

          它发生在我身上! 问题是你以某种方式包含了一个与该类具有相同文件名的文件,从而使同一个类无效!

          检查包含路径和这些检查同名文件!

          【讨论】:

            【解决方案9】:

            检查您的file permissions 以获取classUser.php 的正确Linux 用户

            【讨论】:

            • 这也发生了。 掌心
            • 是的,发生在我身上,我正在使用 Linux Mint 并上传到 Cpanel 托管并花费大约 2 小时来解决这个问题。大声笑
            【解决方案10】:

            事实上,这是一个非常古老的线程,但很有用......

            当命名空间声明是你的 php 类文件的一部分时“这种奇怪的错误往往会出现”

            解决方案:使用namespace{,您的代码显示如下:

            <?php
            
            namespace path_to\lib {
            
            require_once "folder/php_class_file_where_namespace_declaration_is_part_of_it.php";
            
            **YOUR CODE HERE**
            
            <?php } ?>
            

            【讨论】:

              【解决方案11】:
              1. 检查File Permissions
              2. 检查File size

              有时一个无法访问或损坏的文件会成为问题,就像我的情况一样

              【讨论】:

                【解决方案12】:

                您应该在 ClassUser.php 中声明命名空间,如下所示:

                <?php
                namespace app; // where 'app' is a folder declared as a root for the project
                class ClassUser{
                public function test(){
                //log something here
                }
                }
                ?>
                

                然后你可以像这样在你的其他 php 文件中添加这个类:

                <?php
                use app\ClassUser;
                $classUserLcl = new ClassUser();
                $classUserLcl->test();
                ?>
                

                你就完成了。 否则会滥用:

                你哦!这是一个致命错误:未捕获的错误:在...中找不到类“app\ClassUser”

                【讨论】:

                  【解决方案13】:

                  我的失败可能对某人有用,所以我想我会发布,因为我终于弄清楚了问题所在。我正在自动加载这样的类:

                  define("PROJECT_PATH", __DIR__);
                  
                  // Autoload class definitions
                  function my_autoload($class) {
                      if(preg_match('/\A\w+\Z/', $class)) {
                          include(PROJECT_PATH . '/classes/' . $class . '.class.php');
                      }
                  }
                  spl_autoload_register('my_autoload');
                  

                  在我的 /classes 文件夹中,我有 4 个类:

                  dbobject.class.php
                  meeting.class.php
                  session.class.php
                  user.class.php
                  

                  当我后来创建了一个名为的新类时:

                  cscmeeting.class.php
                  

                  我开始收到can't load DbObject class。我根本不知道出了什么问题。一旦我从目录中删除了cscmeeting.class.php,它就再次起作用了。

                  我终于意识到它是按字母顺序遍历目录的,在cscmeeting.class.php 之前加载的第一个类是cscmeeting.class.php,因为它以D 开头。但是当我添加以C 开头的新类时,它会首先加载它并扩展DbObject 类。所以每次都卡住了。

                  我最终将我的 DbObject 类命名为 _dbobject.class.php 并且它总是首先加载它。

                  我意识到我的命名约定可能不是很好,这就是我遇到问题的原因。但我是 OOP 的新手,所以尽我所能。

                  【讨论】:

                    【解决方案14】:

                    经过近两个小时的调试,我得出结论,最好的解决方案是为文件名赋予其包含的类不同的名称。例如:

                    之前 example.php 包含:

                    <?php
                     class example {
                    
                     }
                    

                    解决方案:将文件重命名为 example.class.php(或类似名称),或将类重命名为 example_class(或类似名称)

                    希望这会有所帮助。

                    【讨论】:

                    • 为什么这是最好的解决方案?你是怎么意识到的?你所说的完全是个坏主意。顺便说一句,尝试将 Composer 与您的“最佳解决方案”一起使用,并让我知道它是如何进行的;)当你回过头来意识到你刚才所说的实际上是个坏主意时,请阅读以下内容:php-fig.org/psr/psr-4
                    【解决方案15】:

                    仔细检查您的自动加载器的要求和命名空间。

                    • 例如,您的自动加载器是否要求您的命名空间与 文件所在的文件夹结构?如果是这样,请确保他们 匹配。
                    • 另一个例子,你的自动加载器是否需要你的文件名 遵循某种模式/是否区分大小写?如果是这样,请确保 文件名遵循正确的模式。
                    • 当然,如果类在命名空间中,请确保包含它 正确地使用完全限定的类名 (/Path/ClassName) 或在文件顶部使用 use 语句。

                    【讨论】:

                      【解决方案16】:

                      也许这就是你使用 new User() 的方式。 设置路径类似

                      $user = new \resources\engine\ajax\User();
                      

                      【讨论】:

                        【解决方案17】:

                        如果您已正确包含文件并且文件存在并且仍然出现错误:

                        然后确保:
                        您包含的文件包含该类,并且未在任何命名空间中定义。
                        如果该类位于命名空间中,则:
                        而不是new YourClass() 你必须做new YourNamespace\YourClass()

                        【讨论】:

                          【解决方案18】:

                          是的,在使用 trait 或扩展类的情况下会发生这种情况,您应该注意在类声明之后实例化该类,例如:

                          这个例子会触发class not found错误:

                          $class = new A();
                          
                          class A {
                             use SomeTrait;
                          }
                          

                          要使其正常工作,请像这样移动底部的初始化步骤:

                          class A {
                             use SomeTrait;
                          }
                          
                          $class = new A();
                          

                          【讨论】:

                            【解决方案19】:

                            我发现我必须使用 use 关键字以及 include 语句。测试了一下,不管是哪一个都没有,还是不行。

                            namespace foo;
                            use src\config\object;
                            include('config/object.php');
                            

                            【讨论】:

                              猜你喜欢
                              • 2016-04-28
                              • 2016-09-30
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 1970-01-01
                              • 2016-11-05
                              • 2015-11-25
                              相关资源
                              最近更新 更多