2012-11-22 17 views
5

Tôi đang thử một công thức về cách lưu trữ tài nguyên chuỗi trong PHP, nhưng tôi dường như không thể làm cho nó hoạt động. Tôi là một chút không chắc chắn về cách thức các chức năng __get hoạt động liên quan đến mảng và các đối tượng.__get tài nguyên trong PHP "Không thể sử dụng đối tượng kiểu stdClass như mảng"

Thông báo lỗi: "Fatal error: Không thể sử dụng đối tượng của loại stdClass như mảng trong /var/www/html/workspace/srclistv2/Resource.php trên dòng 34"

Tôi đang làm gì sai?

/** 
* Stores the res file-array to be used as a partt of the resource object. 
*/ 
class Resource 
{ 
    var $resource; 
    var $storage = array(); 

    public function __construct($resource) 
    { 
     $this->resource = $resource; 
     $this->load(); 
    } 

    private function load() 
    { 
     $location = $this->resource . '.php'; 

     if(file_exists($location)) 
     { 
      require_once $location; 
      if(isset($res)) 
      { 
       $this->storage = (object)$res; 
       unset($res); 
      } 
     } 
    } 

    public function __get($root) 
    { 
     return isset($this->storage[$root]) ? $this->storage[$root] : null; 
    } 
} 

Dưới đây là các tập tin tài nguyên tên QueryGenerator.res.php:

$res = array(
    'query' => array(
     'print' => 'select * from source prints', 
     'web' => 'select * from source web', 
    ) 
); 

Và đây là nơi tôi đang cố gắng để gọi nó là:

$resource = new Resource("QueryGenerator.res"); 

    $query = $resource->query->print; 

Trả lời

3

Đúng là bạn xác định $storage làm một mảng trong lớp của bạn nhưng sau đó bạn gán đối tượng cho nó theo phương thức load ($this->storage = (object)$res;).

Các trường có thể truy cập được bằng cú pháp sau: $object->fieldName. Vì vậy, trong phương pháp __get của bạn, bạn nên làm:

public function __get($root) 
{ 
    if (is_array($this->storage)) //You re-assign $storage in a condition so it may be array. 
     return isset($this->storage[$root]) ? $this->storage[$root] : null; 
    else 
     return isset($this->storage->{$root}) ? $this->storage->{$root} : null; 
} 
+0

Tôi nghĩ việc này trực tiếp $ this-> lưu trữ -> $ root –

+0

@ElzoValugi Chắc chắn, nó làm. Tôi sử dụng điều này bởi vì tôi _think_ nó dễ hiểu hơn đối với các lập trình viên "không phải php". – Leri

+0

@PLB: Sử dụng hàm này trả về NULL (từ phần "khác" của séc). Vẫn nhận được với "$ resource-> query-> print" như thể nó là nơi một vô hướng với một chuỗi. –