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

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

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

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

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

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

пример

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

Ответ 1

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

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

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 есть родитель или нет. Вот некоторые детали, о которых вам все равно.

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

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

Ответ 2

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

parent::delete();

Ответ 3

Почему вам нужно продлить 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

Ответ 4

Я думаю, что вы ищете родительские функции 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.

Ответ 5

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

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

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

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

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