PHP có thể khởi tạo một đối tượng từ tên của lớp dưới dạng một chuỗi không?


Câu trả lời:


137

Chắc chắn rồi.

$className = 'MyClass';
$object = new $className; 

7
Tuyệt, tôi nên kiểm tra điều đó trước khi hỏi hehe. Cảm ơn!
user135295

2
@user - quá đúng. Tôi tự hỏi tại sao tôi đến SO trực tiếp thay vì thực hiện mức tối thiểu trần? lol
Ben

2
Trong thực tế, nó không hiển nhiên như vậy. Tôi biết rằng trong Java nó là một thứ được gọi là phản chiếu, nhưng điều này rất đơn giản so với nó.
Bartis Áron

4
Nếu clsss nằm trong không gian tên, hãy sử dụng $ class = 'PrintData \\' này. $ hạng; trả về mới $ class ();
Dariux

2
Ngoài ra, như tài liệu PHP nêu rõ, nếu lớp bạn muốn khởi tạo nằm trong một không gian tên thì bạn phải chỉ định FQN (Tên Đủ điều kiện). Ví dụ: bản thân tôi đang ở trong một vùng tên "App \ Http \ Controllers" và tôi có một chuỗi $ string = 'App \ Models \ Task'; Tôi nghĩ rằng nếu tôi cố gắng khởi tạo chuỗi thì nó sẽ bị đứt nhưng thực ra, bạn không cần phải thêm \ vào đầu.
Matt Kieran


5

nếu lớp của bạn cần đối số, bạn nên làm điều này:

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));

3

Tĩnh quá:

$class = 'foo';
return $class::getId();

Điều này không cung cấp câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ tác giả, hãy để lại bình luận bên dưới bài đăng của họ. - Từ đánh giá
Blackbam

@Blackbam câu trả lời bổ sung liên quan có liên quan. Xin vui lòng chỉ bình luận nếu nó là hữu ích.
Andrew Atkinson

Đúng là nó hoạt động về cơ bản, dù sao thì một chút giải thích về câu trả lời của bạn sẽ rất hay. Câu hỏi là "PHP có thể khởi tạo một đối tượng không" nhưng quyền truy cập vào một hàm thành viên tĩnh không phải là quyền truy cập đối tượng.
Blackbam 14/07/17

0

Bạn có thể thực hiện một số lệnh gọi động bằng cách lưu trữ (các) tên lớp / phương thức của bạn trong một bộ lưu trữ chẳng hạn như cơ sở dữ liệu. Giả sử rằng lớp có khả năng phục hồi cho các lỗi.

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

vv .. Sau đó, trong mã của bạn bằng cách sử dụng các chuỗi được cơ sở dữ liệu trả về cho các lớp và tên phương thức. bạn thậm chí có thể lưu trữ các truy vấn sql cho các lớp học của mình, mức độ tự động hóa nếu tùy theo trí tưởng tượng của bạn.

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

Tôi sử dụng phương pháp này để tạo dịch vụ web REST.


1
Và nếu tôi quản lý để đưa vào cơ sở dữ liệu của bạn bất kỳ số lớp và phương thức nào thì tôi đã sở hữu toàn bộ API còn lại của bạn .... Kudos! Vui lòng KHÔNG sử dụng mã này, nó rất nguy hiểm!
James Kipling
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.