2013-07-24 2 views
0

У меня есть этот код:Почему дочерний метод имеет те же параметры, что и родительский метод?

abstract class Base{ 

    public function delete(){ 
    // Something like this (id is setted in constructor) 
    $this->db->delete($this->id); 
    } 

} 

Тогда у меня есть еще один класс, который расширяет базу, например:

class Subtitles extends Base{ 

    public function delete($parameter){ 
     parent::delete(); 
     // Do some more deleting in transaction using $parameter 
    } 

} 

который также случается иметь метод удаления.

Здесь возникает проблема:

Когда я называю

$subtitles->delete($parameter) 

я получаю:

Strict error - Declaration of Subtitles::delete() should be compatible with Base::delete() 

Так что мой вопрос, почему я не могу иметь метод потомка с разные параметры?

Благодарим вас за разъяснение.

ответ

3

Это потому, что PHP делает метод переопределение не метод перегрузка. Таким образом, сигнатуры методов должны точно совпадать.

Как работа Arround для выпуска вы можете реструктурировать удалить на свой базовый класс

public function delete($id = null){ 
    // Something like this (id is setted in constructor) 
    if ($id === null) $id = $this->id; 
    $this->db->delete($id); 
} 

Затем измените метод подклассов подпись, чтобы соответствовать.

+0

+ для обеспечения обходного пути. –

+0

Ну, это сложнее, но я понимаю. Спасибо. –

3

Чтобы переопределить функцию в базовом классе, метод должен иметь идентичную «подпись» к той, которую он перемещает.

Подпись состоит из имени, параметров (и порядка параметров) и типа возврата.

В этом суть полиморфизма, и именно там объектно-ориентированное программирование получает большую часть своей силы. Если вам не нужно переопределять методы родителя, дайте вашему новому методу другое имя.

+0

К сожалению, мне нужно переопределить метод, потому что я хочу, чтобы предотвратить: $ subtitles-> Удалить(), чтобы вызвать только родительский метод. Но спасибо. –

0

Это, как сообщается, комментарий к ansert @ orangePill, но у меня недостаточно репутации, чтобы комментировать.

У меня была эта проблема со статическими методами, и я сделал следующее, используя late static binding. Возможно, это помогает кому-то.

abstract class baseClass { 
    //protected since it makes no sense to call baseClass::method 
    protected static function method($parameter1) { 
     $parameter2 = static::getParameter2(); 

     return $parameter1.' '.$parameter2; 
    } 
} 

class myFirstClass extends baseClass { 
    //static value, could be a constant 
    private static $parameter2 = 'some value'; 

    public static function getParameter2() { 
     return self::$parameter2; 
    } 

    public static function method($parameter1) { 
     return parent::method($parameter1); 
    } 
} 

class mySecondClass extends baseClass { 
    private static $parameter2 = 'some other value'; 

    public static function getParameter2() { 
     return self::$parameter2; 
    } 

    public static function method($parameter1) { 
     return parent::method($parameter1); 
    } 
} 

Использование

echo myFirstClass::method('This uses'); // 'This uses some value' 

echo mySecondClass::method('And this uses'); // 'And this uses some other value' 
Смежные вопросы