পিএইচপি মারাত্মক ত্রুটি: শ্রেণি পুনরায় ঘোষিত করতে পারে না


162

কেউ কি জানেন যে কী কারণে এই সমস্যা হতে পারে?

পিএইচপি মারাত্মক ত্রুটি: শ্রেণি পুনরায় ঘোষিত করতে পারে না


11
এই এপিসি সঙ্গে সংযুক্ত করতে পারবেন + + autload দেখতে stackoverflow.com/questions/4575341/...
gagarine

5
অটোল্যাড ব্যবহার করুন, বা if(!class_exists('YourClass')){ include 'YourClass.php'; }
আপনিও

উত্তর:


117

এর অর্থ আপনি ইতিমধ্যে একটি ক্লাস তৈরি করেছেন।

এই ক্ষেত্রে:

class Foo {}

// some code here

class Foo {}

যে দ্বিতীয় ফু ত্রুটি নিক্ষেপ করবে।


75
এই উত্তরটি অ্যারোনএলএসের মতো সহায়ক নয়। আমি মনে করি না যে প্রশ্নকারী যদি প্রশ্নটি জিজ্ঞাসা করত তবে (গুলি) তিনি যদি এর মতো সুস্পষ্ট পুনরাবৃত্তি লিখেছিলেন (এমনকি বেশ জটিল পরিস্থিতিতেও)। অন্তর্ভুক্ত_আমার টিপ পিএইচপি-র একটি অস্পষ্ট বৈশিষ্ট্য স্পষ্ট করতে সহায়তা করে।
ডেভিডহায়োগো

2
যদি আপনি __ কনস্ট্রাক্ট পদ্ধতিটি একাধিকবার সংজ্ঞায়িত করেন তবে এই ত্রুটিটিও ঘটতে পারে।
জ্যাক ট্রব্রিজ ২

4
আপনার ক্লাসটি অন্তর্ভুক্ত করতে কেবল অন্তর্ভুক্ত_অনসেস ('FooBar.php') ব্যবহার করুন। ফাংশনটির নাম স্ব-ব্যাখ্যামূলক।
মার্কো মাতারাজ্জি

2
आरोনএলএসের উত্তরটি অনেক বেশি রেটযুক্ত, এবং আপনি এটি এখানে নীচে খুঁজে পেতে পারেন ।
qris

1
আসলে এটি প্রশ্নের পুরোপুরি উত্তর দেয় এবং এটি নিরবধি, অ্যারোনলএস একটি অনুমান করে তারপরে সমস্যাটি সমাধান করার চেষ্টা করে যা এখন আরও অনেক ভাল উপায়ে সমাধান করা যেতে পারে।
তারানজোনস

317

আপনার একই নামের ক্লাস একাধিকবার ঘোষিত হয়েছে। হতে পারে একাধিক মাধ্যমে। অন্যান্য ফাইলগুলি অন্তর্ভুক্ত করার সময় আপনার মতো কিছু ব্যবহার করা দরকার

include_once "something.php";

একাধিক অন্তর্ভুক্তি রোধ করতে। এটি হ'ল এটি খুব সহজ, যদিও এটি সর্বদা সুস্পষ্ট নয়, যেহেতু আপনি একে অপরের দ্বারা অন্তর্ভুক্ত হওয়া ফাইলগুলির একটি দীর্ঘ শৃঙ্খলা থাকতে পারে।


10
এটি সত্যিই পূর্ণ সাহায্য ছিল!
মারসি-ম্যান

4
অন্তর্ভুক্তি_ এড়াতে আস্তে আস্তে আস্তে আস্তে চলুন , এর পরিবর্তে অন্য কিছু ব্যবহার করুন, যেমন অটোল্যাডিং :)
টিমো হুভিনেন

21
@ টিমো আমি দেখেছি এমন মানদণ্ডের উপর ভিত্তি করে, আপনার যদি ১০,০০,০০০ এর মধ্যে একটি ফাইল থাকে তবে কেবলমাত্র 1 সেকেন্ডের মধ্যে একটি পার্থক্য লক্ষ্য করা যায়। মাস্টার ফাইল অন্তর্ভুক্ত যেমন নিম্নমানের কৌশল ব্যবহার করার আগে আপনার ফাইলের অপরিশোধিত করার চেয়ে আপনার ডিবি অ্যাক্সেস বা অন্যান্য যুক্তিকে অপ্টিমাইজ করা ভাল। অটোল্যাড বৈশিষ্ট্যটি অন্যভাবে উল্লেখযোগ্যভাবে সম্পাদন করে না। প্রতিটি ফাংশন পৃথকভাবে, এবং বিনিময়যোগ্য উপযুক্ত নয়। আপনি অন্যটির জন্য একটি ব্যবহার করতে পারেন, তবে কোণার কেস রয়েছে যেখানে সেগুলি একই রকম হয় না।
অ্যারোনএলএস

