পিএইচপি মারাত্মক ত্রুটি: বস্তু প্রসঙ্গে না থাকলে এটি ব্যবহার করে Using


137

আমার একটি সমস্যা হয়েছে:

আমি ফ্রেমওয়ার্ক ছাড়াই একটি নতুন ওয়েব অ্যাপ লিখছি।

আমার ইনডেক্স.এফপি-তে আমি ব্যবহার করছি:require_once('load.php');

এবং লোড.এফপিতে আমি require_once('class.php');আমার ক্লাস.এফপি লোড করতে ব্যবহার করছি ।

আমার class.php এ আমি এই ত্রুটি পেয়েছি:

মারাত্মক ত্রুটি: class এটি যখন ক্লাসে অবজেক্ট প্রসঙ্গে নয় in

আমার ক্লাস.এফপি কীভাবে রচিত তা একটি উদাহরণ :

class foobar {

    public $foo;

    public function __construct() {
        global $foo;

        $this->foo = $foo;
    }

    public function foobarfunc() {
        return $this->foo();
    }

    public function foo() {
        return $this->foo;
    }
}

আমার ইনডেক্স.এফপি-তে আমি সম্ভবত এর foobarfunc()মতো লোড করছি :

foobar::foobarfunc();

কিন্তু হতে পারে

$foobar = new foobar;
$foobar->foobarfunc();

ত্রুটি কেন আসছে?


2
কাকতালীয়ভাবে আমি গতকাল প্রায় 3 ঘন্টা এই ত্রুটির সাথে লড়াই করে যাচ্ছিলাম! :)
জ্যাক

উত্তর:


184

আমার ইনডেক্স.এফপি-তে আমি সম্ভবত foobarfunc () লোড করছি:

 foobar::foobarfunc();  // Wrong, it is not static method

কিন্তু হতে পারে

$foobar = new foobar;  // correct
$foobar->foobarfunc();

আপনি পদ্ধতিটি এইভাবে প্রার্থনা করতে পারবেন না কারণ এটি স্থির পদ্ধতি নয়।

foobar::foobarfunc();

পরিবর্তে আপনার ব্যবহার করা উচিত:

foobar->foobarfunc();

তবে আপনি যদি স্থির পদ্ধতি তৈরি করেন তবে এরকম কিছু:

static $foo; // your top variable set as static

public static function foo() {
    return self::$foo;
}

তাহলে আপনি এটি ব্যবহার করতে পারেন:

foobar::foobarfunc();

1
একই নামযুক্ত ভেরিয়েবলগুলি কোনও সমস্যা নয়। $this->fooএকটি শ্রেণীর সদস্য, যদিও $fooফাংশন স্কোপটিতে কেবল একটি পরিবর্তনশীল (বৈশ্বিক সুযোগ থেকে আমদানি করা)। সদস্য হিসাবে একই নামের ফাংশন নামগুলিও কোনও সমস্যা নয়।
গর্ডন

157
আপনি $thisএকটি স্থিতিশীল পদ্ধতিতে ব্যবহার করতে পারবেন না ।
ইয়াকবি

5
এটি একটি মজার বিষয় যে কীভাবে সম্পূর্ণ ভুল উত্তর উপস্থাপন করে ot class এটি শ্রেণি প্রসঙ্গে উপলব্ধ নয়। ওপি উপরের উদাহরণ থেকে একই ত্রুটিটি পাবে।
গর্ডন

4
@ সরফরাজ কোনও অপরাধ নয়, তবে এটি এখনও ভুল। আপনি একটি উদাহরণ পদ্ধতিতে কল করতে পারেন:: । এটা তোলে বিরুদ্ধ E_STRICT, কিন্তু এটা না দীর্ঘ পদ্ধতি শরীর উদাহরণস্বরূপ সুযোগ রেফারেন্স করে না, যেমন ব্যবহারসমূহ হিসেবে কাজ $this। এছাড়াও, self::fooনির্দেশ করবে না $this->foo। এটি একটি শ্রেণির ধ্রুবককে উল্লেখ করে । উভয়ই, self::fooএবং self::$fooমারাত্মক ত্রুটি বাড়িয়ে তুলবে।
গর্ডন

