, 1 , , plugin2 1 :
PHP spl_autoload
// Your custom class dir
define('CLASS_DIR', 'class/')
// Add your class dir to include path
set_include_path(get_include_path().PATH_SEPARATOR.CLASS_DIR);
// You can use this trick to make autoloader look
// for commonly used "My.class.php" type filenames
spl_autoload_extensions('.class.php');
// Use default autoload implementation
spl_autoload_register();
, , /- , . PHP . API, .
Decorators:
$class = new BasicCache( new BasicValidators ( new Basic ) );
:
$class = new Basic;
$class->setStrategy(function() { return 'foo'} );
echo $class->callStrategy();
$class->setStrategy(function() { return 'bar'} );
echo $class->callStrategy();
. http://sourcemaking.com/design_patterns .
EDIT . , , - . , . , , / .
, , , . , , . , :
interface GreetInterface
{
public function greet($name);
public function setGreeting($greeting);
}
- , . , , , . , .
- ,
class Dude implements GreetInterface
{
protected $greeting = 'hello';
public function greet($name)
{
return sprintf('%s %s', $this->greeting, $name);
}
public function setGreeting($greeting)
{
$this->greeting = $greeting;
return $this;
}
}
, . Dude . greet(), , , , greet. setGreeting . : ( )
. GreetPlugin, , , . GreetInterface, , .
Dude , Dude, , is-a, Dude.
abstract class GreetPluginAbstract implements GreetInterface
{
protected $inner;
public function __construct(GreetInterface $inner)
{
$this->inner = $inner;
}
public function setGreeting($greeting)
{
$this->inner->setGreeting($greeting);
return $this;
}
public function greet($name)
{
return $this->inner->greet($name);
}
}
plugin : , GreetInterface. TypeHint , . , , , , . , , . .
. , , , , h. : , . ,
class FrenchPlugin extends GreetPluginAbstract
{
public function greet($name) {
return str_replace(array('h', 'e'), array('', 'é'),
$this->inner->greet($name));
}
}
, , , . greet(), greet() , h- es és. - .
, , Heya, Hello. .
class EasyGoingPlugin extends GreetPluginAbstract
{
protected $inner;
public function __construct(GreetInterface $inner) {
$this->inner = $inner->setGreeting('heya');
parent::__construct($inner);
}
}
, , greet , . setGreeting , . GreetInterface, , .
, setGreeting . , $this, setMethod. , . , : .
, , . Dudes. :
class DudeBuilder
{
public static function build()
{
$dude = new Dude();
$decorators = func_get_args();
foreach($decorators as $decorator) {
$decorator .= "Plugin";
$dude = new $decorator($dude);
}
return $dude;
}
}
. Builder AbstractFactory, , Factory, , a factory. , ;)
Builder , , / / , , . , .
, , . , foreach. , , , . , , , , . . , PHP. , , , .
$regularDude = DudeBuilder::build();
$frenchDude = DudeBuilder::build('French');
$easygoingDude = DudeBuilder::build('EasyGoing');
$frenchEasyGoingDude = DudeBuilder::build('French', 'EasyGoing');
, :
$regularDude = new Dude;
$frenchDude = new FrenchPlugin(new Dude);
$easygoingDude = new EasyGoingPlugin(new Dude);
$frenchEasyGoingDude = new FrenchPlugin(new EasyGoingPlugin(new Dude));
Dudes. :
echo $regularDude->greet('Yuri'), PHP_EOL,
$frenchDude->greet('Yuri'), PHP_EOL,
$easygoingDude->greet('Yuri'), PHP_EOL,
$frenchEasyGoingDude->greet('Yuri'), PHP_EOL;
hello Yuri
éllo Yuri
heya Yuri
éya Yuri
. - , , Car Horse, Builder. EasyGoing .