আমি পিএইচপি-তে 1 টিরও বেশি শ্রেণি ব্যবহার করে কোনও শ্রেণি বাড়িয়ে দিতে পারি?


150

আমার যদি প্রয়োজন এমন ফাংশনগুলির সাথে আমার বেশ কয়েকটি ক্লাস থাকে তবে সংস্থার জন্য আলাদাভাবে সঞ্চয় করতে চাই তবে আমি কি উভয় ক্লাসের জন্য একটি শ্রেণি বাড়িয়ে দিতে পারি?

অর্থাত class a extends b extends c

সম্পাদনা করুন: আমি জানি কীভাবে একসাথে এক ক্লাস প্রসারিত করা যায় তবে আমি একাধিক বেস ক্লাস ব্যবহার করে তাত্ক্ষণিকভাবে কোনও শ্রেণি প্রসারিত করার জন্য একটি পদ্ধতি খুঁজছি - আফ্রিক আপনি পিএইচপি তে এটি করতে পারবেন না তবে আশ্রয় না নিয়ে তার চারপাশে উপায় থাকতে হবে class c extends b,class b extends a


সমষ্টি বা ইন্টারফেস ব্যবহার করুন। একাধিক উত্তরাধিকার পিএইচপি-তে বিদ্যমান নেই।
ফ্রাঙ্ক

2
আমি ইন্টারফেসের দিকে তাকাচ্ছি কারণ আমি বড় শ্রেণির শ্রেণিবিন্যাসের কোনও বড় অনুরাগী নই। কিন্তু আমি দেখতে পাচ্ছি না কীভাবে ইন্টারফেসগুলি আসলে কিছু করে?
পরমাণুশ্রী

ইন্টারফেসগুলি আপনাকে কেবল এপিআইকে "উত্তরাধিকারী" করতে সক্ষম করে, ফাংশন বডি নয়। এটি ক্লাস এটিকে ইন্টারফেস বি এবং সি থেকে পদ্ধতিগুলি প্রয়োগ করতে বাধ্য করে। এর অর্থ হ'ল যদি আপনি আচরণের উত্তরাধিকারী হতে চান তবে আপনাকে অবশ্যই আপনার ক্লাস এ এবং গ এর ক্লাসের সদস্য পদগুলি একত্রিত করতে হবে।
ফ্রাঙ্ক


2
বৈশিষ্ট্যগুলি সঠিক উত্তর হিসাবে বিবেচনা করুন।
ড্যানিয়েল

উত্তর:


170

আপনার সম্পাদনার উত্তর:

আপনি যদি সত্যিই একাধিক উত্তরাধিকার নকল করতে চান তবে আপনি যাদু ফাংশন __call () ব্যবহার করতে পারেন।

এটি অশুভ হলেও এটি ক্লাস এ এর ​​ব্যবহারকারীর দৃষ্টিকোণ থেকে কাজ করে:

class B {
    public function method_from_b($s) {
        echo $s;
    }
}

class C {
    public function method_from_c($s) {
        echo $s;
    }
}

class A extends B
{
  private $c;

  public function __construct()
  {
    $this->c = new C;
  }

  // fake "extends C" using magic function
  public function __call($method, $args)
  {
    $this->c->$method($args[0]);
  }
}


$a = new A;
$a->method_from_b("abc");
$a->method_from_c("def");

"Abcdef" মুদ্রণ


1
আমি আসলে ক্লাসটি বাড়ানোর ধারণার মতোই এটির মতো করার কি কোনও সীমাবদ্ধতা আছে?
পরমাণুশ্রী

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

64
আপনি সুরক্ষিত বা ব্যক্তিগত পদ্ধতি ব্যবহার করতে পারবেন না।
ওয়ার্মহিত

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

