Как вызвать родительскую функцию из экземпляра дочернего элемента?

У меня есть модель

BaseUser.class.php User.class.php UserTable.class.php 

В пользовательском классе I была отменена функция удаления

 class User extends BaseUser { function delete(){ } } 

Теперь, если я хочу вызвать родительскую функцию удаления …. как?

пример

 $user = new User(); $user->delete(); // will call the overridden delete $user-> ?? ; // want to call parent delete 

Solutions Collecting From Web of "Как вызвать родительскую функцию из экземпляра дочернего элемента?"

Технически это невозможно из «внешнего» (публичного интерфейса) по уважительной причине.

Если вы поняли, почему (иначе читайте ниже), и вы действительно знаете, что вы делаете, нет причин фактически не предлагать функциональность:

 class User extends BaseUser { ... function parentDelete(){ parent::delete(); } ... } user = new User(); $user->delete(); // will call the overridden delete $user->parentDelete(); // want to call parent delete 

Однако, если вы когда-нибудь это сделаете, вы должны знать, что вы неправильно использовали наследование. Это должно быть исключительной ситуацией, поскольку я не могу представить себе ситуацию, в которой вам действительно нужно это делать вообще.

Поэтому попробуйте сформулировать, почему вам нужна эта функциональность, чтобы дать вам лучшие предложения.

Почему это плохо?

По очень простой причине: в вашем программном обеспечении вам не нужно знать, что у $user есть родитель или нет. Вот некоторые детали, о которых вам все равно.

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

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

возможно, попробуй это

 parent::delete(); 

Я думаю, что вы ищете родительские функции PHP:

 <?php class A { function example() { echo "I am A::example() and provide basic functionality.<br />\n"; } } class B extends A { function example() { echo "I am B::example() and provide additional functionality.<br />\n"; parent::example(); } } $b = new B; // This will call B::example(), which will in turn call A::example(). $b->example(); ?> 

Если ваш класс не имеет функции, называемой getMyFunction (), вызывающей $b->getMyFuction() , вызывается родительская функция. Если это так, он вызовет дочернюю функцию, если дочерняя функция не вызовет функцию prent.

Почему вам нужно продлить delete если вам нужно вызвать родителя один раз?

Почему бы не создать пользовательское удаление?

Подобно:

 public function customDelete() { parent::delete(); // do extends delete here } 

Затем вы можете удалить объект, используя ->customDelete() а также вы можете вызвать метод удаления из родителя, поскольку вы не переопределили метод delete() :

 $user = new User(); $user->customDelete(); // will call the overridden delete $user->delete(); // will call the parent (since you didn't override it) 

И если вам действительно нужно переопределить функцию delete() , вы все равно можете создать своего рода родительское удаление:

 public function parentDelete() { return parent::delete(); } 

Затем:

 $user = new User(); $user->delete(); // will call the overridden delete $user->parentDelete(); // will call the method that only call the parent 

Я нашел эту тему на codingforums. То, что он говорит (и я с ними согласен) состоит в том, что если у вас есть переопределенная функция / метод в дочернем классе, экземпляр этого объекта ВСЕГДА вызовет дочерний метод.

parent ключевое слово сродни $this или self и может быть вызвано только внутри самого класса.

Если вы хотите, чтобы дочерний объект мог вызвать родительский метод, просто создайте другой метод

 function parentExample() { parent::example(); } 

который вызывает только родительский метод.