2011-12-13 31 views
23

tôi bao gồm một lớp PHP vớiPHP lớp nhưng nó bao gồm

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

nhưng khi mã được thực thi tôi nhận được lỗi này:

Fatal error: Class 'User' not found in C:\xampp\htdocs\WebName\resources\engine\ajax\signup.php on line 12

tôi vẫn không thể tìm ra vấn đề là gì Tôi chắc chắn 99% là chính xác.

"$ ENGINE" là chính xác và lớp cũng đúng (Netbeans đề xuất phương pháp và biến lớp của tôi).

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

?> 
+0

Tôi không có đầu mối – ajreal

Trả lời

6

Trước hết kiểm tra nếu $ENGINE."/classUser.php" là một tên hợp lệ của tập tin hiện có. Hãy thử điều này:

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

Vô dụng ... require_once() sẽ giết tập lệnh có lỗi nghiêm trọng nếu không thể tìm thấy hoặc đọc tệp. –

+0

Tôi nhận được 'bool (false)', nhưng khi tôi thực thi 'echo $ ENGINE."/ClassUser.php
";' tôi nhận 'http: // localhost/webname/resources/engine/classUser.php' đúng – siannone

+0

Chỉ cần theo dõi, hãy thử 'var_dump'ing' $ ENGINE. "/ ClassUser.php" 'cũng chỉ để xem nó là gì nếu' file_exists' trả về false. Ngoài ra các điều khoản có thể là bạn bè/kẻ thù của bạn quá –

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

+1 chỉ dành cho kiểu –

+5

* Tất cả chúng ta đều phải chịu số phận! DOOOMED! * – DaveRandom

+14

theo thông báo "chết", lớp bạn đang tìm kiếm phải là "Hy vọng". – SeanKendle

0

Là một giải pháp hệ thống hơn và có cấu trúc, bạn có thể xác định thư mục nơi các lớp học của bạn được lưu trữ và tạo ra một autoloader (__autoload()) mà sẽ tìm kiếm các tập tin lớp ở những nơi được xác định:

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 
    } 
} 
29

Kiểm tra để đảm bảo môi trường của bạn không gây khó khăn cho các thẻ mở. cấu hình của tôi yêu cầu:

<?php 

Nếu tôi cố gắng sử dụng:

<? 

Sau đó, tôi nhận được thông báo lỗi tương tự như bạn.

+2

Đây là vấn đề tôi có. Giải pháp của tôi là thêm thông tin sau vào php.ini: short_open_tag = Trên xem: http://php.net/manual/en/ini.core.php#ini.short-open-tag – theINtoy

+3

Nếu bạn không có quyền truy cập vào php.ini, bạn có thể thêm nó vào .htaccess: php_value short_open_tag 1 – theINtoy

+1

Chúa Giêsu. Thx rất nhiều) – Constantine

1

Vấn đề đi xa khi tôi đã làm

sudo service apache2 restart 
1

Nó xảy ra với tôi! Vấn đề là bằng cách nào đó bạn bao gồm một tệp có cùng tên tệp của lớp do đó làm mất hiệu lực cùng một lớp!

Kiểm tra đường dẫn đưa vào và các tệp kiểm tra này có cùng tên!

0

Kiểm tra file permissions cho người sử dụng linux chính xác cho classUser.php

0

Sau gần hai giờ gỡ lỗi tôi đã kết luận rằng giải pháp tốt nhất cho điều này là để cung cấp cho tên tập tin một tên khác nhau để lớp mà nó chứa của bạn. Ví dụ:

Trước example.php chứa:

<?php 
class example { 

} 

Giải pháp: đổi tên file để example.class.php (hoặc một cái gì đó như thế), hoặc đổi tên lớp để example_class (hoặc một cái gì đó tương tự)

Hy vọng điều này sẽ hữu ích.

+0

Và tại sao đó sẽ là giải pháp tốt nhất? Làm thế nào bạn nhận ra điều đó? Những gì bạn nói hoàn toàn là một ý tưởng tồi. Và bằng cách này, hãy thử sử dụng Composer với "giải pháp tốt nhất" của bạn và cho tôi biết nó đi như thế nào;) P.S. khi bạn quay trở lại và nhận ra rằng những gì bạn vừa nói thực sự là một ý tưởng tồi, hãy đọc cho điều này: http://www.php-fig.org/psr/psr-4/ – siannone

3

Tôi gặp sự cố này và giải pháp là không gian tên. Tệp được bao gồm đã được bao gồm trong không gian tên riêng của nó. Điều hiển nhiên, dễ bỏ qua.

+1

Chết tiệt tại sao bạn mang lại cho tôi những kỷ niệm về tuổi của tôi mã, nó thật khủng khiếp :( – siannone

1

Trong thực tế, đó là một chủ đề rất cũ nhưng hữu ích ...

Khi khai namespace là một phần của php của bạn lớp tập "loại lỗi lạ có xu hướng xuất hiện".

Giải pháp: Sử dụng namespace với {, mã của bạn hiển thị như thế này:

<?php 

namespace path_to\lib { 

require_once "folder/php_class_file_where_namespace_declaration_is_part_of_it.php"; 

**YOUR CODE HERE** 

<?php } ?> 
0

Kiểm tra các yêu cầu của autoloader của bạn & namespace.

  • Ví dụ: trình nạp tự động có yêu cầu không gian tên của bạn để khớp với cấu trúc thư mục nơi tệp được đặt ở đâu không? Nếu vậy, hãy đảm bảo chúng phù hợp với số .
  • Ví dụ khác, trình tải tự động của bạn có yêu cầu tên tệp của bạn là theo một mẫu nhất định/có phân biệt chữ hoa chữ thường không? Nếu vậy, hãy đảm bảo tên tệp tuân theo mẫu chính xác.
  • Và tất nhiên nếu lớp học nằm trong không gian tên, hãy đảm bảo bao gồm nó đúng cách với tên lớp đủ điều kiện (/Path/ClassName) hoặc với tuyên bố use ở đầu tệp của bạn.
-5

Chỉ cần sao chép định nghĩa lớp mà bạn muốn sử dụng và dán nó vào tệp PHP. Xóa "bao gồm __once" hoặc "yêu cầu __once". Nó sẽ không hiển thị lỗi đó. Nó làm việc cho tôi.

0

Cũng có thể là do bạn nhầm lẫn đã nhận xét một dòng như require_once __DIR__.'/../vendor/autoload.php'; --- không gian tên của bạn không được tải.

Hoặc bạn quên thêm một sơ đồ lớp vào trình soạn nhạc, do đó các lớp không được tự động tải và không có sẵn. Ví dụ:

"autoload": { 
    "psr-4": { 
     "": "src/" 
    }, 
    "classmap": [ 
     "dir/YourClass.php", 
    ] 
}, 
"require": { 
    "php": ">=5.3.9", 
    "symfony/symfony": "2.8.*", 
Các vấn đề liên quan