2
এটি প্রয়োগকারীদের পক্ষে কাজ করবে না, যা পদ্ধতিটি প্রকৃতপক্ষে উপস্থিত হওয়ার প্রত্যাশা করে এবং একাধিক বেস শ্রেণীর একই নামের পদ্ধতি থাকলে আচরণটি অনেকটাই অপরিবর্তিত। এটি আপনাকে ইঙ্গিত দেওয়ার জন্য আপনার সম্পাদকের দক্ষতায়ও বিশৃঙ্খলা সৃষ্টি করবে।
এরিক

138

আপনার কাছে এমন কোনও ক্লাস থাকতে পারে না যা দুটি বেস ক্লাস প্রসারিত করে। আপনি না পারে।

// this is NOT allowed (for all you google speeders)
Matron extends Nurse, HumanEntity

তবে আপনার নিম্নরূপে একটি শ্রেণিবিন্যাস থাকতে পারে ...

Matron extends Nurse    
Consultant extends Doctor

Nurse extends HumanEntity
Doctor extends HumanEntity

HumanEntity extends DatabaseTable
DatabaseTable extends AbstractTable

ইত্যাদি।


আপনি কী ব্যাখ্যা করতে পারেন যে প্রথমে নার্সকে ম্যাট্রনে উত্তরাধিকারী করা ঠিক হবে, তারপরে হিউম্যানএন্টিটির উত্তরাধিকারকে নার্স হিসাবে ঘোষণা করা কেন?
কিওয়ার্টি

7
@ কিওয়ার্টি কারণ ম্যাট্রনের একটি নার্সের অতিরিক্ত গুণাবলীর উপস্থিতি রয়েছে, অন্যদিকে একজন নার্সের মতো মানুষের সমস্ত গুণ রয়েছে। অতএব, ম্যাট্রন হলেন একজন মানব নার্স এবং শেষ পর্যন্ত
ম্যাট্রোন

58

আপনি বৈশিষ্ট্য ব্যবহার করতে পারেন, যা আশা করি, পিএইচপি 5.4 থেকে উপলব্ধ হবে।

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

তারা আরও ভাল রচনা এবং পুনরায় ব্যবহারের ক্ষেত্রে তাদের সম্ভাবনার জন্য স্বীকৃত, অতএব পার্ল 6, স্কেক, স্কেলা, স্লেট এবং ফোর্ট্রেসের মতো ভাষার নতুন সংস্করণগুলিতে তাদের সংহতকরণ। বৈশিষ্ট্যগুলি জাভা এবং সি # তে পোর্ট করা হয়েছে।

আরও তথ্য: https://wiki.php.net/rfc/traits


সেগুলি অপব্যবহার না করার বিষয়টি নিশ্চিত করুন। মূলত এগুলি হ'ল স্থায়ী ফাংশন যা আপনি অবজেক্টে প্রয়োগ করেন। আপনি তাদের আপত্তিজনকভাবে কোনও গণ্ডগোল তৈরি করতে পারেন।
নিকোলা পেটকানস্কি

2
আমি বিশ্বাস করতে পারি না এটি নির্বাচিত উত্তর নয়।
ড্যানিয়েল

18

ক্লাসগুলি কেবল পদ্ধতির সংগ্রহ নয়। একটি শ্রেণীর একটি বিমূর্ত ধারণা উপস্থাপন করার কথা রয়েছে, উভয় রাষ্ট্র (ক্ষেত্র) এবং আচরণ (পদ্ধতি) যা রাষ্ট্র পরিবর্তন করে। খারাপ ওও ডিজাইনের মতো কিছু পছন্দসই আচরণের শব্দ পাওয়ার জন্য উত্তরাধিকার ব্যবহার করা এবং অনেকগুলি ভাষা একাধিক উত্তরাধিকারকে অস্বীকার করার ঠিক কারণ: "স্প্যাগেটি উত্তরাধিকার" রোধ করার জন্য, অর্থাত্ 3 টি শ্রেণি প্রসারিত করা কারণ প্রত্যেকটির একটি পদ্ধতি আপনার প্রয়োজন রয়েছে এবং এটি শেষ হয় ing এমন একটি শ্রেণি যা 100 পদ্ধতি এবং 20 টি ক্ষেত্রের উত্তরাধিকার সূত্রে প্রাপ্ত, তবুও কেবল তাদের মধ্যে 5 টি ব্যবহার করে।


