我在这里发现了很多类似的问题,但我不明白,因为我是OOP的新手。
我按照this教程系列学习OOP。
这是我的代码:
include_once 'core/init.php';
if(Session::exists('home')){
echo Session::flash('home');
}
$user = new User();
if($user->isLoggedIn()){
} else {
Redirect::to('index.php');
}
if(Input::exist()){
$validate = new Validate();
$validation = $validate->check($_POST, array(
'date' => array('required' => true),
'vendor' => array('required' => true),
'invoice-no' => array('required' => true),
'terms-or-payment-account' => array('required' => true),
'type-of-expense-1' => array('required' => true),
'description-1' => array('required' => true),
'quantity-1' => array('required' => true),
'price-1' => array('required' => true),
'amount-1' => array('required' => true)
));
if($validation->passed()){
$expense = new Expense();
try{
$expense->record(array(
'date' => Input::get('date'),
'vendor' => Input::get('vendor'),
'invoice-no' => Input::get('invoice-no'),
'terms-or-payment-account' => Input::get('terms-or-payment-account'),
'type-of-expense' => Input::get('type-of-expense-1'),
'description' => Input::get('description-1'),
'quantity' => Input::get('quantity-1'),
'price' => Input::get('price-1'),
'amount' => Input::get('amount-1')
));
} catch(Exception $e){
die($e->getMessage());
}
if($expense->record()){
echo 'success';
}
} else {
//output errors
foreach ($validation->errors() as $error) {
echo $error, '<br/>';
}
}
}
Expense.php:
class Expense{
private $_db;
public function __construct($expense = NULL){
$this->_db = DB::getInstance();
}
public static function record($fields){
if(!$this->_db->insert('expenses', $fields)){
throw new Exception('There is a problem recording expense');
}
}
}
请帮我解决这个问题。感谢
答案 0 :(得分:1)
变量&#39; 这个&#39;只是链接到调用方法的对象。但是你使用静态修饰符。这意味着,这种方法在全班使用,而不是在某些对象中使用。也就是说,这个方法称之为不存在的对象,显然不存在变量&#39; 这个&#39;。
在静态方法中,您可以使用变量&#39; self &#39;只要。它链接到自我类。
要解决您的错误,您需要删除静态修改器。
答案 1 :(得分:0)
Expense#record
函数是静态的。这意味着该对象尚未实例化,但该类是。 $this
是指向实例化对象的指针。由于此方法范围内没有实例化对象,$this
将始终返回null。您看到的错误是PHP告诉您的方式。
最简单的方法是从static
方法签名中删除Expense#record
。这将使该方法成为Expense对象的方法,而不是现在的Expense类的方法。由于您已经在$validation->passed()
之后实例化了费用对象,因此这应该不是问题。 ->record()
方法可以按预期工作。
如果您绝对希望将记录方法保持为static
,那么您必须将方法更改为在静态上下文中工作;如下所示
class Expense{
private static $_db = DB::getInstance();
public static function record($fields){
if(!self->_db->insert('expenses', $fields)){
throw new Exception('There is a problem recording expense');
}
}
}