3
@ সরফরাজ এখন এটি আরও ভাল। আপনাকে ছিটিয়ে দেওয়ার জন্য দুঃখিত, তবে এটি যেহেতু গ্রহণযোগ্য উত্তর হয়ে গেছে, আমি এই বিষয়গুলি উল্লেখ করা প্রয়োজন বলে অনুভব করেছি :) আপনার ধৈর্যের জন্য ধন্যবাদ।
গর্ডন

27

আপনি একটি স্থিতিশীল পদ্ধতি কল করছেন:

public function foobarfunc() {
    return $this->foo();
}

স্ট্যাটিক-কল ব্যবহার করে:

foobar::foobarfunc();

স্ট্যাটিক-কল ব্যবহার করার সময়, ফাংশনটি কল করা হবে (হিসাবে ঘোষণা নাstatic হলেও ) , কিন্তু, কারণ কোনও বস্তুর উদাহরণ নেই, তাই নেই $this

সুতরাং:

  • অ স্থির পদ্ধতিগুলির জন্য আপনার স্ট্যাটিক কলগুলি ব্যবহার করা উচিত নয়
  • আপনার স্ট্যাটিক পদ্ধতিগুলি (বা স্ট্যাটিকালি-বলা পদ্ধতিগুলি) ব্যবহার করতে পারবেন না $ এটি সাধারণত ক্লাসের বর্তমান উদাহরণকে নির্দেশ করে, কারণ আপনি যখন স্থির-কল ব্যবহার করছেন তখন কোনও শ্রেণীর উদাহরণ নেই।


এখানে, আপনার শ্রেণীর পদ্ধতিগুলি ক্লাসের বর্তমান উদাহরণটি ব্যবহার করছে, কারণ তাদের $fooশ্রেণীর সম্পত্তি অ্যাক্সেস করার প্রয়োজন রয়েছে ।

এর অর্থ আপনার পদ্ধতিগুলির শ্রেণীর উদাহরণ প্রয়োজন - যার অর্থ তারা স্থির থাকতে পারে না।

এর অর্থ আপনার স্ট্যাটিক কলগুলি ব্যবহার করা উচিত নয়: আপনার ক্লাসটি ইনস্ট্যান্ট করা উচিত এবং পদ্ধতিগুলির কল করতে অবজেক্টটি ব্যবহার করা উচিত, যেমন আপনি কোডের শেষ অংশে করেছিলেন:

$foobar = new foobar();
$foobar->foobarfunc();


আরও তথ্যের জন্য, পিএইচপি ম্যানুয়ালটিতে পড়তে দ্বিধা করবেন না:


আরও মনে রাখবেন যে আপনার __constructপদ্ধতিতে সম্ভবত আপনার এই লাইনটির প্রয়োজন নেই :

global $foo;

globalকীওয়ার্ডটি ব্যবহার করা $fooচলকটিকে সমস্ত ক্রিয়াকলাপ এবং শ্রেণীর বাইরে ঘোষিত পরিবর্তনযোগ্য করে তুলবে , সেই পদ্ধতির অভ্যন্তর থেকে দৃশ্যমান হবে ... এবং আপনার সম্ভবত এ জাতীয় $fooপরিবর্তনশীল নেই have

$foo শ্রেণি-সম্পত্তি অ্যাক্সেস করতে আপনার $this->fooযেমন ব্যবহার করা হয়েছে কেবল তেমন ব্যবহার করা দরকার ।


11

আপনি invoking হয় foobarfuncসঙ্গে রেজল্যুশন সুযোগ অপারেটর ( ::), তারপর আপনি এটা আহ্বান করা হয় স্ট্যাটিক্যালি বর্গ স্তর পরিবর্তে উদাহরণস্বরূপ স্তরের উপর, যেমন এইভাবে আপনি হয় ব্যবহার $thisবস্তুর প্রেক্ষাপটে যখন না$thisশ্রেণি প্রসঙ্গে উপস্থিত নেই।

যদি আপনি সক্ষম হন E_STRICT, পিএইচপি এই সম্পর্কে একটি বিজ্ঞপ্তি উত্থাপন করবে:

Strict Standards: 
Non-static method foobar::foobarfunc() should not be called statically

পরিবর্তে এটি করুন

$fb = new foobar;
echo $fb->foobarfunc();

