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


Why is my method chaining not working?

我正在尝试编写一个显示错误的类。我希望能够在一条线上完成。这就是我用来显示错误的地方:

$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方法上没有?

方法链接需要放置

return $this;

在可链接方法的末尾。

为什么我会在message()方法上得到错误,而在标题上没有方法

因为您的第一个链调用returnnull非对象:

$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;
}

等等。我希望你能明白。

除了必须在可链接的方法末尾输入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,则不会强制使用您的方法来正确设置这些属性。