2015-08-21 1 views
0
  1. Есть ли способ избавиться от метода getCopy() в производном классе HelloAndGoodbye, учитывая, что она выглядит так же, как getCopy () в базовом классе Hello?Удаление дубликатов, как функция, которая использует статическую для обозначения имени класса в PHP

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

(единственное различие между этими двумя функциями, что в 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 
+0

Есть ли хорошая причина для 'getCopy()' и 'doCopy()' существовать? Простой '$ copy = clone $ hello;' делает то же самое, что '$ copy = $ hello-> getCopy();' без необходимости использования двух функций, упомянутых выше. И если вам действительно нужна специальная инициализация копии, вы всегда можете реализовать ['__clone()'] (http://php.net/manual/en/language.oop5.cloning.php#object.clone). – axiac

+0

Ну, причина, по которой я не использовал клон и реализую __clone(), заключается в том, что в сценарии реального сценария, который я рассматриваю, некоторые объекты должны быть глубоко скопированы и некоторые мелкие скопированы, поэтому я решил написать свои собственные функции. doCopy() отделяется от getCopy(), так что он может быть вызван из подкласса: таким образом добавление свойства к родительскому классу будет означать, что мне нужно только добавить код в doCopy() в родительский класс, а не дублировать этот код в подклассе. –

+0

Рассмотрим случай, когда $ hello и $ goodbye будут объектами, а не примитивными строковыми типами данных. –

ответ

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 
Смежные вопросы