একপাশে, আমি globalআপনার ক্লাসের মধ্যে ব্যবহার না করার পরামর্শ দিই । আপনার ক্লাসের বাইরে থেকে যদি আপনার কিছু প্রয়োজন হয় তবে এটি কনস্ট্রাক্টরের মাধ্যমে পাস করুন। একে বলা হয় নির্ভরতা ইনজেকশন এবং এটি আপনার কোডকে অনেক বেশি রক্ষণাবেক্ষণযোগ্য এবং বাইরের জিনিসের উপর কম নির্ভর করবে।


6

প্রথমে এক জিনিস বুঝি, $ এই ভিতরে একটি বর্গ উল্লেখ করে বর্তমান বস্তুর
ক্লাস ফাংশন বা ভেরিয়েবলকে কল করতে আপনি যা ক্লাসের পাশে তৈরি করেছেন তা।

সুতরাং যখন আপনি আপনার ক্লাস ফাংশনকে ফোবারের মতো কল করুন: foobarfunc (), অবজেক্ট তৈরি হয় না। তবে সেই ফাংশনের অভ্যন্তরে আপনি রিটার্ন লিখেছিলেন - এটি-> ফু ()। এখন এখানে $ এটি কিছুই না। ক্লাস.ফ্পে অবজেক্ট প্রসঙ্গে না থাকাকালীন কেন এটির কথাটি বলছে

সলিউশন:

  1. একটি অবজেক্ট তৈরি করুন এবং foobarfunc () কল করুন।

  2. Foobarfunc () এর ভিতরে শ্রেণীর নাম ব্যবহার করে foo () কল করুন।


2
বা কেবল স্ব ব্যবহার করুন :: এর পরিবর্তে
মোতাশেম এমকে

4

আপনি যখন স্থিতিশীল প্রসঙ্গে ফাংশনটি কল করেন তখন $thisকেবল উপস্থিত থাকে না।

this::xyz()পরিবর্তে আপনি ব্যবহার করতে হবে।

কোনও ফাংশনটিকে স্থিতিশীলভাবে এবং কোনও অবজেক্টের ক্ষেত্রে উভয়ই বলা যেতে পারে, আপনি কোন প্রসঙ্গে রয়েছেন তা সন্ধানের জন্য, এই প্রশ্নে একটি ভাল পদ্ধতির রূপরেখা দেওয়া হয়েছে: আমি স্থির বা কোনও অবজেক্ট কিনা তা কীভাবে বলা যায়?


4

দ্রুত পদ্ধতি: (নতুন foobar ()) -> foobarfunc ();

আপনার ক্লাস প্রতিস্থাপনটি লোড করতে হবে:

foobar::foobarfunc();

দ্বারা :

(new foobar())->foobarfunc();

বা:

$Foobar = new foobar();
$Foobar->foobarfunc();

অথবা ব্যবহারের জন্য স্থির ফাংশন তৈরি করুন foobar::

class foobar {
    //...

    static function foobarfunc() {
        return $this->foo();
    }
}

0

$foobar = new foobar;করা বর্গ $ FOOBAR মধ্যে FOOBAR না বস্তুর । অবজেক্টটি পেতে, আপনাকে প্রথম বন্ধনী যুক্ত করতে হবে:$foobar = new foobar();

তোমার ত্রুটি কেবল যে আপনি একটি বর্গ উপর একটি পদ্ধতি কল, তাই নেই $thisযেহেতু $thisশুধুমাত্র বস্তু বিদ্যমান।


0

এটি আমার কাছে পিএইচপি-তে একটি বাগ বলে মনে হচ্ছে। ভূল

'মারাত্মক ত্রুটি: আনকড ত্রুটি: $ এটি যখন অবজেক্টের প্রসঙ্গে নয়' ব্যবহার করে

ব্যবহার করে ফাংশনে উপস্থিত হয় $this, তবে ত্রুটিটি হ'ল কলিং ফাংশনটি স্ট্যাটিক হিসাবে অ-স্ট্যাটিক ফাংশনটি ব্যবহার করে। অর্থাৎ,

Class_Name
{
    function foo()
    {
        $this->do_something(); // The error appears there.
    }
    function do_something()
    {
        ///
    }
}

ত্রুটিটি এখানে রয়েছে:

Class_Name::foo();

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.