Строка формата может состоять из следующих элементов для месяцев:
«ММММ»: месяц в году (январь-декабрь) - {{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
Это довольно просто, особенно для динамически типизированного языка, такого как 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
Вы также можете прочитать статью в википедии .
Я бы посоветовал вам также создать унифицированный интерфейс (или даже абстрактный базовый класс) для декораторов и объектов, которые вы хотите декорировать.
Чтобы продолжить приведенный выше пример, при условии, что вы могли бы иметь что-то вроде:
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());
}
}
Зачем использовать интерфейс?
Потому что тогда вы можете добавить сколько угодно декораторов, и будьте уверены, что каждый декоратор (или объект, который нужно декорировать) будет иметь все необходимые функции.