1
আমি আপনাদের এই দৃ with় প্রতিবেদনের সাথে বিষয়টি গ্রহণ করব যে ওপি-র অনুরোধটি "খারাপ ওও ডিজাইন" গঠন করে ; কেবল অবস্থানটি সমর্থন করার জন্য মিক্সিন্সের উত্থানের দিকে তাকান যে একাধিক উত্স থেকে কোনও শ্রেণিতে পদ্ধতিতে যুক্ত করা স্থপতিগতভাবে একটি ভাল ধারণা। তবে আমি আপনাকে দেব যে পিএইচপি একটি অনুকূল "ডিজাইন" অর্জনের জন্য ভাষার বৈশিষ্ট্যগুলির একটি সর্বোত্তম সেট সরবরাহ করে না তবে এর অর্থ এই নয় যে আনুমানিকভাবে উপলব্ধ বৈশিষ্ট্যগুলি ব্যবহার করা এটি অগত্যা একটি খারাপ ধারণা; শুধু @ ফ্রাঙ্ক এর উত্তর দেখুন।
মাইকচিন্কেল

15

শিগগিরই মিক্স-ইনগুলি যুক্ত করার পরিকল্পনা রয়েছে, আমি বিশ্বাস করি।

তবে ততক্ষণ পর্যন্ত, গৃহীত উত্তর সহ যান। আপনি "বিস্তৃত" শ্রেণি তৈরি করতে কিছুটা বিমূর্ত করতে পারেন:

class Extendable{
  private $extender=array();

  public function addExtender(Extender $obj){
    $this->extenders[] = $obj;
    $obj->setExtendee($this);
  }

  public function __call($name, $params){
    foreach($this->extenders as $extender){
       //do reflection to see if extender has this method with this argument count
       if (method_exists($extender, $name)){
          return call_user_func_array(array($extender, $name), $params);
       }
    }
  }
}


$foo = new Extendable();
$foo->addExtender(new OtherClass());
$foo->other_class_method();

মনে রাখবেন যে এই মডেলটিতে "অন্যান্যক্লাস" $ foo সম্পর্কে 'জান' gets অন্যান্য সম্পর্কটি স্থাপনের জন্য "সেটএক্সটেন্ডি" নামে একটি সার্বজনিক ফাংশন থাকা দরকার। তারপরে, যদি এর পদ্ধতিগুলি $ foo থেকে আহ্বান করা হয় তবে এটি অভ্যন্তরীণভাবে access foo এ অ্যাক্সেস করতে পারে। তবে এটি কোনও প্রাইভেট / সুরক্ষিত পদ্ধতি / ভেরিয়েবলগুলিতে বাস্তব বর্ধিত শ্রেণীর অ্যাক্সেস পাবে না।


12

বেস ক্লাস হিসাবে বৈশিষ্ট্য ব্যবহার করুন। তারপরে তাদের প্যারেন্ট ক্লাসে ব্যবহার করুন। এটি প্রসারিত করুন।

trait business{
  function sell(){

  }

  function buy(){

  }

  function collectMoney(){
  }

}

trait human{

   function think(){

   }

   function speak(){

   }

}

class BusinessPerson{
  use business;
  use human;
  // If you have more traits bring more
}


class BusinessWoman extends BusinessPerson{

   function getPregnant(){

   }

}


$bw = new BusinessWoman();
$bw ->speak();
$bw->getPregnant();

এখন দেখুন ব্যবসায়িক মহিলা যৌক্তিকভাবে উত্তরাধিকার সূত্রে প্রাপ্ত ব্যবসায় এবং মানব উভয়ই;