3
@ টিমো আপনি যে পৃষ্ঠাটি সংযুক্ত করেছেন তা উদ্ধৃত করতে "__autoload () ব্যবহার করে নিরুৎসাহিত করা হয়েছে এবং ভবিষ্যতে অবনতি বা অপসারণ করা যেতে পারে।"
অ্যারোনএলএস

1
@ অ্যারোনলস এসও-তে মন্তব্য সম্পাদনা করতে পারে না, লিঙ্কটি আরও ভাল উদাহরণের সাথে লিঙ্ক করে । আমি এপিসির বিকাশকারীদের মন্তব্য পড়ার পরে এবং সে কীভাবে অন্তর্ভুক্ত_কেই ঘৃণা করল (আমি তার জন্য খারাপ লাগলাম) তা পরামর্শ দিয়েছিলাম। এছাড়াও পার্থক্যটি কেবল পারফরম্যান্সের বাইরে।
টিমো হুভিনেন

55

আপনি যখন কোনও পৃষ্ঠায় একাধিকবার ক্লাস ঘোষণা করেন তা ঘটে। আপনি যদি এই ক্লাসটি একটি if স্টেটমেন্ট (নীচের মত) দিয়ে মোড়ানো দ্বারা এটি ঠিক করতে পারেন, বা আপনি এটি একটি পৃথক ফাইলে রাখতে পারেন এবং require_once()পরিবর্তে ব্যবহার করতে পারেন include()

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

5
এটি ক্লাস_এজিস্ট ('টেস্টক্লাস') === মিথ্যা বা! শ্রেণি_কাজি ('টেস্টক্লাস')
জেনস এ। কোচ

2
@ জেনস-অ্যান্ড্রোকোচে মন্তব্য করেছেন একটি "গুলি" দ্বিতীয় উদাহরণে অনুপস্থিত -> এটি class_exists('TestClass') === falseবা!class_exists('TestClass')

সত্য। যে ইশারা জন্য ধন্যবাদ। আর সম্পাদনযোগ্য নয় .. সময়সীমা।
জেনস এ। কোচ

এই যুক্তি জন্য ধন্যবাদ।
ফ্রাঙ্ক

21

ব্যবহার করুন include_once();- এটির সাথে আপনার কোডগুলি কেবল একবার অন্তর্ভুক্ত করা হবে।


15

যদি আমরা পিএইচপি লাইব্রেরিতে অন্তর্নির্মিত কোনও ক্লাস ব্যবহার করি তবে এটি ঘটবে। আমি ক্লাসের নামটি ডিরেক্টরি হিসাবে ব্যবহার করেছি এবং একই ত্রুটি পেয়েছি। আপনি যদি ত্রুটি পান তবে প্রথমে নিশ্চিত হয়ে নিন যে আপনি যে শ্রেণীর নামটি ব্যবহার করছেন সেটি কোনও অন্তর্নির্মিত শ্রেণীর মধ্যে নয়।


আমার জন্য এখানে সুবর্ণ উত্তর - আমি এমনকি ভাবিনি যে পিএইচপি ব্যবহার করার সময় একই শ্রেণীর নাম থাকতে পারে!
জেমি এম

12

আপনি যদি __constructএকাধিকবার পদ্ধতিটি নির্ধারণ করেন তবে এই ত্রুটিটিও ঘটতে পারে ।


2
এটি ইতিমধ্যে গৃহীত এবং উচ্চ উত্সাহিত উত্তর সম্পর্কে একটি মন্তব্য হওয়া উচিত
ইয়ারোস্লাভ

8

কখনও কখনও এটি পিএইচপি এর ফাস্টসিজিআই-তে কিছু বাগের কারণে ঘটে happens

এটি পুনরায় চালু করার চেষ্টা করুন। উবুন্টুতে এটি:

service php-fastcgi restart

