Удаление дублирующейся функции, которая использует static для обозначения имени класса в переполнении стека

  1. Есть ли способ избавиться от метода getCopy () в производном классе HelloAndGoodbye, учитывая, что он выглядит так же, как getCopy () в базовом классе Hello?

  2. И что более того, какой эффективный способ добиться этого?

(единственное различие между этими двумя функциями заключается в том, что в базовом классе «static» ссылается на «Hello», а в производном классе «static» ссылается на «HelloAndGoodbye»; что касается содержащихся в них переменных, их можно легко переименовать, чтобы они то же самое в обеих функциях).

<?php

class Hello {

private $hello;

public function createStub() {

return new static(null);

}

public function __construct($hello) {

$this->setHello($hello);

}

public function getCopy() {

$helloCopy = static::createStub();

$this->doCopy($helloCopy);

return $helloCopy;

}

public function doCopy($helloCopy) {

$helloCopy->setHello($this->hello);

}

public function setHello($hello) {

$this->hello = $hello;

}

public function getHello($hello) {

return $this->hello;

}

public function __toString() {

return $this->hello . "\n";

}

}

class HelloAndGoodbye extends Hello {

private $goodbye;

public function createStub() {

return new static(null, null);

}

public function __construct($hello, $goodbye) {

parent::__construct($hello);

$this->setGoodbye($goodbye);

}

public function getCopy() {

$helloAndGoodbyeCopy = static::createStub();

$this->doCopy($helloAndGoodbyeCopy);

return $helloAndGoodbyeCopy;

}

public function doCopy($helloAndGoodbyeCopy) {

parent::doCopy($helloAndGoodbyeCopy);

$helloAndGoodbyeCopy->setGoodbye($this->goodbye);

}

public function setGoodbye($goodbye) {

$this->goodbye = $goodbye;

}

public function getGoodbye($goodbye) {

return $this->goodbye;

}

public function __toString() {

return parent::__toString() . $this->goodbye . "\n";

}

}

function test() {

$hello = new Hello("Hello John");

$helloAndGoodbye = new HelloAndGoodbye("Hello Jane", "Goodbye Jane");

echo $hello;

echo $helloAndGoodbye;

}

test();

ВЫХОД:

Hello John
Hello Jane
Goodbye Jane

0

Решение

Я нашел решение этой проблемы с помощью __CLASS__ PHP константа, которая соответствует имени класса, в котором она появляется. Это позволило мне избавиться от псевдо-дубликата метода getCopy () в производном классе, в то же время позволяя getCopy () нормально работать на обоих:

<?php

class Hello {

private $hello;

public function createStub() {

return new static(null);

}

public function __construct($hello) {

$this->setHello($hello);

}

public function getCopy() {

$class = __CLASS;

$instanceCopy = $class::createStub();

$this->doCopy($instanceCopy);

return $instanceCopy;

}

public function doCopy($helloCopy) {

$helloCopy->setHello($this->hello);

}

public function setHello($hello) {

$this->hello = $hello;

}

public function getHello($hello) {

return $this->hello;

}

public function __toString() {

return $this->hello . "\n";

}

}

class HelloAndGoodbye extends Hello {

private $goodbye;

public function createStub() {

return new static(null, null);

}

public function __construct($hello, $goodbye) {

parent::__construct($hello);

$this->setGoodbye($goodbye);

}

public function doCopy($helloAndGoodbyeCopy) {

parent::doCopy($helloAndGoodbyeCopy);

$helloAndGoodbyeCopy->setGoodbye($this->goodbye);

}

public function setGoodbye($goodbye) {

$this->goodbye = $goodbye;

}

public function getGoodbye($goodbye) {

return $this->goodbye;

}

public function __toString() {

return parent::__toString() . $this->goodbye . "\n";

}

}

function test() {

$hello = new Hello("Hello John");

$helloAndGoodbye = new HelloAndGoodbye("Hello Jane", "Goodbye Jane");

echo $hello;

echo $helloAndGoodbye;

}

test();

ВЫХОД:

Hello John
Hello Jane
Goodbye Jane
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]