আমি পিএইচপি 5.3 এর সাথে আটকে আছি কোন বৈশিষ্ট্য সমর্থন নেই: ডি
নিশ্চল গৌতম

এর BusinessWomanপরিবর্তে বৈশিষ্ট্যটি ব্যবহার করবেন না কেন BusinessPerson? তারপরে আপনি প্রকৃত বহু-উত্তরাধিকার পেতে পারেন।
সাফ

@ সফট, কারণ বিজনেসম্যান এটিও প্রসারিত করতে পারে। যেহেতু যে কেউ ব্যবসা করছে সে ব্যাসাইন ব্যক্তিকে প্রসারিত করতে পারে এবং স্বয়ংক্রিয়ভাবে বৈশিষ্ট্য পেতে পারে
অ্যালিস

আপনি যেভাবে এটি করছেন তা একক উত্তরাধিকারে কী সম্ভব তা থেকে কোনও পার্থক্য নেই যেখানে বিজনেসপারসন মানব নামে একটি বিমূর্ত শ্রেণি প্রসারিত করে। আমার বক্তব্যটি হ'ল আপনার উদাহরণটির পক্ষে বহু অধিকারের দরকার নেই।
সফট

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

9
<?php
// what if we want to extend more than one class?

abstract class ExtensionBridge
{
    // array containing all the extended classes
    private $_exts = array();
    public $_this;

    function __construct() {$_this = $this;}

    public function addExt($object)
    {
        $this->_exts[]=$object;
    }

    public function __get($varname)
    {
        foreach($this->_exts as $ext)
        {
            if(property_exists($ext,$varname))
            return $ext->$varname;
        }
    }

    public function __call($method,$args)
    {
        foreach($this->_exts as $ext)
        {
            if(method_exists($ext,$method))
            return call_user_method_array($method,$ext,$args);
        }
        throw new Exception("This Method {$method} doesn't exists");
    }


}

class Ext1
{
    private $name="";
    private $id="";
    public function setID($id){$this->id = $id;}
    public function setName($name){$this->name = $name;}
    public function getID(){return $this->id;}
    public function getName(){return $this->name;}
}

class Ext2
{
    private $address="";
    private $country="";
    public function setAddress($address){$this->address = $address;}
    public function setCountry($country){$this->country = $country;}
    public function getAddress(){return $this->address;}
    public function getCountry(){return $this->country;}
}

class Extender extends ExtensionBridge
{
    function __construct()
    {
        parent::addExt(new Ext1());
        parent::addExt(new Ext2());
    }

    public function __toString()
    {
        return $this->getName().', from: '.$this->getCountry();
    }
}

$o = new Extender();
$o->setName("Mahdi");
$o->setCountry("Al-Ahwaz");
echo $o;
?>

4
আপনার উত্তরে আপনার কোডের ব্যাখ্যা এবং এটি কীভাবে সমস্যার সমাধান করে তার একটি বিবরণ থাকতে হবে।
AbcAeffchen

1
এটি প্রায় স্ব-বর্ণনামূলক, তবে কোডটি সহ মন্তব্য করা ভাল হবে।
হেরোসেলহিম

এখন যদি Ext1 এবং Ext2 উভয়ের একই নাম সহ একটি ফাংশন থাকে সর্বদা Ext1 cwill বলা হয়, এটি মোটামুটি পরামিতিগুলির উপর নির্ভর করবে না।
এলিস

8

@ ফ্র্যাঙ্কের বর্তমানে গৃহীত উত্তরগুলি কাজ করবে তবে বাস্তবে এটি একাধিক উত্তরাধিকার নয় বরং সুযোগের বাইরে নির্ধারিত শ্রেণীর একটি শিশু উদাহরণ, এখানেও সংক্ষিপ্ততা রয়েছে __call()- $this->childInstance->method(args)"বর্ধিত" শ্রেণিতে আপনার যে কোনও জায়গাতেই বহিরাগতের ক্লাস পদ্ধতিটি প্রয়োজন কেবল ব্যবহার করার বিষয়ে বিবেচনা করুন ।

