ওভাররাইডিং ক্লাস ধ্রুবক বনাম বৈশিষ্ট্যগুলি


99

আমি আরও ভাল করে বুঝতে চাই যে, নীচের দৃশ্যে, শ্রেণি ধ্রুবকদের যেমন বনাম উদাহরণের ভেরিয়েবলগুলি উত্তরাধিকার সূত্রে প্রাপ্ত তার মধ্যে একটি পার্থক্য রয়েছে।

<?php
class ParentClass {
    const TEST = "ONE";
    protected $test = "ONE";

    public function showTest(){
        echo self::TEST;
        echo $this->test;
    }
}

class ChildClass extends ParentClass {
    const TEST = "TWO";
    protected $test = "TWO";

    public function myTest(){
        echo self::TEST;
        echo $this->test;
    }
}

$child = new ChildClass();
$child->myTest();
$child->showTest();

আউটপুট:

TWO
TWO
ONE
TWO

উপরের কোডে, চাইল্ড ক্লাসে শো টেস্ট () পদ্ধতি নেই, সুতরাং প্যারেন্টক্লাস শোটেষ্ট () পদ্ধতিটি উত্তরাধিকার দ্বারা ব্যবহৃত হয়। ফলাফলগুলি দেখায় যে যেহেতু পদ্ধতিটি প্যারেন্টক্লাসে কার্যকর হচ্ছে, তাই টেস্ট ধ্রুবকের প্যারেন্টক্লাস সংস্করণটি মূল্যায়ন করা হচ্ছে, যদিও এটি উত্তরাধিকারের মাধ্যমে চাইল্ডক্লাসের প্রেক্ষাপটে মূল্যায়ন করা হচ্ছে, তাই চাইল্ড ক্লাসের সদস্য পরিবর্তনশীল $ পরীক্ষাটি মূল্যায়ন করা হচ্ছে।

আমি ডকুমেন্টেশন পড়েছি, তবে এই সংজ্ঞার কোনও উল্লেখ দেখতে পাচ্ছে না। কেউ কি আমার জন্য কিছু আলোকপাত করতে পারে?


ডাব্লুটিএফ? কনস্ট্যান্ট ওভাররাইডিং !? এটা করো না! কখনই না!
qwert_ukg

4
নিবন্ধন করুন কারও উচিত পিএইচপি এর বিকাশকারীদের সাথে এটি যোগাযোগ করা উচিত। বা কমপক্ষে অনুমতি দিন final...
লুক সাউকজাক

4
ধ্রুবক ওভাররাইডের জন্যও যথেষ্ট ভাল ব্যবহারের ক্ষেত্রে নিশ্চিত রয়েছে:]
আরজিয়েল

উত্তর:


197

self::না উত্তরাধিকার-সচেতন হয় এবং সর্বদা বর্গ তাতে মৃত্যুদন্ড কার্যকর করা হচ্ছে উল্লেখ করে। আপনি php5.3 + আপনি চেষ্টা করতে পারে ব্যবহার করে থাকেন static::TESTযেমন static::উত্তরাধিকার খবর রাখেন।

পার্থক্যটি হ'ল static::"লেট স্ট্যাটিক বাইন্ডিং" ব্যবহার করে। এখানে আরও তথ্য সন্ধান করুন:

http://php.net/manual/en/language.oop5.late-static-bindings.php

এখানে আমি লিখেছি একটি সাধারণ পরীক্ষা স্ক্রিপ্ট:

<?php

class One
{
    const TEST = "test1";

    function test() { echo static::TEST; }
}
class Two extends One
{
    const TEST = "test2";
}

$c = new Two();

$c->test();

আউটপুট

test2

22
+ উল্লেখ করার জন্য static::
জেসন ম্যাকক্রিরি

অসাধারণ. স্পষ্টকরণের জন্য এবং লেট-স্ট্যাটিক-বাইন্ডিংগুলিতে অতিরিক্ত তথ্য সরবরাহ করার জন্য ধন্যবাদ (যা আমার এখনও হজম করতে হয়নি)।
টম অাগার

4
যেহেতু test()কোনও স্থিতিশীল পদ্ধতি নয়, তবে $this::TESTপিএইচপি 5.3 + দিয়ে কেন ব্যবহার হচ্ছে না ?
জেনোস

হাই @ জেনোস - উদাহরণটির লক্ষ্যটি দেখানো হয়েছিল যে প্রথম শ্রেণিতে চালিত ইনস্ট্যান্স-লেভেল কোডটি ক্লাস টু থেকে স্থিত মানগুলি পুনরুদ্ধার করছে। স্ব :: টেস্টটি "টেস্ট 1" ফিরে আসত যেখানে স্থিতিশীল :: টেস্ট প্রত্যাশিত "টেস্ট 2" ফেরত দেয় - আশা করি সহায়তা করে, জবাব দেওয়ার জন্য ধন্যবাদ!
ডেভিড ফারেল

হাই @ ডেভিডফেরেল - হ্যাঁ, আমি self::/ static::পার্থক্য পেয়েছি তবে কেন (না ) এর static::পরিবর্তে ব্যবহার করছি । তার মাঝে একটি পার্থক্য আছে কি এবং (যেহেতু তার মাঝে অন্যতম / এবং )? $this::self::$this::static::static::$this::self::
জেনোস

17

পিএইচপি-তে, স্ব বলতে বোঝায় যে শ্রেণিতে কল করা পদ্ধতি বা সম্পত্তি সংজ্ঞায়িত হয়েছে। সুতরাং আপনার ক্ষেত্রে আপনি কল selfকরছেন ChildClass, সুতরাং এটি class শ্রেণীর পরিবর্তনশীল ব্যবহার করে। তারপরে আপনি ব্যবহার selfকরেন ParentClass, সুতরাং এটি তখন that শ্রেণীর ভেরিয়েবলটি উল্লেখ করে।

যদি আপনি এখনও চান যে শিশু শ্রেণিটি পিতামত্তা শ্রেণীর উপরের ওভাররাইড করে const, তবে আপনার পিতামাতার ক্লাসে নিম্নলিখিত কোডটি এটিতে সামঞ্জস্য করুন:

public function showTest(){
    echo static::TEST;
    echo $this->test;
}

staticকীওয়ার্ডটি নোট করুন । এটি "লেট স্ট্যাটিক বাইন্ডিং" ব্যবহার করে। এখন আপনি প্যারেন্ট ক্লাস আপনার শিশু ক্লাসের কনস্টকে কল করবে।


প্রো। স্থিতিশীল :: স্ব-পরিবর্তে বিমূর্তে চাকরী করেছে ::
Błażej Krzakala
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.