2012-03-15 41 views
7

Tôi cần một ý tưởng để tạo lớp ẩn danh trên PHP. Tôi không biết làm thế nào tôi có thể làm việc.Xây dựng lớp ẩn danh

Xem những hạn chế của tôi:

  • Mở PHP bạn không thể làm cho lớp nặc danh, như chức năng ẩn danh (như class {});
  • Trên PHP bạn không có phạm vi lớp (ngoại trừ trong không gian tên, nhưng nó có cùng một vấn đề bên dưới);
  • Trên PHP, bạn không thể sử dụng các biến để chỉ định tên lớp (như class $name {});
  • Tôi không có quyền truy cập để cài đặt runkit PECL.

gì tôi cần, và tại sao:

Vâng, tôi cần phải tạo một hàm gọi là tức create_class() rằng nhận được một tên khóa và một lớp nặc danh. Nó sẽ hữu ích cho tôi vì tôi muốn sử dụng các ký hiệu lớp tên khác nhau mà PHP không thể chấp nhận. Ví dụ:

<?php 

    create_class('it.is.an.example', function() { 
    return class { ... } 
    }); 

    $obj = create_object('it.is.an.example'); 

?> 

Vì vậy, tôi cần ý tưởng chấp nhận việc sử dụng này. Tôi cần nó bởi vì trên khuôn khổ của tôi, tôi có đường dẫn này: /modules/site/_login/models/path/to/model.php. Vì vậy, số model.php cần khai báo một lớp mới có tên là site.login/path.to.model.

On gọi create_object() nếu bộ nhớ cache nội bộ có một định nghĩa $class (như it.is.an.example nó chỉ đơn giản trả lại đối tượng lớp mới. Nếu không, cần tải. Vì vậy, tôi sẽ sử dụng nội dung $class để tìm kiếm các tập tin lớp là nhanh chóng tiện lợi gì.

+1

Việc thiếu các lớp ẩn danh của PHP là cực kỳ hạn chế. – MirroredFate

+2

Bạn có thể muốn xem xét câu hỏi này: http://stackoverflow.com/q/6384431/3933332 – Rizier123

+0

Tại sao bạn phải sử dụng tên lớp không hợp lệ? Tại sao bạn không thể thay thế những '´´ này bằng cách, giả sử, '_'? –

Trả lời

4

Trong PHP 7.0, sẽ có anonymous classes. Tôi không hoàn toàn hiểu được câu hỏi của bạn, nhưng chức năng create_class() của bạn có thể trông như thế này:

function create_class(string $key, array &$repository) { 
    $obj = new class($key) { 
     private $key; 
     function __construct($key) { 
      $this->key = $key; 
     } 
    }; 
    $repository[$key] = $obj; 
    return $obj; 
} 

này sẽ tạo một đối tượng với một kiểu lớp nặc danh và đăng ký nó vào $repository. Để có được một đối tượng ra bạn sử dụng chìa khóa bạn tạo ra nó với: $repository['it.is.an.example'].

6

bạn có thể tạo ra một lớp giả sử dụng stdClass

$the_obj = new stdClass(); 
+4

Không thể đính kèm các phương thức vào 'stdClass' – webbiedave

6

Vì vậy, về cơ bản bạn muốn thực hiện một mô hình nhà máy.

Class Factory() { 
    static $cache = array(); 

    public static getClass($class, Array $params = null) { 
    // Need to include the inc or php file in order to create the class 
    if (array_key_exists($class, self::$cache) { 
     throw new Exception("Class already exists"); 
    } 

    self::$cache[$class] = $class; 
    return new $class($params); 
    } 
} 

public youClass1() { 
    public __construct(Array $params = null) { 
    ... 
    } 
} 

Thêm một bộ nhớ cache bên trong để kiểm tra các bản sao

+1

Không chính xác. Tôi cần một phương pháp để tạo các lớp ẩn danh, để tránh trùng lặp. Nếu tôi tuyên bố 'foo' hai lần, nó sẽ thất bại. –

0

Nếu bạn thực sự cần phải vào đó, bạn có thể sử dụng eval()

$code = "class {$className} { ... }"; 
eval($code); 
$obj = new $className(); 

Nhưng các vị thần sẽ không chấp nhận này. Bạn sẽ đi đến địa ngục nếu bạn làm điều đó.

Các vấn đề liên quan