সঠিক উত্তর

কীওয়ার্ডের ম্যানুয়ালextends অনুসারে আপনি যথাক্রমে সত্যই তা করতে পারবেন না :

বর্ধিত শ্রেণি সর্বদা একক বেস শ্রেণীর উপর নির্ভরশীল, একাধিক উত্তরাধিকার সমর্থিত নয়।

আসল উত্তর

তবে @ অ্যাডাম সঠিকভাবে প্রস্তাবিত হিসাবে এটি আপনাকে একাধিক স্তরক্রমিক উত্তরাধিকার ব্যবহার করতে নিষেধ করে না।

আপনি একটি শ্রেণি প্রসারিত করতে পারেন, অন্য সাথে অন্য এবং অন্য সাথে আরও অনেক কিছু ...

এ সম্পর্কে খুব সহজ উদাহরণ হতে হবে:

class firstInheritance{}
class secondInheritance extends firstInheritance{}
class someFinalClass extends secondInheritance{}
//...and so on...

গুরুত্বপূর্ণ তথ্য

যেমন আপনি লক্ষ্য করেছেন, প্রক্রিয়াটিতে অন্তর্ভুক্ত সমস্ত শ্রেণীর উপর যদি আপনার নিয়ন্ত্রণ থাকে তবে আপনি কেবল শ্রেণিবিন্যাসের মাধ্যমে একাধিক (2+) ইন্টিরিটেন্স করতে পারেন - এর অর্থ, আপনি এই সমাধানটি প্রয়োগ করতে পারবেন না যেমন বিল্ট-ইন ক্লাস সহ বা ক্লাসগুলির সাথে আপনি কেবল সম্পাদনা করতে পারবেন না - আপনি যদি এটি করতে চান তবে আপনার @ ফ্র্যাঙ্ক সমাধান - সন্তানের দৃষ্টান্তগুলি রেখে যায়।

... এবং শেষ পর্যন্ত কিছু আউটপুট সহ উদাহরণ:

class A{
  function a_hi(){
    echo "I am a of A".PHP_EOL."<br>".PHP_EOL;  
  }
}

class B extends A{
  function b_hi(){
    echo "I am b of B".PHP_EOL."<br>".PHP_EOL;  
  }
}

class C extends B{
  function c_hi(){
    echo "I am c of C".PHP_EOL."<br>".PHP_EOL;  
  }
}

$myTestInstance = new C();

$myTestInstance->a_hi();
$myTestInstance->b_hi();
$myTestInstance->c_hi();

কোন ফলাফল

I am a of A 
I am b of B 
I am c of C 

6

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

class C
{
    private $a, $b;

    public function __construct($x, $y)
    {
        $this->a = new A(42, $x);
        $this->b = new B($y);
    }

    protected function DoSomething()
    {
        $this->a->Act();
        $this->b->Do();
    }
}

এটি কার্যকরভাবে ফ্রাঙ্ক এবং স্যাম যে একই জিনিস দেখায়। অবশ্যই যদি আপনি স্পষ্টভাবে রচনা ব্যবহার করতে পছন্দ করেন তবে আপনার নির্ভরতা ইঞ্জেকশনটি ব্যবহার করা উচিত ।
মাইকস্কিঙ্কেল

3

একাধিক উত্তরাধিকার ইন্টারফেস স্তরে কাজ করছে বলে মনে হচ্ছে। আমি পিএইচপি 5.6.1 এ একটি পরীক্ষা করেছি।

এখানে একটি কার্যকারী কোড:

<?php


interface Animal
{
    public function sayHello();
}


interface HairyThing
{
    public function plush();
}

interface Dog extends Animal, HairyThing
{
    public function bark();
}


class Puppy implements Dog
{
    public function bark()
    {
        echo "ouaf";
    }

    public function sayHello()
    {
        echo "hello";
    }

    public function plush()
    {
        echo "plush";
    }


}