ঠিক আছে, এটি একটি সমাধান তবে সমস্যাটি সংশোধন করে না এবং আমার ক্ষেত্রে, সমস্যাটি মাসব্যাপী এক বা দুইবার এলোমেলোভাবে উপস্থিত হয়। :(
স্কেজেস

@ স্কেজেস - আপনি ক্রন্টবকে পুনরায় চালু করতে কমান্ড পুনরায় আরম্ভ করতে পারেন hour নোংরা - তবে আশ্বাস দেবে যে আপনার সাইটের সর্বাধিক ডাউনটাইম 1 ঘন্টা হবে।
লুচানিনভ

@ কীভাবে - এটি আমার পক্ষে ভাল সমাধান নয় কারণ কার্যদিবসে পিএইচপি হ্রাস পাচ্ছে। আমি মনে করি যে একরকমভাবে আমি রাতের বেলা প্রতিদিন পুনর্সূচনা কমান্ড যুক্ত করব। দ্বিতীয় উপায়ে, আমি আইআইএস এবং পিএইচপি আপগ্রেড করার বিষয়টি বিবেচনা করব।
স্কেজেস

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

পিএইচপি 5.3 (আমি মনে করি পুরানো সংস্করণগুলিও) বিভিন্ন ক্ষেত্রে একই নামের সাথে সমস্যা রয়েছে। ক্লাস লগইন এবং ইন্টারফেসটি এটি লগইন প্রয়োগ করে তখন আমার এই সমস্যাটি হয়েছিল। আমি লগইনটির নাম লগ-ইন করার পরে সমস্যাটি সমাধান হয়ে গেল।


3

আপনি যখনই ক্লাস.লগিন.পিপি নামের ফাইলের নাম অন্তর্ভুক্ত করেন বা প্রয়োজন হয় কেবল একটি কাজ করুন। আপনি এটি এইভাবে অন্তর্ভুক্ত করতে পারেন:

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

আপনার ক্লাস অন্তর্ভুক্ত ফাইলের শীর্ষে এই ফাংশনটি কল করুন।

আপনার ক্লাসটি দুই বা ততোধিকবার অন্তর্ভুক্ত করা হলেও কখনও কখনও এটি কেবল একবার মুদ্রণ করা হবে। কারণ পিএইচপি আসলে কোনও কোড কার্যকর করার আগে একটি ফাইলের সমস্ত উচ্চ-স্তরের শ্রেণিকে পার্স করে এবং তাত্ক্ষণিকভাবে মারাত্মক ত্রুটি ছুঁড়ে দেয়। এটির প্রতিকারের জন্য, আপনার শ্রেণীর ঘোষণাটি মোড়ানোif(true) { ... } যা আপনার শ্রেণিকে সুযোগের এক স্তরে নামিয়ে দেবে। তারপরে আপনার পিএইচপি মারাত্মক ত্রুটির আগে আপনার দুটি ট্রেস পাওয়া উচিত।

এটি আপনাকে কোনও জটিল প্রকল্পে একাধিকবার থেকে ক্লাসটি কোথায় অন্তর্ভুক্ত করা হচ্ছে তা সন্ধান করতে সহায়তা করবে।


1

আপনি জেন্ড ফ্রেমওয়ার্ক ব্যবহার করেছেন? আমারও ঠিক একই সমস্যা আছে.
আমি এখানে নিম্নলিখিত লাইনটি মন্তব্য করে এটি সমাধান করেছি config/application.ini:

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

আমি আশা করি এটা তোমাকে সাহায্য করবে।


1

আর একটি সম্ভাব্য অপরাধী হ'ল উত্স নিয়ন্ত্রণ এবং অমীমাংসিত বিরোধ। এসভিএন একই শ্রেণীর দ্বন্দ্বযুক্ত কোড ফাইলটিতে দুবার প্রদর্শিত হতে পারে; এর দুটি বিকল্প সংস্করণ ("আমার" এবং "তাদের")।


1

আমি একই সমস্যাটির মুখোমুখি হয়েছি: নতুন পিএইচপি সংস্করণ একই ফাইলের একাধিক ইনক্লুয়েস (লাইব্রেরি হিসাবে) এর সাথে একই আচরণ করে না, তাই এখন আমাকে কিছু অন্তর্ভুক্ত_আন্সে আমার সমস্ত পরিবর্তন করতে হবে।

অথবা এই কৌশলগুলি সাহায্য করতে পারে, যদি আপনার গ্রন্থাগারে খুব বেশি ক্লাস না থাকে ...

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

1

আমার একই সমস্যা ছিল "পিএইচপি মারাত্মক ত্রুটি: এক্সওয়াইজেড.এফপি ক্লাসটি পুনরায় ঘোষণা করতে পারে না"।

আমি দুই ডিরেক্টরি মত আছে controllerএবং modelআমি উভয় ডিরেক্টরিগুলি থেকে ভুল করে XYZ.php দ্বারা আপলোড করা। (ইস্যু কারণ একই নামের ফাইল তাই)।

প্রথম সমাধান:

আপনার পুরো প্রকল্পটি সন্ধান করুন এবং নিশ্চিত করুন যে আপনার কাছে কেবলমাত্র একটি ক্লাস XYZ.php আছে।

দ্বিতীয় সমাধান:

আপনার শ্রেণিতে একটি নেমস্পেস যুক্ত করুন যাতে আপনি একই শ্রেণীর নাম ব্যবহার করতে পারেন।


0

আমি একই সমস্যা সম্মুখীন হয়েছে। কেসটি ক্লাসের নাম ছিল নামটি পরিবর্তন করে আমি এটির মোকাবিলা করেছি। সুতরাং সমস্যা সমাধান।


0

এর অর্থ হ'ল ক্লাসটি ইতিমধ্যে পৃষ্ঠায় ঘোষণা করা হয়েছে এবং আপনি এটি পুনরায় তৈরি করার চেষ্টা করছেন।

একটি সহজ কৌশল অনুসরণ করা হয়।

আমি নিম্নলিখিতটি দিয়ে সমস্যাটি সমাধান করেছি। আশা করি এটি আপনাকে কিছুটা সাহায্য করবে।

if(!class_exists("testClassIfExist"))
{
    require_once("testClassIfExist.php");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.