【问题标题】:Cause of the error: “Using $this when not in object context protected function”错误原因:“不在对象上下文保护函数中使用 $this”
【发布时间】:2014-07-03 07:34:25
【问题描述】:

在我的代码中使用以下类时出现以下错误:

当不在对象上下文保护函数中时使用 $this

这是我的代码:

<?php
class Sign {
    private $db;
    private $errors = array();
    private $passed = true;

    public function __construct() {
        $this->db = DB::instance();
    }

    public static function sign($alias, $password) {
        if(!self::exists($alias)) {
            self::signup($alias, $password);
        } else {
            self::signin($alias, $password);
        }
    }

    protected function exists($alias) {
        $stm = $this->db->prepare('SELECT * FROM users WHERE alias = ?');

        if($stm->execute(array($alias))) {
            return true;
        }

        return false;
    }

    protected function signup($alias, $password) {
        $salt = Hash::salt(32);

        $stm = $this->db->prepare('INSERT INTO users(alias, balance, password, salt, created_at)
                                   VALUES (:alias, :balance, :password, :salt, :created_at)');
        $stm->execute(array(
            ':alias'        => $alias,
            ':balance'      => 0,
            ':password'     => Hash::make($password, $salt),
            ':salt'         => $salt,
            ':created_at'   => date('Y-m-d H:i:s')
        ));
    }

    public function errors() {
        return $this->errors;
    }

    public function passed() {
        return $this->passed;
    }
}

为什么会出现此错误?第 20 行在 protected function exists() 内部,我使用 $this-&gt;db-&gt;prepare()

什么会导致这种情况发生?我尝试更改一些公共的、受保护的等,但无济于事。我将它们设置为私有和受保护的仍然会出现此错误。

【问题讨论】:

  • “为什么会出现这个错误?”错误是什么?
  • @JakeGould:“不在对象上下文中使用 $this”
  • @zerkms 是的,它在标题中。但是尽管如此,帖子的格式却很糟糕。为清晰起见进行了编辑。

标签: php class oop visibility


【解决方案1】:

你不能像这样混合和匹配静态和实例。您真正的问题在于您如何称呼存在:

public static function sign($alias, $password) {
    if(!self::exists($alias)) {
        self::signup($alias, $password);
    } else {
        self::signin($alias, $password);
    }
}

除非你真的需要一个静态方法,否则你应该创建一个对象并调用sign()作为该对象的实例方法。

您也可以将sign() 用作工厂,但与任何编程一样,$cat->skin() 有多种方法。

public static function sign($alias, $password) {
    $retVal = new Sign();
    if(!$retVal->exists($alias)) {
        $retVal->signup($alias, $password);
    } else {
        $retVal->signin($alias, $password);
    }
    return $retVal;
}

【讨论】:

  • “你不能像这样混合和匹配静态和实例”——这句话需要额外澄清。
  • 他正在使用静态和实例上下文。这是指他发布的代码。 ; ) 好的,为了实际使用,这里是静态的手册页:php.net/manual/en/language.oop5.static.php
  • "他正在使用静态和实例上下文" --- 你可以从实例方法中调用静态方法。这就是为什么我提到你需要澄清这一点。
  • 同意。更好的措辞是“您不能在静态上下文中使用 $this”,这样会更准确。
猜你喜欢
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2013-10-16
  • 2010-12-11
  • 1970-01-01
相关资源
最近更新 更多