我正在尝试编写一个显示错误的类。我希望能够在一条线上完成。所以我用它来显示错误:
$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方法上得到错误?
答案 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
将不会强制使用你的方法来正确设置这些属性。