<?php
/*
Паттерн "Билдер"
Например, у нас есть какой-то класс
с определёнными полями
и методом создания
но мы не знаем заранее всех полей,
а объект создать и пользовать хотим
*/
class Window
{
private $visible;
private $modal;
function __construct( $v, $m ) {
$this->visible = $v;
$this->modal = $m;
}
function getIsVisible() {
return ( $this->visible ? 'On' : 'Off' );
}
}
/*
Создадим вспомогательный класс,
который будет определять поля основного
*/
class CreateWindow {
function setVisible( $flag ) { $this->visible = $flag; return $this; }
function setModal( $flag ) { $this->modal = $flag; return $this; }
function render() {
return new Window( $this->visible, $this->modal );
}
}
$WindowBuilder = new CreateWindow;
$Window = $WindowBuilder->setVisible( true )->setModal( false )->render();
echo $Window->getIsVisible();
PD9waHAKLyoKICDQn9Cw0YLRgtC10YDQvSAi0JHQuNC70LTQtdGAIgogIAogINCd0LDQv9GA0LjQvNC10YAsINGDINC90LDRgSDQtdGB0YLRjCDQutCw0LrQvtC5LdGC0L4g0LrQu9Cw0YHRgSAKICDRgSDQvtC/0YDQtdC00LXQu9GR0L3QvdGL0LzQuCDQv9C+0LvRj9C80LggCiAg0Lgg0LzQtdGC0L7QtNC+0Lwg0YHQvtC30LTQsNC90LjRjwogIAogINC90L4g0LzRiyDQvdC1INC30L3QsNC10Lwg0LfQsNGA0LDQvdC10LUg0LLRgdC10YUg0L/QvtC70LXQuSwKICDQsCDQvtCx0YrQtdC60YIg0YHQvtC30LTQsNGC0Ywg0Lgg0L/QvtC70YzQt9C+0LLQsNGC0Ywg0YXQvtGC0LjQvCAKKi8KY2xhc3MgV2luZG93CnsKICBwcml2YXRlICR2aXNpYmxlOwogIHByaXZhdGUgJG1vZGFsOwogIAogIGZ1bmN0aW9uIF9fY29uc3RydWN0KCAkdiwgJG0gKSB7CiAgICAkdGhpcy0+dmlzaWJsZSA9ICR2OwogICAgJHRoaXMtPm1vZGFsID0gJG07CiAgICAKICB9CiAgCiAgZnVuY3Rpb24gZ2V0SXNWaXNpYmxlKCkgewogICAgcmV0dXJuICggICR0aGlzLT52aXNpYmxlID8gJ09uJyA6ICdPZmYnICk7CiAgICAKICB9CiAgCn0KCgovKgogINCh0L7Qt9C00LDQtNC40Lwg0LLRgdC/0L7QvNC+0LPQsNGC0LXQu9GM0L3Ri9C5INC60LvQsNGB0YEsCiAg0LrQvtGC0L7RgNGL0Lkg0LHRg9C00LXRgiDQvtC/0YDQtdC00LXQu9GP0YLRjCDQv9C+0LvRjyDQvtGB0L3QvtCy0L3QvtCz0L4KKi8KY2xhc3MgQ3JlYXRlV2luZG93IHsKICBmdW5jdGlvbiBzZXRWaXNpYmxlKCAkZmxhZyApIHsgJHRoaXMtPnZpc2libGUgPSAkZmxhZzsgcmV0dXJuICR0aGlzOyB9CiAgZnVuY3Rpb24gc2V0TW9kYWwoICRmbGFnICkgeyAkdGhpcy0+bW9kYWwgPSAkZmxhZzsgcmV0dXJuICR0aGlzOyB9CiAgCiAgZnVuY3Rpb24gcmVuZGVyKCkgewogICAgcmV0dXJuIG5ldyBXaW5kb3coICR0aGlzLT52aXNpYmxlLCAkdGhpcy0+bW9kYWwgKTsKICAgIAogIH0KICAKfQoKJFdpbmRvd0J1aWxkZXIgPSBuZXcgQ3JlYXRlV2luZG93OwokV2luZG93ID0gJFdpbmRvd0J1aWxkZXItPnNldFZpc2libGUoIHRydWUgKS0+c2V0TW9kYWwoIGZhbHNlICktPnJlbmRlcigpOwoKZWNobyAkV2luZG93LT5nZXRJc1Zpc2libGUoKTsK