为什么我的方法链不起作用?

时间:2014-09-02 03:48:19

标签: php methods chaining

我正在尝试编写一个显示错误的类。我希望能够在一条线上完成。所以我用它来显示错误:

$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方法上得到错误?

2 个答案:

答案 0 :(得分:4)

Method chaining要求你输入

return $this;

在可连接方法的最后。

  

为什么我会在message()方法上得到错误而不是在标题上得到错误   方法

因为您的第一个链调用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 :(得分: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将不会强制使用你的方法来正确设置这些属性。