ไม่มีใครรู้ว่าสิ่งที่สามารถทำให้เกิดปัญหานี้หรือไม่?
ข้อผิดพลาดร้ายแรงของ PHP: ไม่สามารถประกาศคลาสซ้ำได้
if(!class_exists('YourClass')){ include 'YourClass.php'; }
ไม่มีใครรู้ว่าสิ่งที่สามารถทำให้เกิดปัญหานี้หรือไม่?
ข้อผิดพลาดร้ายแรงของ PHP: ไม่สามารถประกาศคลาสซ้ำได้
if(!class_exists('YourClass')){ include 'YourClass.php'; }
คำตอบ:
หมายความว่าคุณได้สร้างคลาสแล้ว
ตัวอย่างเช่น
class Foo {}
// some code here
class Foo {}
ฟูที่สองนั้นก็จะโยนความผิดพลาดนั้น
คุณมีคลาสชื่อเดียวกันที่ประกาศมากกว่าหนึ่งครั้ง อาจรวมถึงหลาย ๆ เมื่อรวมไฟล์อื่น ๆ คุณต้องใช้สิ่งที่ต้องการ
include_once "something.php";
เพื่อป้องกันการรวมหลายรายการ มันง่ายมากที่จะเกิดขึ้น แต่ไม่ชัดเจนเสมอไปเนื่องจากคุณอาจมีไฟล์ที่มีความยาวรวมกัน
ที่เกิดขึ้นเมื่อคุณประกาศคลาสมากกว่าหนึ่งครั้งในเพจ คุณสามารถแก้ไขได้โดยการห่อทั้งที่เรียนกับถ้างบ (เช่นด้านล่าง) หรือคุณสามารถใส่ลงในแฟ้มแยกต่างหากและการใช้งานแทนrequire_once()
include()
if (!class_exists('TestClass')) {
// Put class TestClass here
}
class_exists('TestClass') === false
or!class_exists('TestClass')
ใช้include_once();
- ด้วยสิ่งนี้รหัสของคุณจะถูกรวมเพียงครั้งเดียว
สิ่งนี้จะเกิดขึ้นถ้าเราใช้คลาสใด ๆ ที่สร้างขึ้นในไลบรารี php ฉันใช้ชื่อคลาสเป็นไดเรกทอรีและฉันได้รับข้อผิดพลาดเดียวกัน หากคุณได้รับข้อผิดพลาดก่อนตรวจสอบให้แน่ใจว่าชื่อคลาสที่คุณใช้ไม่ใช่หนึ่งในคลาสที่สร้างขึ้น
ข้อผิดพลาดนี้อาจเกิดขึ้นหากคุณกำหนด__construct
วิธีการมากกว่าหนึ่งครั้ง
บางครั้งเกิดขึ้นเนื่องจากข้อบกพร่องบางอย่างใน PHP ของ FastCGI
ลองรีสตาร์ท ที่ Ubuntu คือ:
service php-fastcgi restart
ฉันมีปัญหาเดียวกันในขณะที่ใช้autoload
ดังนี้:
<?php
function __autoload($class_name)
{
include $class_name . '.php';
}
__autoload("MyClass1");
$obj = new MyClass1();
?>
และในชั้นเรียนอื่น ๆ มี:
namespace testClassNamespace;
class MyClass1
{
function __construct()
{
echo "MyClass1 constructor";
}
}
วิธีแก้ปัญหาคือการรักษาความเข้ากันได้ของเนมสเปซในตัวอย่างของฉันnamespace testClassNamespace;
ในไฟล์ทั้งสอง
เพิ่งเพิ่ม;
ข้อผิดพลาดนี้ยังสามารถเกิดขึ้นได้หากคุณใส่ฟังก์ชันภายในฟังก์ชันอื่นโดยไม่ได้ตั้งใจ
PHP 5.3 (ฉันคิดว่ารุ่นเก่าเกินไป) ดูเหมือนว่าจะมีปัญหากับชื่อเดียวกันในกรณีที่แตกต่างกัน ดังนั้นฉันจึงมีปัญหานี้เมื่อมีการเข้าสู่ชั้นเรียนและอินเทอร์เฟซมันใช้เข้าสู่ระบบ หลังจากฉันเปลี่ยนชื่อ LogIn เป็น Log_In ปัญหาได้รับการแก้ไข
เพียงแค่ทำสิ่งหนึ่งเมื่อใดก็ตามที่คุณรวมหรือต้องการชื่อไฟล์คือ class.login.php คุณสามารถรวมวิธีนี้ได้:
include_once class.login.php or
require_once class.login.php
ด้วยวิธีนี้มันไม่เคยเกิดข้อผิดพลาด
ฟังก์ชั่นนี้จะพิมพ์สแต็คบอกคุณว่ามันถูกเรียกจาก:
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>';
}
เรียกใช้ฟังก์ชันนี้ที่ด้านบนของไฟล์ที่มีคลาสของคุณ
บางครั้งมันจะพิมพ์เพียงครั้งเดียวแม้ว่าชั้นเรียนของคุณจะถูกรวมสองครั้งหรือมากกว่า เนื่องจาก PHP แยกวิเคราะห์คลาสระดับบนทั้งหมดในไฟล์ก่อนเรียกใช้โค้ดใด ๆ และส่งข้อผิดพลาดร้ายแรงทันที ในการแก้ไขปัญหานี้ให้ห่อประกาศของชั้นในif(true) { ... }
ซึ่งจะทำให้ชั้นเรียนของคุณเลื่อนระดับลงในขอบเขต จากนั้นคุณควรได้รับสองร่องรอยก่อนที่ PHP จะเกิดข้อผิดพลาดร้ายแรง
สิ่งนี้จะช่วยให้คุณค้นหาว่าคุณรวมคลาสที่ใดจากโครงการที่ซับซ้อน
คุณใช้ Zend Framework หรือไม่ ฉันมีปัญหาเดียวกันด้วย
ฉันแก้ไขมันโดยการคอมเม้นต์บรรทัดต่อไปนี้ในconfig/application.ini
:
;includePaths.library = APPLICATION_PATH "/../library"
ฉันหวังว่านี่จะช่วยคุณได้
ผู้ร้ายที่เป็นไปได้อีกอย่างหนึ่งคือการควบคุมแหล่งที่มาและความขัดแย้งที่ไม่ได้รับการแก้ไข SVN อาจทำให้คลาสเดียวกันปรากฏสองครั้งในไฟล์รหัสที่ขัดแย้ง รุ่นทางเลือกสองแบบ ("ของฉัน" และ "ของพวกเขา")
ฉันพบว่าปัญหาเดียวกัน: เวอร์ชัน php ที่ใหม่กว่าไม่ได้จัดการเหมือนกันกับการรวมไฟล์หลาย ๆ ไฟล์ (เป็นไลบรารี่) ดังนั้นตอนนี้ฉันต้องเปลี่ยนทั้งหมดของฉันโดยบางอย่างรวมถึง include_once
หรือเทคนิคนี้อาจช่วยได้ถ้าคุณไม่มีคลาสในห้องสมุดมากเกินไป ...
if( class_exists('TestClass') != true )
{
//your definition of TestClass
}
ฉันมีปัญหาเดียวกัน "ข้อผิดพลาดร้ายแรงของ PHP: ไม่สามารถประกาศคลาส XYZ.php ซ้ำได้"
ฉันมีสองไดเรกทอรีที่ชอบcontroller
และmodel
ฉันอัปโหลดโดย XYZ.php ในทั้งสองไดเรกทอรีโดยไม่ตั้งใจ (ดังนั้นไฟล์ที่มีชื่อเดียวกันจะทำให้เกิดปัญหา)
ค้นหาในโครงการทั้งหมดของคุณและตรวจสอบให้แน่ใจว่าคุณมีคลาส XYZ.php เพียงคลาสเดียวเท่านั้น
เพิ่มเนมสเปซในคลาสของคุณเพื่อให้คุณสามารถใช้ชื่อคลาสเดียวกันได้
ฉันพบปัญหาเดียวกันแล้ว พบกรณีที่เป็นชื่อชั้น ฉันจัดการกับมันโดยเปลี่ยนชื่อ ดังนั้นการแก้ไขปัญหา
หมายถึงคลาสนั้นมีการประกาศในหน้าแล้วและคุณพยายามสร้างมันขึ้นมาใหม่
เทคนิคง่าย ๆ ดังต่อไปนี้
ฉันแก้ไขปัญหาดังต่อไปนี้ หวังว่าสิ่งนี้จะช่วยคุณได้เล็กน้อย
if(!class_exists("testClassIfExist"))
{
require_once("testClassIfExist.php");
}