PHP घातक त्रुटि: वर्ग को फिर से लिखना नहीं कर सकता


162

क्या किसी को पता है कि इस समस्या का कारण क्या हो सकता है?

PHP घातक त्रुटि: वर्ग को फिर से लिखना नहीं कर सकता


11
यह एपीसी के साथ जोड़ सकते हैं + autload देख stackoverflow.com/questions/4575341/...
gagarine

5
if(!class_exists('YourClass')){ include 'YourClass.php'; }
ऑटोलॉड का

जवाबों:


117

इसका मतलब है कि आपने पहले ही एक वर्ग बना लिया है।

उदाहरण के लिए:

class Foo {}

// some code here

class Foo {}

वह दूसरा फू त्रुटि को फेंक देगा।


75
यह उत्तर आरोनॉल्स के लिए उतना उपयोगी नहीं है। मुझे नहीं लगता कि प्रश्नकर्ता ने यह सवाल पूछा होगा कि क्या उसने इस तरह (यहां तक ​​कि एक जटिल स्थिति में) एक स्पष्ट दोहराव लिखा था। शामिल_ऑनस टिप PHP की अस्पष्ट विशेषता को स्पष्ट करने में मदद करता है।
डेविडहायो

2
यदि आप __construct पद्धति को एक से अधिक बार परिभाषित करते हैं तो यह त्रुटि भी हो सकती है।
जैक ट्रॉब्रिज

4
अपनी कक्षा को शामिल करने के लिए बस__ce ('FooBar.php') का उपयोग करें। फ़ंक्शन का नाम स्वयं-व्याख्यात्मक है।
मार्को माताराज़ी

2
AaronLS का उत्तर बहुत अधिक मूल्यांकित किया गया है, और आप इसे यहाँ नीचे पा सकते हैं ।
११

1
वास्तव में यह पूरी तरह से सवाल का जवाब देता है और यह कालातीत है, आरोनॉल्स एक धारणा बनाता है फिर उस समस्या को हल करने का प्रयास करता है जिसे अब कई बेहतर तरीकों से हल किया जा सकता है।
तारिणीजोन

317

आपके पास एक से अधिक बार घोषित किए गए समान नाम का एक वर्ग है। शायद कई के माध्यम से शामिल हैं। अन्य फ़ाइलों को शामिल करते समय आपको कुछ का उपयोग करने की आवश्यकता होती है

include_once "something.php";

कई समावेशन को रोकने के लिए। ऐसा होना बहुत आसान है, हालांकि यह हमेशा स्पष्ट नहीं होता है, क्योंकि आपके पास एक दूसरे द्वारा शामिल की जा रही फाइलों की एक लंबी श्रृंखला हो सकती है।


10
यह वास्तव में पूर्ण मदद थी!
Marci-man

4
से बचने के include_once , यह धीमी है, कुछ और उपयोग के बजाय, जैसे autoloading :)
टीमो Huovinen

21
@Timo मैंने जिन बेंचमार्क के आधार पर देखा है, उनमें केवल 1 सेकंड का ध्यान देने योग्य अंतर होगा, यदि आपके पास 100,000 शामिल_ऑनस वाली फाइल है। आप अपने डीबी एक्सेस या अन्य तर्क को समय से पहले अनुकूलित करने की तुलना में बेहतर होगा कि आपकी फ़ाइल में मास्टर जैसी फाइलें शामिल हैं। ऑटोलॉड फीचर काफी अलग तरह से प्रदर्शन नहीं करता है। प्रत्येक कार्य अलग-अलग होते हैं, और परस्पर विनिमय योग्य नहीं होते हैं। आप दूसरे के लिए एक का उपयोग कर सकते हैं, लेकिन कोने के मामले हैं जहां वे समान कार्य नहीं करते हैं।
एरोनल्स

3
@Timo आपके द्वारा लिंक किए गए पृष्ठ को उद्धृत करने के लिए "__autoload () का उपयोग करके हतोत्साहित किया जाता है और भविष्य में इसे हटा दिया या हटाया जा सकता है।"
एरोनल्स

