Hướng dẫn php instantiate dynamic class name - php khởi tạo tên lớp động

Tôi chưa quen với PHP và tôi đã cố gắng tự động hóa một lớp như thế này:

$var = new \App\$str;

Nhưng tôi tiếp tục nhận được lỗi này:

unexpected  variable $str after '\', expected: identifier.

Tôi biết điều đó là có thể, nhưng tôi chỉ không chắc cú pháp chính xác là gì, tất cả các ví dụ tôi tìm thấy là không có phần \App\ mà tôi cần.

Hướng dẫn php instantiate dynamic class name - php khởi tạo tên lớp động

Hỏi ngày 24 tháng 1 năm 2017 lúc 10:34Jan 24, 2017 at 10:34

1

Toán tử new chấp nhận định danh tên lớp hoặc biến có chứa tên lớp, nhưng không phải là hỗn hợp của chúng.

Vì một phần của tên lớp đủ điều kiện của bạn không rõ (động), bạn nên đặt tất cả các phần vào một biến chuỗi:

$class_name = 'A';
$namespace = '\\App';
$fully_qualified_class_name = "$namespace\\$class_name";
$var = new $fully_qualified_class_name;

Đã trả lời ngày 24 tháng 1 năm 2017 lúc 10:42Jan 24, 2017 at 10:42

Ruslan Osmanovruslan OsmanovRuslan Osmanov

Huy hiệu vàng 19,8K77 gold badges45 silver badges58 bronze badges

0

Tham gia cộng đồng Dzone và có được trải nghiệm thành viên đầy đủ.

Tham gia miễn phí

Bước đầu tiên trong việc phát triển mọi doanh nghiệp chương trình, ngay sau khi thiết kế và xác định các lớp cần thiết, là khởi tạo lớp. Và đó là một quá trình rất đơn giản. Bạn gọi hàm xây dựng lớp giống hệt như tên lớp & nbsp; tiếp theo là không gian tên tương ứng, vượt qua các đối số cần thiết (nếu có) và đó là điều đó.

Kịch bản được mô tả ở trên là chính xác những gì xảy ra trong gần như tất cả các tình huống. Nhưng có một điều kiện có thể phát sinh các ngoại lệ: bất cứ khi nào bạn cố gắng khởi tạo một lớp một cách linh hoạt.

Vì vậy, việc khởi tạo/tải lớp động là gì?

Việc khởi tạo lớp động cho phép tải mã không biết trước khi chương trình bắt đầu. Bằng cách này, chương trình không cần phải biết về tên lớp trước khi nó được tải và chạy.

class BicycleModel{
  //@ToDo: implement BicycleModel
}

class CarModel{
  //@ToDo: implement CarModel
}

// Normal Class Loading
$myTodayChoice = new BicycleModel();

// Dynamic Class Loading
$vehicleName = 'Bicycle';
// You should first concatenate $vehicleName & Model, then use resulting variable for creating class instance.
// Keep in mind that you're not allowed to merge class instantiation & concatenation.
// $myTodayChoice - new $vehicleName.'Model'(); IS NOT VALID
$className = $vehicleName . 'Model';
$myTodayChoice = new $className();

Như bạn thấy, trước tiên chúng tôi chỉ định tên lớp mong muốn & nbsp; trong luồng của chương trình và sau đó sử dụng nó để khai báo lớp. & Nbsp;

Cho đến nay, những gì & nbsp; chúng tôi đã thảo luận đang xảy ra trong một phạm vi toàn cầu. Bây giờ đã đến lúc đào vào tải lớp động trong theo tên PHP theo tên.Dynamic Class Loading in Namespaced PHP.

Dường như không có gì mới để lo lắng: Chúng tôi sẽ chỉ khai báo một số không gian tên, sau đó mọi gói và lớp phải được xác định trong không gian tên thích hợp của nó. Vì vậy, chúng tôi chỉ cần tuân theo các quy tắc về tải lớp bình thường. Hãy làm điều đó và xem những gì & nbsp; xảy ra:

/* File Component/Package/Vehicle/BicycleModel.php */

namespace Component\Package\Vehicle;

class BicycleModel{
  //@ToDo: implement BicycleModel
}
------------------------------------------------------

/* File Component/Package/Vehicle/CarModel.php */

namespace Component\Package\Vehicle;

class CarModel{
  //@ToDo: implement CarModel
}
------------------------------------------------------

/* File Component/Package/Vehicle/VehicleFactory.php */

namespace Component\Package\Vehicle;

class VehicleFactory
{
  private $vehicleName;

  public function __construct($vehicle = 'Bicycle'){
    $this->$vehicleName = $vehicle;
  }

  public function getInstance(){
    $className = $this->$vehicleName . 'Model';
    return new $className(); //This will return \BicycleModel & NOT \Component\Package\Vehicle\BicycleModel
    /* This means it won't work as expected. We thought it will return a BicycleModel in the same namespace
    *  that is defined, But it didn't happen. Continue reading to see why */
  }
}

Xác định các không gian tên và nhập các gói từ các không gian tên khác được thực hiện tại thời gian biên dịch và do đó không ảnh hưởng đến tên lớp động (được xác định tại thời gian chạy).

Vì vậy, & nbsp; in & nbsp; Order & nbsp; để sửa chữa & nbsp; bug, & nbsp; chúng tôi & nbsp; có & nbsp; để viết lại & nbsp; với không gian tên đúng & nbsp;

public function getInstance(){
  $className = 'Component\\Package\\Vehicle\\' . $this->$vehicleName . 'Model';
  return new $className(); //This will return \BicycleModel & NOT \Component\Package\Vehicle\BicycleModel
  /* This means it won't work as expected. We thought it will return a BicycleModel in the same namespace
  *  that is defined, But it didn't happen. Continue reading to see why */
}

PHP