我正在尝试编写一个显示错误的类。我希望能够在一条线上完成。这就是我用来显示错误的地方:
$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()方法上得到错误,而在标题上没有方法
因为您的第一个链调用return
的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;
}
等等。我希望你能明白。
除了必须在可链接的方法末尾输入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
,则不会强制使用您的方法来正确设置这些属性。