1
@AaronLS एसओ पर टिप्पणियों को संपादित नहीं कर सकते, लिंक भी बेहतर उदाहरण के लिए लिंक करता है । मैंने एपीसी के डेवलपर्स की टिप्पणियों को पढ़ने के बाद यह सुझाव दिया था कि उन्हें कैसे शामिल किया गया है__ce (मुझे उनके लिए बुरा लगा)। इसके अलावा अंतर सिर्फ प्रदर्शन से परे है।
टिमो हुओवेनन

55

ऐसा तब होता है जब आप किसी पृष्ठ में एक से अधिक बार कक्षा घोषित करते हैं। आप उस क्लास को या तो एक स्टेटमेंट के साथ (जैसे नीचे) लपेट कर ठीक कर सकते हैं, या आप require_once()इसके बजाय एक अलग फाइल और उपयोग में ला सकते हैं include()

if (!class_exists('TestClass')) {
   // Put class TestClass here
}

5
यह class_exists ('TestClass') === गलत है या class_exist ('TestClass')
Jens A. Koch

2
@ जेन्स-AndréKoch टिप्पणी एक "एस" दूसरे उदाहरण में याद आ रही है में -> यह है class_exists('TestClass') === falseया!class_exists('TestClass')
furins

सच। यह बात बताने के लिए धन्यवाद। अब संपादन योग्य नहीं .. टाइमआउट।
जेन्स ए कोच

इस तर्क के लिए धन्यवाद।
फ्रैंक

21

उपयोग include_once();- इसके साथ, आपके कोड केवल एक बार शामिल किए जाएंगे।


15

यह तब होगा जब हम php लाइब्रेरी में बिल्ट इन क्लास में से किसी का भी इस्तेमाल करेंगे। मैंने निर्देशिका के रूप में वर्ग नाम का उपयोग किया और मुझे वही त्रुटि मिली। यदि आपको त्रुटि मिलती है, तो पहले यह सुनिश्चित कर लें कि आपके द्वारा उपयोग किया जाने वाला वर्ग नाम अंतर्निहित कक्षाओं में से एक नहीं है।


मेरे लिए यहाँ सुनहरा जवाब - मुझे नहीं लगा कि PHP का भी वैसा ही वर्ग नाम हो सकता है जैसा मैं उपयोग कर रहा था!
जेमी एम

12

यदि आप __constructविधि को एक से अधिक बार परिभाषित करते हैं तो यह त्रुटि भी हो सकती है ।


2
यह पहले से ही स्वीकार किए जाते हैं और अत्यधिक उत्कीर्ण जवाब पर टिप्पणी होनी चाहिए
यारोस्लाव

8

कभी-कभी PHP के FastCGI में कुछ बग के कारण ऐसा होता है।

इसे पुनः आरंभ करने का प्रयास करें। उबंटू में यह है:

service php-fastcgi restart

