2014-09-02 6 views
0

Я пытаюсь написать класс, который отображает ошибки. Я хотел бы иметь возможность сделать это на одной линии. Так это то, что я использую, чтобы отобразить сообщение об ошибке:Почему мой метод не работает?

$this->error->title("Error Title")->message("This is an error message")->redirect('home')->display(); 

Это мой класс:

<?php 

class Error { 

    var $title; 
    var $message; 
    var $redirect; 

    function title($title){ 

     $this->title = $title; 

    } 

    function message($message){ 

     $this->message = $message; 

    } 

    function redirect($redirect){ 

     $this->redirect = $redirect; 

    } 

    function display(){ 

     $CI &= get_instance(); 

     $CI->template->overall_header($this->title); 

     $data = array(
      'error_title' => $this->title, 
      'error_message' => $this->message 
      ); 

     if(isset($this->redirect)){ 

      $data['redirect'] = $this->redirect; 

     } 

     $CI->load->view('error_body', $data); 

    } 

} 

Это ошибка, что я получаю:

Fatal error: Call to a member function message() on a non-object in ...\application\frontend\controllers\members\login.php on line 128 

Почему я получаю ошибка в методе message(), но не в методе title?

+1

http://en.wikipedia.org/wiki/Fluent_interface#PHP – Phil

ответ

4

Method chaining требует от вас, чтобы положить

return $this; 

в конце змеевидных методов.

Why would I get the error on the message() method but not on the title method?

Поскольку ваша firsh цепь вызова return s null или не-объект:

$this->error->title("Error Title")->message("This is an error message")->redirect('home')->display(); 
//   ^^^^^^^^^^^^^^^^^^^^^^ 

Хотя определение было:

function title($title){ 
    $this->title = $title; 
} // return value not specified, so it returns null 

Как это исправить? Попробуйте это:

function title($title){ 
    $this->title = $title; 
    return $this; 
} 

И так далее. Надеюсь, ты понял.

1

В дополнение к тому, что вы должны ввести return $this в конце методов, которые являются цепями, следующая строка также немного странная.

$this->error->title("Error Title")->message("This is an error message")->redirect('home')->display(); 

Поскольку вы используете $this, что будет означать, что $this->error должен быть один из ваших свойств. Однако у вас нет свойства с именем $error в вашем классе. PHP на самом деле не заботится об этом, но то, что делает заботится о том, что $this->error должен быть экземпляром класса Error, чтобы любой из ваших методов класса работал.

Я подозреваю, что причина в том, что вы получаете это сообщение об ошибке, потому что вы не имеете дело с экземпляром вашего класса. Но даже после того, как вы исправите это, вам все равно придется сделать ваши методы целыми, чтобы предотвратить больше одного и того же сообщения.

В этом контексте вы можете использовать $this->title("Error Title")->message("This is an error message")..... после того, как вы сделаете их цепочки.

Кроме того, с точки зрения дизайна, используя ключевое слово var, вы создаете свои свойства public, которые сделают их изменяемыми из любой области. Это может быть ваше намерение, которое абсолютно нормально, однако, если ваши методы будут выполнять некоторую дополнительную обработку, оставив их, поскольку public не будет применять использование ваших методов для правильного их определения.

Смежные вопросы