【问题标题】:access $this in extended class在扩展类中访问 $this
【发布时间】:2015-03-12 13:20:38
【问题描述】:

我一直在关注有关 OOP 编程的教程。我得到了这个名为 User 的类:

class User {

    private $_db,
            $_data,
            $_sessionName,
            $_isLoggedIn;

    public function __construct($user = null) {

        $this->_db = DB::getInstance();

        $this->_sessionName = Config::get('session/session_name');

        if (!$user) {

            if (Session::exists($this->_sessionName)) {

                $user = Session::get($this->_sessionName);

                if ($this->find($user)) {

                    $this->_isLoggedIn = true;

                } else {

                    // Process logout

                }

            }

        } else {

            $this->find($user);

        }

    }

    public function update($fields = array(), $id = null) {

        if (!$id && $this->isLoggedIn()) {

            $id = $this->data()->id;

        }

        if (!$this->_db->update('users', $id, $fields)) {

            throw new Exception('De gegevens konden niet gewijzigd worden');

        }

    }

    public function create($fields = array()) {

        if (!$this->_db->insert('users', $fields)) {

            throw new Exception('Het account is niet aangemaakt');

        }

    }

    public function find($user = null) {

        if ($user) {

            $field = (is_numeric($user)) ? 'id' : 'email';
            $data = $this->_db->get('users', array($field, '=', $user));

            if ($data->count()) {

                $this->_data = $data->first();

                return true;

            }

        }

    }

    public function login($email = null, $password = null) {

        $user = $this->find($email);

        if ($user) {

            if ($this->data()->password === hash::make($password)) {

                session::put($this->_sessionName, $this->data()->id);

                return true;

            }

        }

        return false;

    }

    public function logout() {

        session::delete($this->_sessionName);

    }

    public function hasPermission($key) {

        $group = $this->_db->get('user_role', array('id', '=', $this->data()->rank));

        if ($group->count()) {

            $permissions = json_decode($group->first()->permission, true);

            if ($permissions[$key] == true) {

                return true;

            }

        }

        return false;

    }

    public function data() {

        return $this->_data;

    }

    public function isLoggedIn() {

        return $this->_isLoggedIn;

    }

}

每个用户都有不同的快速链接存储在数据库中。我试图用这样的类链接扩展类用户:

class Link extends User {

    public static function getUserLinks($user) {

        if ($user) {

            $data = $this->_db->get('user_links', array('uid', '=', $user));

            if ($data->count()) {

                $this->_data = $data->results();

                return $this->_data;

            } else {

                echo 'No matches found';

            }

        } 

        return false;

    }

但我收到一条错误消息: 致命错误:在第 153 行的...中不在对象上下文中使用 $this

我认为在扩展课程时我可以访问所有父母的详细信息?

我做错了什么?另外,class Link extends User 后面我的逻辑是否正确?

感谢您的帮助。

【问题讨论】:

标签: php class oop extends


【解决方案1】:

您试图在静态方法中访问类指针,这是不可能的,因为静态方法属于类本身而不属于实例。

你可以有一个静态属性来保存你的实例,然后你可以这样做:(你必须确保你有一个 Link 实例)

class Link extends User {

    public static $instance;

    public function __construct() {
        parent::__construct();
        self::$instance = $this;
    }

    public static function getUserLinks($user) {

        if (self::$instance instanceof Link && $user) {

            $data = self::$instance->_db->get('user_links', array('uid', '=', $user));

            if ($data->count()) {

                self::$instance->_data = $data->results();

                return self::$instance->_data;

            } else {

                echo 'No matches found';

            }

        } 

        return false;

    }
}

【讨论】:

  • 我试过这个,但现在它说 $_db 是未定义的。我是否必须再次将其定义为private $_db
  • 私有属性不可继承,您需要将它们更改为受保护。
  • 所以private 只存在于父类本身中?和protected 在父类和子类中?
  • private 是只有类本身才能访问的属性。 protected 是可以继承但仍无法从外部访问的属性/方法。
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2018-01-15
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多