【问题标题】:Why is my method chaining not working? [duplicate]为什么我的方法链接不起作用? [复制]
【发布时间】:2014-10-26 06:06:51
【问题描述】:

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

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

【问题讨论】:

标签: php methods chaining


【解决方案1】:

除了必须在可链接的方法末尾输入return $this之外,下面这行代码也有点奇特。

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

由于您使用的是$this,这意味着$this-&gt;error 应该是您的属性之一。但是,您的班级中没有名为 $error 的属性。 PHP 并不真正关心这一点,但 关心的是 $this-&gt;error 必须是 Error 类的实例,才能使您的任何类方法起作用。 p>

我怀疑您收到该错误消息的最初原因是因为您没有处理类的实例。但即使你修复了这个问题,你仍然必须让你的方法可以链接起来,以防止出现更多相同的消息。

在这种情况下,您可以在使它们可链接后使用$this-&gt;title("Error Title")-&gt;message("This is an error message").....

此外,从设计的角度来看,使用 var 关键字会使您的属性 public 使它们在任何范围内都是可变的。这可能是您的意图,这绝对没问题,但是如果您的方法要进行一些额外的处理,将这些保留为 public 将不会强制使用您的方法来正确设置这些属性。

【讨论】:

    【解决方案2】:

    Method chaining需要你放

    return $this;
    

    在可链接方法的末尾。

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

    因为你的第一个链调用returns 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;
    }
    

    等等。我希望你能明白。

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 2013-05-25
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      • 1970-01-01
      • 2015-06-24
      • 2015-07-31
      • 1970-01-01
      相关资源
      最近更新 更多