Có ai biết những gì có thể gây ra vấn đề này?
Lỗi nghiêm trọng của PHP: Không thể phân loại lại lớp
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Có ai biết những gì có thể gây ra vấn đề này?
Lỗi nghiêm trọng của PHP: Không thể phân loại lại lớp
if(!class_exists('YourClass')){ include 'YourClass.php'; }
Câu trả lời:
Nó có nghĩa là bạn đã tạo một lớp.
Ví dụ:
class Foo {}
// some code here
class Foo {}
Foo thứ hai đó sẽ ném lỗi.
Bạn có một lớp cùng tên được khai báo nhiều lần. Có thể thông qua nhiều bao gồm. Khi bao gồm các tệp khác, bạn cần sử dụng một cái gì đó như
include_once "something.php";
để ngăn chặn nhiều vùi. Điều này rất dễ xảy ra, mặc dù không phải lúc nào cũng rõ ràng, vì bạn có thể có một chuỗi dài các tệp được bao gồm bởi nhau.
Điều đó xảy ra khi bạn khai báo một lớp nhiều hơn một lần trong một trang. Bạn có thể sửa nó bằng cách gói lớp đó bằng câu lệnh if (như bên dưới) hoặc bạn có thể đặt nó vào một tệp riêng và sử dụng require_once()
, thay vì include()
.
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
hoặc!class_exists('TestClass')
Điều này sẽ xảy ra nếu chúng ta sử dụng bất kỳ lớp nào được xây dựng trong thư viện php. Tôi đã sử dụng tên lớp là Thư mục và tôi đã gặp lỗi tương tự. Nếu bạn gặp lỗi trước tiên, hãy đảm bảo rằng tên lớp bạn sử dụng không phải là một trong các lớp được xây dựng.
Lỗi này cũng có thể xảy ra nếu bạn xác định __construct
phương thức nhiều lần.
Đôi khi điều đó xảy ra do một số lỗi trong FastCGI của PHP.
Hãy thử khởi động lại nó. Tại Ubuntu, nó:
service php-fastcgi restart
Tôi đã có cùng một vấn đề trong khi sử dụng autoload
như sau:
<?php
function __autoload($class_name)
{
include $class_name . '.php';
}
__autoload("MyClass1");
$obj = new MyClass1();
?>
và trong lớp khác có:
namespace testClassNamespace;
class MyClass1
{
function __construct()
{
echo "MyClass1 constructor";
}
}
Cách giải quyết là giữ khả năng tương thích không gian tên, trong ví dụ của tôi namespace testClassNamespace;
trong cả hai tệp.
PHP 5.3 (một phiên bản cũ hơn tôi nghĩ) dường như có vấn đề với cùng tên trong các trường hợp khác nhau. Vì vậy, tôi đã gặp vấn đề này khi có lớp Đăng nhập và giao diện mà nó thực hiện Đăng nhập. Sau khi tôi đổi tên LogIn thành Log_In, vấn đề đã được giải quyết.
Chỉ cần làm một việc bất cứ khi nào bạn bao gồm hoặc yêu cầu tên tệp là class.login.php. Bạn có thể bao gồm nó theo cách này:
include_once class.login.php or
require_once class.login.php
Bằng cách này, nó không bao giờ ném một lỗi.
Hàm này sẽ in một ngăn xếp cho bạn biết nó được gọi từ đâu:
function PrintTrace() {
$trace = debug_backtrace();
echo '<pre>';
$sb = array();
foreach($trace as $item) {
if(isset($item['file'])) {
$sb[] = htmlspecialchars("$item[file]:$item[line]");
} else {
$sb[] = htmlspecialchars("$item[class]:$item[function]");
}
}
echo implode("\n",$sb);
echo '</pre>';
}
Gọi hàm này ở đầu tệp bao gồm lớp của bạn.
Đôi khi nó sẽ chỉ in một lần, mặc dù lớp của bạn đang được đưa vào hai lần trở lên. Điều này là do PHP thực sự phân tích tất cả các lớp cấp cao nhất trong một tệp trước khi thực thi bất kỳ mã nào và đưa ra lỗi nghiêm trọng ngay lập tức. Để khắc phục điều này, hãy bọc phần khai báo lớp của bạn if(true) { ... }
, phần này sẽ chuyển lớp của bạn xuống một mức trong phạm vi. Sau đó, bạn sẽ nhận được hai dấu vết của bạn trước khi lỗi nghiêm trọng của PHP.
Điều này sẽ giúp bạn tìm thấy nơi lớp bạn đang được đưa vào nhiều lần trong một dự án phức tạp.
Bạn đã sử dụng Zend Framework? Tôi có cùng một vấn đề quá.
Tôi đã giải quyết nó bằng cách bình luận dòng này sau đây config/application.ini
:
;includePaths.library = APPLICATION_PATH "/../library"
Tôi hy vọng điều này sẽ giúp bạn.
Một thủ phạm có thể là kiểm soát nguồn và xung đột chưa được giải quyết. SVN có thể khiến cùng một lớp xuất hiện hai lần trong tệp mã bị xung đột; hai phiên bản thay thế của nó ("của tôi" và "của họ").
Tôi đã gặp phải vấn đề tương tự: phiên bản php mới hơn không xử lý giống nhau với nhiều tệp của cùng một tệp (dưới dạng thư viện), vì vậy bây giờ tôi phải thay đổi tất cả bao gồm của mình bởi một số include_once.
Hoặc thủ thuật này có thể giúp ích, nếu bạn không có quá nhiều lớp trong thư viện của mình ...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
Tôi đã có cùng một vấn đề "Lỗi nghiêm trọng của PHP: Không thể tái phân loại lớp XYZ.php".
Tôi có hai thư mục giống như controller
và model
tôi đã tải lên nhầm lẫn XYZ.php trong cả hai thư mục. (Vì vậy, tệp có cùng tên gây ra sự cố).
Tìm trong toàn bộ dự án của bạn và đảm bảo rằng bạn chỉ có một lớp XYZ.php.
Thêm một không gian tên trong lớp của bạn để bạn có thể sử dụng cùng tên lớp.
Nó thực sự có nghĩa là lớp đã được khai báo trong trang và bạn đang cố gắng tạo lại nó.
Một kỹ thuật đơn giản là như sau.
Tôi đã giải quyết vấn đề bằng cách sau. Hy vọng điều này sẽ giúp bạn một chút.
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}