echo PHP_VERSION; // 5.6.1
$o = new Puppy();
$o->bark();
$o->plush();
$o->sayHello(); // displays: 5.6.16ouafplushhello

আমি এটি সম্ভব বলে মনে করি নি, তবে আমি সুইফট মেলারের উত্স কোডটিতে, সুইফট ট্রান্সপোর্ট_আইওবাফার ক্লাসে হোঁচট খেয়েছি, যার নিম্নলিখিত সংজ্ঞা রয়েছে:

interface Swift_Transport_IoBuffer extends Swift_InputByteStream, Swift_OutputByteStream

আমি এখনও এটি নিয়ে খেলিনি, তবে আমি ভেবেছিলাম এটি ভাগ করে নেওয়া আকর্ষণীয় হতে পারে।


1
আকর্ষণীয় এবং অপ্রাসঙ্গিক।
ইয়েভেগেনি আফানসিয়েভ

1

আমি এইমাত্র আমার "একাধিক উত্তরাধিকার" সমস্যাটি এর সাথে সমাধান করেছি:

class Session {
    public $username;
}

class MyServiceResponsetype {
    protected $only_avaliable_in_response;
}

class SessionResponse extends MyServiceResponsetype {
    /** has shared $only_avaliable_in_response */

    public $session;

    public function __construct(Session $session) {
      $this->session = $session;
    }

}

এইভাবে আমার একটি সেশনরেসপোনসের অভ্যন্তরে সেশনটি পরিচালনা করার ক্ষমতা আছে যা মাই সার্ভিসেসারসপোনসিপকে প্রসারিত করে নিজেই সেশন পরিচালনা করতে সক্ষম।


1

আপনি যদি কোনও ফাংশনটি সর্বজনীন হয় কিনা তা পরীক্ষা করতে চান তবে এই বিষয়টি দেখুন: https://stackoverflow.com/a/4160928/2226755

এবং অনেকগুলি বা না আর্গুমেন্টের জন্য কল_উজার_ফুনক_আরয়ে (...) পদ্ধতি ব্যবহার করুন।

এটার মত :

class B {
    public function method_from_b($s) {
        echo $s;
    }
}

class C {
    public function method_from_c($l, $l1, $l2) {
        echo $l.$l1.$l2;
    }
}

class A extends B {
    private $c;

    public function __construct() {
        $this->c = new C;
    }

    public function __call($method, $args) {
        if (method_exists($this->c, $method)) {
            $reflection = new ReflectionMethod($this->c, $method);
            if (!$reflection->isPublic()) {
                throw new RuntimeException("Call to not public method ".get_class($this)."::$method()");
            }

            return call_user_func_array(array($this->c, $method), $args);
        } else {
            throw new RuntimeException("Call to undefined method ".get_class($this)."::$method()");
        }
    }
}


$a = new A;
$a->method_from_b("abc");
$a->method_from_c("d", "e", "f");

1

পিএইচপি 5.4 হিসাবে ঘোষিত পিএইচপিতে বৈশিষ্ট্যগুলি ব্যবহার করে আপনি এটি করতে সক্ষম হন

এখানে আপনার জন্য একটি দ্রুত টিউটোরিয়াল, http://culttt.com/2014/06/25/php-traits/


0

পিএইচপি এখনও একাধিক শ্রেণীর উত্তরাধিকার সমর্থন করে না, তবে এটি একাধিক ইন্টারফেস উত্তরাধিকারকে সমর্থন করে।

কিছু উদাহরণের জন্য http://www.hudzilla.org/php/6_17_0.php দেখুন ।


এখনো? আমি সন্দেহ করি তারা এটা করবে। আধুনিক ওও একাধিক উত্তরাধিকারকে নিরুৎসাহিত করে, এটি অগোছালো হতে পারে।
ফিলোহো

0

