2011-02-01 69 views
7

ok gì im cố gắng để làm là makeing một cái gì đó vì vậy tôi có thể gọi nó như $this->model->users->getInfomation('name'); hoặc một cái gì đó similer trên khuôn khổ của tôi nhưng php cho tôi một tiêu chuẩn nghiêm ngặt Tạo đối tượng mặc định từ giá trị rỗngphp Tạo đối tượng mặc định từ giá trị rỗng?

protected function model($model) 
{ 
    $path = "features". DS ."models". DS . $model .".php"; 
    require $path; 

    $class = 'Model'. ucfirst($model); 
    $this->model->$model = new $class; 
} 

chúng ta có thể làm cho nó như vậy nó sẽ bằng cách nào đó phù hợp với các tiêu chuẩn?

chỉnh sửa *

chức năng này trong ứng dụng lớp vì vậy tôi có thể mở rộng chúng từ bộ điều khiển của chúng tôi như blog Mở rộng ứng dụng sau đó gọi một cái gì đó giống như $ this-> model-> blog sẽ có được một cái gì đó giống như những gì im làm ở trên, khi tôi làm điều gì đó như

có mã trên hoạt động tốt$this->blog->getSomething();, nhưng bằng cách nào đó tôi muốn làm cho họ trong một nhóm, như câu hỏi ở trên, vì vậy nếu chúng ta muốn có được một cái gì đó giống như $this->model->blog->getSomething();

Cảm ơn bạn đã dành thời gian.

Adam Ramadhan

+0

Tôi thực sự không biết bạn đang cố gắng đạt được điều gì. Bạn muốn mô hình được tạo tự động khi bạn gọi '$ this-> model -> [modelName]'? – singles

+0

có nhưng vấn đề có thể là do mô hình $ this- này trống, tôi chưa tạo ở đâu cả. chúng ta có thể thêm vào đó không? –

Trả lời

7

Thật khó để biết bạn đang làm gì sai với mã đó. Tôi đã thực hiện một số mã rất đơn giản để tạo lại lỗi:

<?php 
$bar = 42; 
$foo = null; 

$foo->bar = $bar; 

Lý do cảnh báo này là bạn chỉ định giá trị cho "biến đối tượng" không phải là một đối tượng. Bằng cách này, động cơ Zend thực sự tạo ra một đối tượng cho $ foo, đó là một thể hiện của StdClass. Rõ ràng, 9 trong số 10 lần, đây không phải là những gì bạn muốn làm, vì vậy PHP cung cấp một thông điệp hữu ích.

Trong trường hợp của bạn: $ this-> model không phải là đối tượng (chưa). Nếu bạn muốn loại bỏ lỗi, chỉ cần làm:

if(!is_object($this->model)) { 
    $this->model = new StdClass; 
} 
$this->model->$model = new $class; 

Chúc mừng.

+0

vâng một công việc này, nhưng nếu (! Is_object ($ this-> model)) đang cho tôi một lỗi $ this-> model không tìm thấy, nếu tôi loại bỏ đối tượng thì nó hoạt động tốt !. anway một lớp std là gì? –

+1

Bạn có thể tìm thêm thông tin về điều đó tại đây tại stackoverflow: http://stackoverflow.com/questions/931407/what-is-stdclass-in-php Nếu bạn chưa định nghĩa $ this-> model, có lẽ đã đến lúc làm như vậy, thay vì dựa vào tất cả các loại ma thuật? –

+0

anyway sau khi làm một số nghiên cứu im sử dụng này cho bây giờ, bệnh thay đổi câu trả lời nếu có một tốt hơn một: D cảm ơn. –

0

Phải sử dụng đôi $ 's

$this->model->$$model = new $class; 
+0

cũng như tôi biết $$ có nghĩa là như thế này $ this-> model -> $ blog? do đó, nó cho chúng ta một lỗi mà blog $ doesnt tồn tại. những gì im tìm kiếm là cái gì đó có thể cho tôi $ this-> model-> blog từ $ this-> model -> $ model; nhưng vấn đề là $ this-> model tôi chưa làm gì cả. hãy sửa tôi nếu tôi sai. –

+0

Bạn không có đối tượng trên mô hình này->? Sau đó, bạn không nên mong đợi nó hoạt động .. – yoda

+0

Ngoài ra, $$ có nghĩa là nơi bạn có $$ mô hình, nó sẽ dính vào tên của biến (ví dụ: nếu $ model là "person", nó sẽ là $ this-> model-> person). Thử nghiệm và làm việc. – yoda

2

Bạn phải sử dụng __get magic method - http://php.net/manual/pl/language.oop5.magic.php

Bạn có thể đạt được những gì bạn đang tìm kiếm một cái gì đó làm như thế:

<?php 
class ModelCreator 
{ 
    private $_modelsCreated = array(); 
    public function __get($model) 
    { 
     $class = 'Model'. ucfirst($model); 
     //avoid creating multiple same models 
     if (!array_key_exists($model, $this->_modelsCreated)) { 
      $path = "features". DS ."models". DS . $model .".php"; 
      require_once 'modeluser.php'; 
      $this->_modelsCreated[$class] = new $class; 
     } 
     return $this->_modelsCreated[$class]; 
    } 
} 

class MyClass 
{ 
    private $_model; 

    public function __construct(ModelCreator $model) 
    { 
     $this->_model = $model; 
    } 

    public function __get($name) 
    { 
     if ($name === 'model') { 
      return $this->_model; 
     } 
    } 
} 

$myClass = new MyClass(new ModelCreator()); 
$userModel = $myClass->model->user; // will return a class of ModelUser 

Nhưng bạn nên tránh ma thuật như trên -> cách tiếp cận tốt hơn là thực hiện theo cách đó:

//model creator is an instance of model creator 
$this->modelCreator->getModel('user'); // now you know what exactly is happening 
+0

cảm ơn người độc thân! có nó hoạt động quá !, im chờ đợi một giải pháp đơn giản hơn. –

+0

Nếu bạn muốn các mô hình được tạo động theo yêu cầu của bạn và sử dụng các thuộc tính thay vì các phương thức để truy xuất chúng, tôi nghi ngờ, có giải pháp đơn giản hơn. – singles

+1

không có giải pháp đơn giản nào có một mẫu thiết kế xử lý các cá thể đối tượng duy nhất và nó được gọi là một multiton (giống như người tạo mô hình này ở đây). Bạn có thể gọi nó là một tập hợp các bộ đơn. Dính vào cuốn sách, cố gắng để làm cho mọi thứ đơn giản hơn họ có thể có thể tạo ra hành vi kỳ lạ, như bạn đã phát hiện ra. –

0

Ngoài câu trả lời Berry Langerak của

is_object vẫn sẽ kích hoạt việc kiểm tra nghiêm ngặt vì nó giả định có 'cái gì' trong $ this-> mô hình.isset là cách tiếp cận tốt hơn

if(!isset($this->model)) { 
    $this->model = new StdClass; 
} 

$this->model->$model = new $class; 
Các vấn đề liên quan