找不到PHP类,但它已包含在内

时间:2011-12-13 14:15:47

标签: php

我包含了一个带有

的PHP类
require_once($ENGINE."/classUser.php");

但是当代码执行时,我收到此错误:

  

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

我仍然无法弄清楚问题是什么。我99%肯定这是正确的。

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

signup.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
                )
        );
    } 
}

?>

19 个答案:

答案 0 :(得分:40)

检查以确保您的环境对开场标记不挑剔。我的配置需要:

<?php

如果我尝试使用:

<?

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

答案 1 :(得分:31)

if ( ! class_exists('User')) 
    die('There is no hope!');

答案 2 :(得分:11)

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

答案 3 :(得分:7)

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

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

答案 4 :(得分:3)

我做的时候问题就消失了

sudo service apache2 restart

答案 5 :(得分:2)

也可能是,你错误地注释掉了像require_once __DIR__.'/../vendor/autoload.php';这样的行---你的命名空间没有加载。

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

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

答案 6 :(得分:1)

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

当名称空间声明是你的php类文件的一部分&#34;这种奇怪的错误往往会出现&#34;

解决方案:将vector<int> two_sum(vector<int> &numbers, int target) { vector<int> result; vector<int> numbers_dup = vector<int>(numbers); sort(numbers_dup.begin(), numbers_dup.end()); int left = 0, right = numbers_dup.size() - 1; while(left <= right) { int sum = numbers_dup[left] + numbers_dup[right]; if(sum == target) { //find the idex of numbers_dup[left] and numbers_dup[right] for(int i = 0; i < numbers.size(); i++) { if(numbers[i] == numbers_dup[left] || numbers[i] == numbers_dup[right]) { result.push_back(i); } if(result.size() == 2) { return result; } } } else if(sum > target) { right--; } else { left++; } } } namespace一起使用,您的代码如下所示:

{

答案 7 :(得分:1)

检查file permissions以获取classUser.php

的正确linux用户

答案 8 :(得分:1)

发生在我身上! 问题是,不知何故,您包含一个具有相同文件名的文件,从而使相同的类无效!

检查包含路径和这些具有相同名称的检查文件!

答案 9 :(得分:0)

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

<强>之前 example.php包含:

<?php
 class example {

 }

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

希望这有帮助。

答案 10 :(得分:0)

仔细检查自动加载器的要求&amp;命名空间。

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

答案 11 :(得分:0)

作为一个更系统化和结构化的解决方案,您可以定义存储类的文件夹,并创建一个自动加载器(__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
    }
} 

答案 12 :(得分:0)

  1. 检查File Permissions
  2. 选中File size

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

答案 13 :(得分:0)

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

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

答案 14 :(得分:0)

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

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,所以请尽我所能。

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

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

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

$class = new A();

class A {
   use SomeTrait;
}

为了让它工作,像这样移动底部的初始化步骤:

class A {
   use SomeTrait;
}

$class = new A();

答案 17 :(得分:-1)

您应该在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'

答案 18 :(得分:-7)

只需复制您要使用的类定义并将其粘贴到PHP文件中即可。删除&#34;包含__once&#34;或者&#34;要求__once&#34;。它不会显示该错误。它对我有用。