PHP: Как вызвать функцию дочернего класса от родительского класса

Попробуйте это:

    var fs = require('fs');
    var obj;
    fs.readFile('./result.json', 'utf8', function (err, data) {
      if (err) throw err;
      obj = JSON.parse(data);
      console.log('title', obj.data.title);
    });
56
задан tereško 27 June 2017 в 11:08
поделиться

7 ответов

Для этого и предназначены абстрактные классы. Абстрактный класс в основном говорит: Кто бы ни наследул от меня, он должен иметь эту функцию (или эти функции).

abstract class whale
{

  function __construct()
  {
    // some code here
  }

  function myfunc()
  {
    $this->test();
  }

  abstract function test();
}


class fish extends whale
{
  function __construct()
  {
    parent::__construct();
  }

  function test()
  {
    echo "So you managed to call me !!";
  }

}


$fish = new fish();
$fish->test();
$fish->myfunc();
98
ответ дан 26 November 2019 в 17:05
поделиться

От кит экземпляр Вы не можете вызвать эту функцию. но от рыба экземпляр можно сделать

function myfunc()
{
    static::test();
}
0
ответ дан 26 November 2019 в 17:05
поделиться

Технически, вы не можете вызывать рыбный экземпляр (дочерний) из китового экземпляра (родительского), но так как вы имеете дело с наследованием, myFunc() все равно будет доступна в вашем рыбном экземпляре, так что вы можете вызывать $yourFishInstance->myFunc() напрямую.

Если вы обращаетесь к шаблону метода pattern, то просто напишите $this->test() в качестве тела метода. Вызов myFunc() из fish instance делегирует вызов на test() в fish instance. Но опять же, никакой вызов от китового экземпляра к рыбному экземпляру.

На боковой отметке, кит является млекопитающим, а не рыбой ;)

.
15
ответ дан 26 November 2019 в 17:05
поделиться

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

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

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

class whale
{
  function myfunc()
  {
      echo "I am a ".get_class($this);
  }
}

class fish extends whale
{
  function myfunc()
  {
     echo "I am always a fish.";
  }
}
1
ответ дан 26 November 2019 в 17:05
поделиться

Хорошо, ну, есть так много вещей неправильных в этом вопросе, что я на самом деле не знаю с чего начать.

Во-первых, рыба - это не киты, а киты - не рыба. Киты - млекопитающие.

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

В-третьих, в PHP вы можете просто сделать:

function myfunc() {
  $this->test();
}

В примере с китом это приведет к ошибке. В экземпляре fish это должно работать.

.
10
ответ дан 26 November 2019 в 17:05
поделиться

Я бы взял абстрактный класс....
. но в PHP вы не должны использовать их, чтобы заставить его работать. Даже вызов конструктора родительского класса является "нормальным" вызовом метода, и объект в данный момент полностью "работает", т.е. $this "знает" обо всех членах, наследуемых или нет.

class Foo
{
  public function __construct() {
    echo "Foo::__construct()\n";
    $this->init();
  }
}

class Bar extends Foo
{
  public function __construct() {
    echo "Bar::__construct()\n";
    parent::__construct();
  }

  public function init() {
    echo "Bar::init()\n";
  }
}

$b = new Bar;

печатает

Bar::__construct()
Foo::__construct()
Bar::init()

, т.е. даже если класс Foo ничего не знает о функции init(), то он может вызвать метод, так как поиск основан на том, на что $this является ссылкой.
. Это техническая сторона. Но вы действительно должны навязывать реализацию этого метода, либо делая его абстрактным (заставляя потомков реализовывать его), либо предоставляя реализацию по умолчанию, которая может быть перезаписана.

3
ответ дан 26 November 2019 в 17:05
поделиться

что, если кит не будет расширен? в результате чего вызов этой функции? К сожалению, это невозможно сделать.

О, а рыба продлевает кита? Рыба - это рыба, кит - млекопитающее.

-1
ответ дан 26 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: