dzhem911
@dzhem911
I know H.T.M.L. ;)

Как правильнее переопределить метод родительского класса?

Доброго времени суток.
На днях пытался написать свой "движок", и при написании классов столкнулся с следующей проблемой.
Strict standards: Declaration of User::isExists() should be compatible with that of GlobalClass::isExists() in С:\...\mytest\lib\user_class.php on line 31
Названия родительского и дочернего класса абсолютно правильны. Единственное что прочитал, что нужно как-то дополнительно переопределить метод, т.е написанного мною
public function __construct($db) {
		parent::__construct("users", $db);
	}

недостаточно.
Вот код поподробнее:
require_once "global_class.php";

class User extends GlobalClass {

	public function __construct($db) {
		parent::__construct("users", $db);
	}
public function isExists($login) {
		return $this->isExists("login", $login);
	}

и его родитель:
abstract class GlobalClass {
	private $db;
	private $table_name;
	protected $config;
	protected $valid;
	
	protected function __construct($table_name, $db) {
		$this->db=$db;
		$this->table_name=$table_name;
		$this->config=new Config();
		$this->valid=new CheckValid();
	}
....
protected function isExists($field, $value) {
		return $this->db->isExists($this->table_name, $field, $value);
	}

Буду очень признателен за помощь..а то уже уснуть сегодня не смог. И да, уже отправился подробнее учить ООП.
  • Вопрос задан
  • 8271 просмотр
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Что именно вам не понятно в фразе
Declaration of User::isExists() should be compatible with that of GlobalClass::isExists()

Ее можно трактовать как

определение метода User::isExists() не должно отличаться от GlobalClass::isExists()

то есть вы ломаете интерфейс, ваш метод у класса наследника делает явно что-то не то, что от него требуется.

Учите принципы ООП и GRASP (можно по видио лекциям, тут нужно что бы объяснял кто-то).
Ответ написан
@HaveFun
Если есть необязательные параметры или претенденты на это звание, то размещать их нужно справа. Тогда можно использовать такой вариант:

abstract class GlobalClass {
    ...
    protected function isExists($value, $field) {
        return $this->db->isExists($this->table_name, $field, $value);
    }
}
...
class User extends GlobalClass {
    ...
    public function isExists($value, $field=null) {
        $field = 'login';
        return parent::isExists($value, $field);
    }
}


Менять порядок обязательных параметров слева не стоит. Если он у родителя первый, то и у потомка должен быть первым.

И судя по
public function isExists($login) {
		return $this->isExists("login", $login);
	}
следующей ошибкой будет Maximum function nesting level. Используйте parent.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@vdem
В двух словах: объявление метода isExists() должно совпадать с объявлением этого метода в классе-предке, что вам и ответил интерпретатор. У вас оно не совпадает по параметрам.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы