একটি স্ট্রিং দিয়ে পিএইচপি শ্রেণীর উদাহরণ তৈরি করছে


223

আমার দুটি ক্লাস আছে, class ClassOne { }এবং class ClassTwo {}। আমি একটি স্ট্রিং পাচ্ছি যা হতে পারে "One"বা হতে পারে "Two"

দীর্ঘ switchবিবৃতি ব্যবহারের পরিবর্তে যেমন:

switch ($str) {
    case "One":
        return new ClassOne();
    case "Two":
        return new ClassTwo();
}

আমি স্ট্রিং ব্যবহার করে উদাহরণ তৈরি করতে পারি এমন কোন উপায় আছে, মানে new Class("Class" . $str);?

উত্তর:


484

হ্যা, তুমি পারো!

$str = 'One';
$class = 'Class'.$str;
$object = new $class();

নেমস্পেসগুলি ব্যবহার করার সময়, সম্পূর্ণরূপে যোগ্যতাসম্পন্ন নাম সরবরাহ করুন :

$class = '\Foo\Bar\MyClass'; 
$instance = new $class();

আপনি পিএইচপি করতে পারেন এমন অন্যান্য দুর্দান্ত জিনিস হ'ল:
পরিবর্তনশীল ভেরিয়েবল :

$personCount = 123;
$varname = 'personCount';
echo $$varname; // echo's 123

এবং পরিবর্তনশীল ফাংশন এবং পদ্ধতি।

$func = 'my_function';
$func('param1'); // calls my_function('param1');

$method = 'doStuff';
$object = new MyClass();
$object->$method(); // calls the MyClass->doStuff() method. 

1
উদাহরণের জন্য ধন্যবাদ!
জোয়েল

28
এফওয়াইআই, আপনি আংশিকভাবে কোনও ভেরিয়েবল ব্যবহার করতে পারবেন না। যেমন। $my_obj = Package\$class_name();। পরিবর্তে আপনাকে করতে হবে$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
বিড়লা

14
নেমস্পেসগুলি ব্যবহার করার সময় দয়া করে নোট করুন, আপনাকে অবশ্যই পুরো পথ সরবরাহ করতে হবে:$className = '\Foo\Bar\MyClass'; $instance = new $className();
জিল বার্কার

5
চামচ নেই ... কেবল পিএইচপি।
ক্যাপ্টেন হাইপারটেক্সট

4
তবে একটি প্রশ্ন উপরে বর্ণিত পদ্ধতিটি একটি নতুন শ্রেণীর উদাহরণ তৈরি করতে ব্যবহার করা যেতে পারে। আমি যদি বিদ্যমান ক্লাসের কোনও পদ্ধতিকে স্থিতিকর কল করতে চাই তবে কী হবে? আমি নিম্নলিখিত হিসাবে চেষ্টা করেছি: শ্রেণীর স্ট্রিং যুক্ত ভেরিয়েবলটি $model = $user_model::find()->All(); কোথায় $user_modelডাকা হচ্ছে
রমেশ পরিক

22

নতুন ক্লাস তৈরি করতে আপনি কেবল নিম্নলিখিত সিনট্যাক্সটি ব্যবহার করতে পারেন (আপনি যদি কারখানা তৈরি করছেন তবে এটি কার্যকর ):

$className = $whatever;
$object = new $className;

(ব্যতিক্রমীভাবে অপরিশোধিত) উদাহরণ কারখানা পদ্ধতি হিসাবে:

public function &factory($className) {

    require_once($className . '.php');
    if(class_exists($className)) return new $className;

    die('Cannot create new "' . $className . '" class - includes not found or class unavailable.');
}

1
আপনি ক্লাসের নাম এবং এক্সটেনশনের মধ্যে কোনও বিন্দু মিস করবেন না? require_once($className.'php'); ->require_once($className.'.php');
জে কোয়েস্ট


4

বলুন ClassOneসংজ্ঞায়িত হিসাবে:

public class ClassOne
{
    protected $arg1;
    protected $arg2;

    //Contructor
    public function __construct($arg1, $arg2)
    {
        $this->arg1 = $arg1;
        $this->arg2 = $arg2;
    }

    public function echoArgOne
    {
        echo $this->arg1;
    }

}

পিএইচপি প্রতিবিম্ব ব্যবহার করে;

$str = "One";
$className = "Class".$str;
$class = new \ReflectionClass($className);

একটি নতুন দৃষ্টান্ত তৈরি করুন:

$instance = $class->newInstanceArgs(["Banana", "Apple")]);

একটি পদ্ধতি কল করুন:

$instance->echoArgOne();
//prints "Banana"

একটি পদ্ধতি হিসাবে একটি ভেরিয়েবল ব্যবহার করুন:

$method = "echoArgOne";
$instance->$method();

//prints "Banana"

কোনও বস্তু তৈরির জন্য কাঁচা স্ট্রিং ব্যবহার না করে প্রতিবিম্বটি ব্যবহার করা আপনাকে আপনার অবজেক্টের উপর আরও ভাল নিয়ন্ত্রণ দেয় এবং সহজ টেস্টিবিলিটি (পিএইচপিউনিট প্রতিবিম্বের উপর খুব বেশি নির্ভর করে)

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