Класс PHP не найден, но он включен

Я включаю класс PHP с

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

но когда код выполняется, я получаю эту ошибку:

Неустранимая ошибка: класс «Пользователь» не найден в C: \ xampp \ htdocs \ WebName \ resources \ engine \ ajax \ signup.php в строке 12

Я все еще не могу понять, в чем проблема. Я на 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 ) ); } } ?> 

Прежде всего проверьте, что $ENGINE."/classUser.php" является допустимым именем существующего файла. Попробуй это:

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

Убедитесь, что ваша среда не придирается к вашим открывающим тегам. Для моей конфигурации требуется:

 <?php 

Если я попытаюсь использовать:

 <? 

Затем я получаю ту же ошибку, что и вы.

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

Это произошло со мной! Проблема заключается в том, что каким-то образом вы включаете файл с тем же именем файла класса, что делает недействительным тот же класс!

Проверьте путь включения и эти файлы с тем же именем!

У меня была эта проблема, и решение было пространством имен. Включенный файл был включен в собственное пространство имен. Очевидная вещь, легко упускать из виду.

В качестве более систематического и структурированного решения вы можете определить папки, в которых хранятся ваши классы, и создать автозагрузчик ( __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 } } 

Проблема исчезла, когда я сделал

 sudo service apache2 restart 

Проверьте file permissions на file permissions для правильного пользователя linux для classUser.php

После почти двух часов отладки я пришел к выводу, что лучшим решением для этого является присвоение имени файла другому классу, который он содержит. Например:

Прежде чем example.php содержит:

 <?php class example { } 

Решение . Переименуйте файл в example.class.php (или что-то в этом роде) или переименуйте класс в example_class (или что-то в этом роде)

Надеюсь это поможет.

На самом деле, это очень старая нить, но полезная …

Когда декларация пространства имен является частью вашего файла 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 } ?> 

Дважды проверьте требования своего автозагрузчика и пространства имен.

  • Например, ваш автозагрузчик требует, чтобы ваше пространство имен соответствовало структуре папок, где находится файл? Если да, убедитесь, что они совпадают.
  • Другой пример: ваш автозагрузчик требует, чтобы ваши имена файлов соответствовали определенному шаблону / чувствительность к регистру? Если да, убедитесь, что имя файла соответствует правильному шаблону.
  • И, конечно, если класс находится в пространстве имен, обязательно /Path/ClassName его правильно с полным именем класса ( /Path/ClassName ) или с оператором use в верхней части файла.

Также может быть, что вы по ошибке прокомментировали такую ​​строку, как require_once __DIR__.'/../vendor/autoload.php'; — ваши пространства имен не загружены.

Или вы забудете добавить классовую карту к композитору, поэтому классы не загружаются автоматически и недоступны. Например,

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

Просто скопируйте определение класса, которое вы хотите использовать, и вставьте его в файл PHP. Удалить «включить __once» или «require __once». Он не покажет эту ошибку. Это сработало для меня.