পিএইচপি তে পিতামাতার পদ্ধতি কল করার একাধিক উপায়


90

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

এখন আমি ভাবছি পদ্ধতিটি ( parentবা মাধ্যমে) কল করার কোনও পছন্দসই উপায় (অর্থাত্ সর্বোত্তম অনুশীলন) আছে thisকিনা এবং এই একই কোডটি কার্যকর করার জন্য সত্যই একইরকম উপায় কিনা, বা যদি ওভার ব্যবহারের সময় কোনও সতর্কতা রয়েছে কিনা অন্যটি.

দুঃখিত, আমি সম্ভবত এই চিন্তা শেষ।

abstract class Animal {

    function get_species() {

        echo "test";

    }

}

class Dog extends Animal {

    function __construct(){

        $this->get_species();
        parent::get_species();

    }

}

$spike = new Dog;

উত্তর:


120

এখানে তিনটি পরিস্থিতি রয়েছে (যা আমি ভাবতে পারি) যেখানে আপনি সাবক্লাসে এমন কোনও পদ্ধতি কল করবেন যেখানে প্যারেন্ট ক্লাসে পদ্ধতিটি প্রস্থান করে:

  1. পদ্ধতিটি সাবক্লাস দ্বারা ওভাররাইট করা হয় না, কেবল প্যারেন্টে বিদ্যমান।

    এটি আপনার উদাহরণের মতো একই, এবং সাধারণত এটি ব্যবহার করা ভাল $this -> get_species(); You আপনি ঠিক বলেছেন যে এই ক্ষেত্রে দুটি কার্যকরভাবে একই the $thisউত্তরাধিকার সূত্রে প্রাপ্ত পদ্ধতি এবং স্থানীয়ভাবে ঘোষিত পদ্ধতিগুলির মধ্যে আপনি সামঞ্জস্য থাকা ব্যবহার করে।

  2. পদ্ধতিটি সাবক্লাস দ্বারা ওভাররাইট করা হয়েছে এবং পিতা-মাতার কাছ থেকে সম্পূর্ণ অনন্য যুক্তি রয়েছে।

    এই ক্ষেত্রে, আপনি অবশ্যই ব্যবহার $this -> get_species();করতে চাইবেন কারণ আপনি পদ্ধতির পিতামাতার সংস্করণটি কার্যকর করতে চান না। আবার, ধারাবাহিকভাবে ব্যবহার করে $this, আপনাকে এই ক্ষেত্রে এবং প্রথমটির মধ্যে পার্থক্য সম্পর্কে চিন্তা করার দরকার নেই।

  3. পিতামাত পদ্ধতিটি কী অর্জন করে তার সাথে যোগ করে পদ্ধতিটি পিতামাতার ক্লাসকে প্রসারিত করে।

    এই ক্ষেত্রে, `$this -> get_species();সাবক্লাসের অন্যান্য পদ্ধতি থেকে পদ্ধতিটি কল করার সময় আপনি এখনও ব্যবহার করতে চান । আপনি যে জায়গাতে পিতামাতাকে কল করবেন সেই স্থানটি পিতামাতার পদ্ধতিটি ওভাররাইট করা পদ্ধতি থেকে হবে। উদাহরণ:

    abstract class Animal {
    
        function get_species() {
    
            echo "I am an animal.";
    
        }
    
     }
    
     class Dog extends Animal {
    
         function __construct(){
    
             $this->get_species();
         }
    
         function get_species(){
    
             parent::get_species();
             echo "More specifically, I am a dog.";
         }
    }
    

ওভাররাইডিং পদ্ধতির বাইরে আপনাকে পিতামাতার পদ্ধতিটি সরাসরি কল করার প্রয়োজন হবে এমন একমাত্র দৃশ্যটি যদি তারা দুটি পৃথক কাজ করে এবং আপনি জানতেন যে আপনার স্থানীয় না হয়ে পদ্ধতিটির পিতামাতার সংস্করণ প্রয়োজন। এটি হওয়া উচিত নয়, তবে এটি উপস্থিত থাকলে, এর কাছে যাওয়ার পরিষ্কার উপায় get_parentSpecies()হ'ল নাম সহ একটি নতুন পদ্ধতি তৈরি করা যেখানে এটি যা করে সেটিকে অভিভাবক পদ্ধতি বলা হয়:

function get_parentSpecies(){

     parent::get_species();
}

আবার, এটি প্যারেন্ট পদ্ধতির উপর নির্ভর না করে স্থানীয় পদ্ধতিতে পরিবর্তন / পরিবর্তনের জন্য সমস্ত কিছুকে সুন্দর এবং সামঞ্জস্যপূর্ণ রাখে।


"প্রসারিত" না করে কীভাবে করব? যেমন আমার "ক্লাস" শ্রেণীর ভিতরে কিছু ক্লাস "লেগ" আছে তবে আমার পিতামাতার "মানবিক" কার্যকারিতাটির দরকার নেই বলে আমার এটি প্রসারিত করার দরকার নেই। এখন, আমি যদি একটি $leg = new leg()অভ্যন্তর তৈরি করে থাকি, তবে আমি humanকোনও লেগের উদাহরণ থেকে কীভাবে মানুষের ক্রিয়াকলাপগুলি কল করব $leg?
ব্যবহারকারী 151496

@ user151496 একটি পা মানুষের একটি উপশ্রেণী নয়। মানুষের অনেক পা থাকে তবে পা একটি ধরণের মানুষের নয়। অতএব আপনার এমন এক শ্রেণীর পা থাকা উচিত নয় যা মানুষের কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়, কারণ একটি পা একজন মানুষ নয়।
বিটল

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

4
পাইমায়িম নেকুডোটাইম কিছুটা বিভ্রান্তিকর। প্রথম নজরে দেখে মনে হচ্ছে আপনি কোনও স্থির পদ্ধতিতে কল করছেন। এটা তোলে parent- হয়েছে উচিত থাকেন> get_species () পরিবর্তে
peterchaula

রাজি। স্ট্যাটিক কলগুলি অনেক ক্ষেত্রেই বিভ্রান্তিকর। আমার এটি এক পর্যায়ে আপডেট করা উচিত।
অ্যান্টনি

5

আমি যদি প্রশ্নটি ভুল না বুঝি তবে আমি প্রায় সর্বদা ব্যবহার করব $ এটি-> get_species কারণ সাবক্লাস (এই ক্ষেত্রে কুকুর) সেই পদ্ধতিটি ওভাররাইট করতে পারে যেহেতু এটি প্রসারিত করে না। ক্লাস কুকুর যদি পদ্ধতিটিকে নতুনভাবে সংজ্ঞায়িত না করে তবে উভয় উপায় কার্যত সমান হবে তবে ভবিষ্যতে যদি আপনি কোনও সময় সিদ্ধান্ত নেন যে কুকুরের get_species পদ্ধতিটি "কুকুর" মুদ্রণ করা উচিত তবে আপনাকে সমস্ত কোডের মধ্যে দিয়ে ফিরে যেতে হবে এবং ইহা পরিবর্তন করুন.

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


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