Есть ли способ избавиться от метода getCopy() в производном классе HelloAndGoodbye, учитывая, что она выглядит так же, как getCopy () в базовом классе Hello?Удаление дубликатов, как функция, которая использует статическую для обозначения имени класса в PHP
И более того, что является эффективным способом достижения этого?
(единственное различие между этими двумя функциями, что в BaseClass «статическое» относится к «Привет» и в производном классе «статической» относится к «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
Есть ли хорошая причина для 'getCopy()' и 'doCopy()' существовать? Простой '$ copy = clone $ hello;' делает то же самое, что '$ copy = $ hello-> getCopy();' без необходимости использования двух функций, упомянутых выше. И если вам действительно нужна специальная инициализация копии, вы всегда можете реализовать ['__clone()'] (http://php.net/manual/en/language.oop5.cloning.php#object.clone). – axiac
Ну, причина, по которой я не использовал клон и реализую __clone(), заключается в том, что в сценарии реального сценария, который я рассматриваю, некоторые объекты должны быть глубоко скопированы и некоторые мелкие скопированы, поэтому я решил написать свои собственные функции. doCopy() отделяется от getCopy(), так что он может быть вызван из подкласса: таким образом добавление свойства к родительскому классу будет означать, что мне нужно только добавить код в doCopy() в родительский класс, а не дублировать этот код в подклассе. –
Рассмотрим случай, когда $ hello и $ goodbye будут объектами, а не примитивными строковыми типами данных. –