আমি কীভাবে বর্ধিত পিএইচপি ক্লাসে স্থির কল থেকে ক্লাসের নাম পেতে পারি?


93

আমার দুটি ক্লাস রয়েছে: Actionএবং MyAction। দ্বিতীয়টি হিসাবে ঘোষণা করা হয়:

class MyAction extends Action {/* some methods here */}

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

Class Action {
 function n(){/* something */}
}

এবং আমি যখন এটি কল:

MyAction::n(); // it should return "MyAction"

তবে পিতামাত্ত শ্রেণীর প্রতিটি ঘোষণার কেবল প্যারেন্ট ক্লাস __CLASS__ভেরিয়েবলের অ্যাক্সেস থাকে , যার মান "অ্যাকশন" রয়েছে।

এটি করার কোনও সম্ভাব্য উপায় আছে?

উত্তর:


177

__CLASS__এটি সর্বদা ক্লাসের নামটি ব্যবহৃত হয়েছিল যেখানে এটি ব্যবহৃত হয়েছিল, তাই এটি কোনও স্থির পদ্ধতিতে খুব বেশি সহায়তা হয় না। পদ্ধতিটি স্থির না হলে আপনি কেবল get_class ($ এটি) ব্যবহার করতে পারবেন । যেমন

class Action {
    public function n(){
        echo get_class($this);
    }

}

class MyAction extends Action {

}

$foo=new MyAction;

$foo->n(); //displays 'MyAction'

বিলম্বিত স্ট্যাটিক বাইন্ডিংগুলি, পিএইচপি 5.3+ এ উপলব্ধ

এখন যে পিএইচপি 5.3 প্রকাশিত হয়েছে, আপনি দেরী স্ট্যাটিক বাইন্ডিং ব্যবহার করতে পারেন , যা আপনাকে সংজ্ঞায়িত করার পরিবর্তে রানটাইমে স্থির পদ্ধতি কলের জন্য লক্ষ্য শ্রেণীর সমাধান করতে দেয়।

বৈশিষ্ট্যটি আপনাকে যে ক্লাসের নামটি মাধ্যমে ডাকা হয়েছিল তা জানানোর জন্য একটি নতুন যাদু ধ্রুবকের পরিচয় দেয় না, এটি একটি নতুন ফাংশন দেয়, get_called_class () যা আপনাকে ক্লাসের নাম বলতে পারে একটি স্ট্যাটিক পদ্ধতি বলা হয়েছিল Here এখানে একটি উদাহরণ রয়েছে:

Class Action {
    public static function n() {
        return get_called_class();
    }
}


class MyAction extends Action {

}


echo MyAction::n(); //displays MyAction

ওপি-র একমাত্র সমস্যা হ'ল বৈশিষ্ট্যটি এখনও পাওয়া যায় নি। পিএইচপি 5.3 এখনও বিটাতে রয়েছে।
আয়নু জি স্টান

4
@ পল, ধন্যবাদ! আপনি সবেমাত্র আমার দিনটি বা ... এর সাথে রাত বাঁচিয়েছেন get_called_class():)
মেরেকি

4
আমি আশা করি কেউ আমাকে অনুরূপ সমস্যার সাথে সহায়তা করতে পারে । পিএইচপি স্ক্রিপ্ট new static();একটি ব্যক্তিগত স্ট্যাটিক পদ্ধতির (উইন্ডোজ এবং পিএইচপি> 5.5 তে এক্সএ্যাম্প্প ব্যবহার করে) ভিতরে থেকে নির্বাহের পরে নিঃশব্দে মারা যায় । :s
স্টাফেন

oo foo = নতুন MyAction; প্রতিধ্বনি get_class (oo foo); এটি মাইএকশনও প্রিন্ট করে।
সম্ময়

42

5.5 থেকে আপনি ক্লাস নেম রেজোলিউশনের জন্য কীওয়ার্ড ব্যবহারclass করতে পারেন যা ফাংশন কল করার চেয়ে অনেক দ্রুত হবে। ইন্টারফেসের সাথেও কাজ করে।

// C extends B extends A

static::class  // MyNamespace\ClassC when run in A
self::class    // MyNamespace\ClassA when run in A
parent::class  // MyNamespace\ClassB when run in C
MyClass::class // MyNamespace\MyClass

4
get_classএবং বিভিন্ন ফলাফল (কেস সংবেদনশীলতা) ফিরে আসতে ::class পারে । বিস্তারিত এখানে আছেন - stackoverflow.com/questions/34118725/...
আলেকজান্ডার Kucheryuk

16

এটি আদর্শ সমাধান নয়, তবে এটি পিএইচপি <5.3.0 এ কাজ করে।

কোডটি সেপ্টুরো ডটকম থেকে অনুলিপি করা হয়েছিল

if(!function_exists('get_called_class')) {
    class class_tools {
        static $i = 0;
        static $fl = null;

        static function get_called_class() {
            $bt = debug_backtrace();

            if (self::$fl == $bt[2]['file'].$bt[2]['line']) {
                self::$i++;
            } else {
                self::$i = 0;
                self::$fl = $bt[2]['file'].$bt[2]['line'];
            }

            $lines = file($bt[2]['file']);

            preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/',
                $lines[$bt[2]['line']-1],
                $matches);

            return $matches[1][self::$i];
        }
    }

    function get_called_class() {
        return class_tools::get_called_class();
    }
}


2
class MainSingleton { 
  private static $instances = array(); 
  private static function get_called_class() {
    $t = debug_backtrace();
    return $t[count($t)-1]["class"];
  }  

  public static function getInstance() { 
    $class = self::get_called_class();
    if(!isset(self::$instances[$class]) ) { 
      self::$instances[$class] = new $class; 
    } 
    return self::$instances[$class]; 
  } 

}

class Singleton extends MainSingleton { 
  public static function getInstance()
  {
    return parent::getInstance();
  }     
  protected function __construct() { 
    echo "A". PHP_EOL; 
  } 

  protected function __clone() {} 

  public function test() { 
    echo " * test called * "; 
  } 
} 

Singleton::getInstance()->test(); 
Singleton::getInstance()->test();

0

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


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