致命错误:在第10行的Expense.php中不在对象上下文中时使用$ this

时间:2016-10-23 07:23:41

标签: php oop

我在这里发现了很多类似的问题,但我不明白,因为我是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');
        }
    }
}

请帮我解决这个问题。感谢

2 个答案:

答案 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');
        }
    }
}