Как вызвать родительскую функцию из экземпляра дочернего элемента?
У меня есть модель
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();
}
который вызывает только родительский метод.