Я включаю класс 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». Он не покажет эту ошибку. Это сработало для меня.