ठीक है, यह एक समाधान है, लेकिन यह समस्या को ठीक नहीं करता है और मेरे मामले में, समस्या अनियमित रूप से महीने में एक या दो बार दिखाई देती है। :(
स्केजेस

@ शक - आप प्रति घंटा पुनः आरंभ करने के लिए crontab पर पुनरारंभ कमांड जोड़ सकते हैं। गंदा - लेकिन आश्वासन देगा कि आपकी साइट का अधिकतम डाउनटाइम 1 घंटे का होगा।
लुहानिनोव

@ कैसे - यह मेरे लिए एक अच्छा समाधान नहीं है क्योंकि php कार्य दिवस के दौरान नीचे गिर रहा है। मुझे लगता है कि एक तरह से कि मैं रात के दौरान दैनिक पुनरारंभ कमांड जोड़ूंगा। दूसरे तरीके में, मैं IIS और PHP को अपग्रेड करने पर विचार करूंगा।
स्केजेस

6

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;दोनों फाइलों में मेरे उदाहरण में नाम स्थान की अनुकूलता बनाए रखने के लिए विनम्रता है ।


3

बस जोड़ना;

यह त्रुटि तब भी हो सकती है यदि आप गलती से किसी फ़ंक्शन को किसी अन्य फ़ंक्शन के अंदर डालते हैं।


3

PHP 5.3 (मुझे लगता है कि पुराने संस्करण भी) विभिन्न मामलों में एक ही नाम के साथ समस्या है। इसलिए मुझे यह समस्या तब हुई जब एक वर्ग लॉगिन और इंटरफ़ेस यह लॉग इन लागू करता है। जब मैंने LogIn का नाम बदलकर Log_In कर दिया तो समस्या हल हो गई।


3

जब भी आप एक चीज़ को शामिल करते हैं या आवश्यकता होती है, तो उसका नाम होता है, जैसे कि class.login.php। आप इसे इस तरह से शामिल कर सकते हैं:

include_once class.login.php or 
require_once class.login.php

इस तरह यह कभी भी त्रुटि नहीं करता है।


2

यह फ़ंक्शन आपको यह बताने के लिए एक स्टैक प्रिंट करेगा जहां से इसे बुलाया गया था:

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) { ... } , जो आपकी कक्षा को एक स्तर के दायरे में ले जाएगी। फिर आपको पीएचपी घातक त्रुटियों से पहले अपने दो निशान प्राप्त करने चाहिए।

इससे आपको यह पता लगाने में मदद मिलेगी कि आप एक जटिल परियोजना में कई बार कहाँ से शामिल किए जा रहे हैं।


1

क्या आपने Zend फ्रेमवर्क का उपयोग किया था? मुझे भी यही समस्या है।
मैंने इसे निम्न पंक्ति में टिप्पणी करके हल किया config/application.ini:

;includePaths.library = APPLICATION_PATH "/../library"

उम्मीद है इससे आपको मदद मिलेगी।


1

एक अन्य संभावित अपराधी स्रोत नियंत्रण और अनसुलझे संघर्ष है। SVN परस्पर विरोधी कोड फ़ाइल में एक ही वर्ग को दो बार दिखाई दे सकता है; इसके दो वैकल्पिक संस्करण ("मेरा" और "उनका")।


1

मुझे उसी समस्या का सामना करना पड़ा है: नया php संस्करण एक ही फ़ाइल के एकाधिक झुकाव (एक पुस्तकालय के रूप में) के साथ समान व्यवहार नहीं करता है, इसलिए अब मुझे अपने सभी शामिल को कुछ change_once द्वारा बदलना होगा।

या यह ट्रिक मदद कर सकती है, यदि आप अपने पुस्तकालय में बहुत अधिक कक्षा में हैं ...

if( class_exists('TestClass') != true )
{
   //your definition of TestClass
}

1

मुझे एक ही समस्या थी "PHP घातक त्रुटि: वर्ग XYZ.php redeclare नहीं कर सकता"।

मेरे पास दो निर्देशिकाएं हैं controllerऔर modelमैंने दोनों निर्देशिकाओं में गलती से XYZ.php द्वारा अपलोड किया है। (इसलिए एक ही नाम से फ़ाइल समस्या का कारण बनती है)।

पहला उपाय:

अपनी पूरी परियोजना में खोजें और सुनिश्चित करें कि आपके पास केवल एक वर्ग XYZ.php है।

दूसरा उपाय:

अपनी कक्षा में एक नाम स्थान जोड़ें ताकि आप उसी वर्ग के नाम का उपयोग कर सकें।


0

मैंने उसी समस्या का सामना किया है। पता चला कि मामला वर्ग का नाम था। मैंने नाम बदलकर इससे निपटा। इसलिए समस्या का समाधान।


0

इसका वास्तव में मतलब है कि पृष्ठ में कक्षा पहले से ही घोषित है और आप इसे फिर से बनाने की कोशिश कर रहे हैं।

एक सरल तकनीक इस प्रकार है।

मैंने निम्नलिखित के साथ समस्या हल की। आशा है कि यह आपकी थोड़ी मदद करेगा।

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.