Tạo cá thể lớp PHP bằng một chuỗi


223

Tôi có hai lớp, class ClassOne { }class ClassTwo {}. Tôi nhận được một chuỗi có thể "One"hoặc "Two".

Thay vì sử dụng một switchcâu lệnh dài như:

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

Có cách nào để tôi có thể tạo một cá thể bằng cách sử dụng một chuỗi new Class("Class" . $str);không?

Câu trả lời:


484

Vâng, bạn có thể!

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

Khi sử dụng không gian tên, cung cấp tên đủ điều kiện :

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

Những thứ hay ho khác bạn có thể làm trong php là:
Biến biến :

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

Và các hàm & phương thức biến.

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

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

1
Cảm ơn các ví dụ!
Joel

28
FYI, bạn không thể sử dụng một phần biến. ví dụ. $my_obj = Package\$class_name();. Thay vào đó, bạn phải$class_name = "Package\\" . $class_name; $my_obj = new $class_name();
Birla

14
Xin lưu ý khi sử dụng không gian tên, bạn phải cung cấp đường dẫn đầy đủ:$className = '\Foo\Bar\MyClass'; $instance = new $className();
Giel Berkers

5
Không có muỗng ... chỉ có php.
Thuyền trưởng Hypertext

4
nhưng một câu hỏi Phương thức được mô tả ở trên có thể được sử dụng để tạo một thể hiện lớp mới. Điều gì xảy ra nếu tôi muốn gọi tĩnh một phương thức của một lớp hiện có? Tôi đã thử như sau: $model = $user_model::find()->All(); đâu $user_modellà biến chứa chuỗi của lớp được gọi
Ramesh Pareek

22

Bạn chỉ có thể sử dụng cú pháp sau để tạo một lớp mới (điều này rất hữu ích nếu bạn đang tạo một nhà máy ):

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

Như một phương pháp nhà máy (đặc biệt thô):

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
Bạn không bỏ lỡ một dấu chấm giữa tên lớp và phần mở rộng? require_once($className.'php'); ->require_once($className.'.php');
J Quest


4

Hãy nói ClassOneđược định nghĩa là:

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;
    }

}

Sử dụng phản xạ PHP;

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

Tạo một sơ thẩm mới:

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

Gọi một phương thức:

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

Sử dụng một biến như một phương thức:

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

//prints "Banana"

Sử dụng Reflection thay vì chỉ sử dụng chuỗi thô để tạo đối tượng giúp bạn kiểm soát tốt hơn đối tượng của mình và khả năng kiểm tra dễ dàng hơn (PHPUnit phụ thuộc rất nhiều vào Reflection)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.