পিএইচপি একাধিক উত্তরাধিকারের অনুমতি দেয় না, তবে আপনি একাধিক ইন্টারফেস প্রয়োগ করতে পারেন। যদি প্রয়োগটি "ভারী" হয় তবে একটি পৃথক শ্রেণীর প্রতিটি ইন্টারফেসের জন্য কঙ্কালের বাস্তবায়ন সরবরাহ করুন । তারপরে আপনি এই কঙ্কালের বাস্তবায়নের জন্য অবজেক্ট কনটেন্টের মাধ্যমে সমস্ত ইন্টারফেস শ্রেণি নির্ধারণ করতে পারেন ।


0

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


0

সর্বদা ভাল ধারণা হ'ল ফাংশন সহ পিতামাতাকে ক্লাস করা ... অর্থাত্ প্যারেন্টে এই সমস্ত কার্যকারিতা যুক্ত করুন।

এবং এই শ্রেণিবদ্ধভাবে নীচে ব্যবহৃত সমস্ত শ্রেণীর "সরান"। আমার দরকার - ফাংশনগুলি পুনরায় লিখুন, যা নির্দিষ্ট।


0

প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে পিএইচপি-র অন্যতম সমস্যা হ'ল আপনার একক উত্তরাধিকার থাকতে পারে have এর অর্থ একটি শ্রেণি কেবলমাত্র অন্য শ্রেণীর কাছ থেকে উত্তরাধিকারী হতে পারে।

তবে অনেক সময় একাধিক ক্লাস থেকে উত্তরাধিকারী হওয়া উপকারী হবে। উদাহরণস্বরূপ, কোড অনুলিপি প্রতিরোধের জন্য বিভিন্ন শ্রেণীর কয়েকটি থেকে পদ্ধতি উত্তরাধিকারী হওয়া বাঞ্ছনীয়।

এই সমস্যাটি এমন বর্গের দিকে পরিচালিত করতে পারে যার উত্তরাধিকারের দীর্ঘকালীন পারিবারিক ইতিহাস রয়েছে যা প্রায়শই তা বোঝায় না।

পিএইচপি 5.4 এ ভাষার একটি নতুন বৈশিষ্ট্য বৈশিষ্ট্য হিসাবে পরিচিত যুক্ত করা হয়েছিল। একটি বৈশিষ্ট্য হ'ল মিক্সিনের মতো এটি এটি আপনাকে বিদ্যমান ক্লাসে ট্রেইট ক্লাসগুলি মিশ্রিত করতে দেয়। এর অর্থ আপনি একাধিক উত্তরাধিকারের সমস্যাগুলি এড়ানো অবস্থায় কোডের সদৃশতা হ্রাস করতে এবং সুবিধা পেতে পারেন।

বৈশিষ্ট


-1

এটি আসল উত্তর নয়, আমাদের নকল ক্লাস রয়েছে

...কিন্তু এটি কাজ করে :)

class A {
    //do some things
}

class B {
    //do some things
}

ক্লাস কপি_বি হ'ল সমস্ত ক্লাস বি

class copy_B extends A {

    //do some things (copy class B)
}

class A_B extends copy_B{}

এখন

class C_A extends A{}
class C_B extends B{}
class C_A_b extends A_B{}  //extends A & B

-3

ক্লাস এ বি {s প্রসারিত

ক্লাস বি C {s প্রসারিত

তারপরে এ বি এবং সি উভয় প্রসারিত করেছে


2
@rostamiani কারণ এই পদ্ধতিটি ক্লাসে পরিবর্তনও করছে B। আমরা কি অধিকাংশ সময় চান দুই সম্পর্কহীন ক্লাস আছে হয় Bএবং C(সম্ভবত বিভিন্ন লাইব্রেরি থেকে) এবং একই দ্বারা উত্তরাধিকারসূত্রে পাওয়া A, যেমন যে Aউভয় থেকে সবকিছু ধারণ করে Bএবং Cকিন্তু Bথেকে কিছু ধারণ করে না Cবিপরীতভাবে এবং ভাইস।
সাফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.