Как реализовать декоратора в PHP?

Строка формата может состоять из следующих элементов для месяцев:

«ММММ»: месяц в году (январь-декабрь) - {{D_V | date:'yyyy-MMMM-dd'}}

«МММ»: месяц в году (Январь-декабрь) - {{D_V | date:'yyyy-MMM-dd'}}

«ММ»: с добавлением месяца в году (01-12) - {{D_V | date:'yyyy-MM-dd'}}

«М»: месяц в году (1-12 ) - {{D_V | date:'yyyy-M-dd'}}

Узнайте больше на Angular JS Date Filter

31
задан ROMANIA_engineer 3 November 2017 в 21:23
поделиться

2 ответа

Это довольно просто, особенно для динамически типизированного языка, такого как PHP:

class Text {

    protected $string;

    /**
     * @param string $string
     */
    public function __construct($string) {
        $this->string = $string;
    }

    public function __toString() {
        return $this->string;
    }
}

class LeetText {

    protected $text;

    /**
     * @param Text $text A Text object.
     */
    public function __construct($text) {
        $this->text = $text;
    }

    public function __toString() {
        return strtr($this->text->__toString(), 'eilto', '31170');
    }
}

$text = new LeetText(new Text('Hello world'));
echo $text; // H3110 w0r1d

Вы также можете прочитать статью в википедии .

34
ответ дан 27 November 2019 в 21:30
поделиться

Я бы посоветовал вам также создать унифицированный интерфейс (или даже абстрактный базовый класс) для декораторов и объектов, которые вы хотите декорировать.

Чтобы продолжить приведенный выше пример, при условии, что вы могли бы иметь что-то вроде:

interface IDecoratedText
{
    public function __toString();
}

Затем, конечно, измените и Text , и LeetText , чтобы реализовать интерфейс.

class Text implements IDecoratedText
{
...//same implementation as above
}

class LeetText implements IDecoratedText
{    
    protected $text;

    public function __construct(IDecoratedText $text) {
        $this->text = $text;
    }

    public function __toString() {
        return str_replace(array('e', 'i', 'l', 't', 'o'), array(3, 1, 1, 7, 0), $this->text->toString());
    }

}

Зачем использовать интерфейс?

Потому что тогда вы можете добавить сколько угодно декораторов, и будьте уверены, что каждый декоратор (или объект, который нужно декорировать) будет иметь все необходимые функции.

43
ответ дан 27 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

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