2012-05-11 3 views
4

У меня вопрос о расширении класса в PHP.PHP, расширяющий класс

Примеры, которые я вижу на сайте php, имеют только одну строку кода в методе ... это то же самое, если метод имеет тонны кода?

Если это базовый класс:

class BaseClass { 

    public function WithWayTooMuchCode { 
     // like 100 lines of code here 
    } 

} 

Тогда я должен скопировать весь код более, если я хочу использовать тот же метод, но изменить только 1 или 2 вещи?

class MyOwnClass extends BaseClass { 
    public function WithWayTooMuchCode { 
     // like 100 lines of code here 

    // do I have to copy all of the other code and then add my code?? 
    } 

} 

Это, кажется, немного не DRY мне ...

+0

Да, вы должны это сделать, но вы можете написать обходное решение и разделить большую функцию на отдельные функции и только перезаписать их. –

+0

Действительно. С модульной конструкцией OO это не будет (очень неприятная) проблема. – TaZ

+3

@ JohannesKlauß ** NO. NO. NO. НЕТ. ** Вы ошибаетесь на 100% *. – rdlowrey

ответ

4

Да, если эти 1 или 2 вещи случится быть в начале или в конце. Вы можете вызвать родительскую функцию через

parent::WithWayTooMuchCode(); 

Что вы можете разместить где угодно в режиме ребенка/переопределения.

Если он не чувствует СУХОЙ, рассмотрите возможность разделения функции на более мелкие методы.

+0

Таким образом, вы имеете в виду разбить BaseClass на более мелкие методы или MyOwnClass на более мелкие методы? В любом случае вы могли бы указать мне пример кода (я искал, но не повезло). Спасибо! – redconservatory

+1

@redconservatory: Ни то, ни другое. Вы хотите разделить 'WithWayTooMuchCode' на более мелкие методы; если основная часть кода находится в версии, находящейся в базовом классе, а затем добавьте вспомогательные методы в базу. Если вы не нуждаетесь в них в базе, поместите их в производный класс. Идея поставить их как можно ближе к тому, где они вам нужны. Вы также можете подумать о том, чтобы сделать их частными, если они вам не нужны, чтобы они были общедоступными. Я не могу указать вам на примеры ... все, что вы делаете, разбивает большую функцию на более мелкие функции. – mpen

4

Должен ли я скопировать весь код, если я хочу использовать тот же метод, , но изменить только 1 или 2 вещи?

Нет, вам не нужно копировать весь код, предполагая, что вы добавляете функцию и не удаляете ее.

так следующим образом:

class BaseClass { 

    public function WithWayTooMuchCode { 
     // like 100 lines of code here 
    } 

} 

class MyOwnClass extends BaseClass { 

    public function WithWayTooMuchCode { 
     parent::WithWayTooMuchCode(); 
     //additionally, do something else 
    } 

} 

$moc = new MyOwnClass(); 
$moc->WithWayTooMuchCode(); 
2

Вы можете использовать родительский :: WithWayTooMuchCode() Wich будет выполнять родительский метод и после того, как вы можете добавить свой код. Он будет выглядеть следующим образом:

class MyOwnClass extends BaseClass { 
    public function WithWayTooMuchCode { 
     parent::WithWayTooMuchCode() 

    // do I have to copy all of the other code and then add my code?? 
    } 

} 
1

Вы можете записать отдельную функцию для того, что вещи, которые вы хотите сделать отдельно в родительском классе, а затем позвони тогда в вас способом.

Другими словами, выделите то, что вам нужно сделать отдельно, и создайте для них функцию. И назовите их отдельно в классе детей. Последняя функция в дочернем классе вызовет функцию родительского класса, а также отдельные функции.

1

У вас есть несколько вариантов. Предполагая;

class BaseClass { 

    public function WithWayTooMuchCode { 
     // like 100 lines of code here 
     } 
    } 

Вы можете сделать

class MyOwnClass extends BaseClass { 
    public function AnotherFunction() { 
     // put other code here 
    } 

} 

Это позволяет сделать MyOwnClass-> AnotherFunction() и MyOwnClass-> WithWayTooMuchCode()

или вы могли бы сделать

class MyOwnClass extends BaseClass { 
    public function WithWayTooMuchCode() { 
     // put new code here 
    } 

} 

который позволит вам запустить MyOwnClass-> WithWayTooMuchCode() и будет ТОЛЬКО запускать «новый код», а не «100 строк».

Наконец, вы могли бы сделать

class MyOwnClass extends BaseClass { 
    public function WithWayTooMuchCode() { 
     parent::WithWayTooMuchCode(); 
     // Do more processing 
    } 

} 

, который позволит запускать MyOwnClass-> WithWayTooMuchCode() будет работать «100 строк кода» и новый код. Вы можете поместить родителя до/после/во время вашего нового кода, чтобы его можно было адаптировать по мере необходимости.

0

В дополнение к другим ответам я должен указать, что эту проблему можно решить событиями. Это способ определить точки в классе, где вы можете добавить свои собственные функции извне. Если у вас есть контроль над кодовой базой и временем/наклоном, вы можете рассмотреть возможность реализации этой функции. К сожалению, PHP не поддерживает их напрямую в том смысле, что, скажем, C#, вам нужно будет сделать work.

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

Смежные вопросы