abstract class DataKeeper {
protected $data;
public function setData($data) {
$this->data = $data;
}
public function getData() {
return $this->data;
}
abstract public function save()
abstract public function process()
}
class FileDataKeeper extend DataKeeper {
public function save() {
// implementation
}
public function process() {
// implementation
}
}
class Container {
protected static $classes = array();
public static function register($alias, $class) {
self::$classes[$alias] = $class;
}
public static function get($alias) {
if (!isset(self::$classes[$alias]))
throw new Exception("...");
$className = self::$classes[$alias];
return new $className();
}
}
// bootstrap.php
Container:register("dataKeeper", "FileDataKeeper");
// SomeWhere.php
$dataKeeper = Container::get("dataKeeper");
$keeper = new FileDataKeeper();
$someService->setDataKeeper($keeper);
// or
$keeper = new MysqlDataKeeper();
$someService->setDataKeeper($keeper);
class SomeService
{
// ...
public function setDataKeeper(DataKeeper $keeper)
{
// ...
}
// ...
}
Кроме того, если я захочу поменять реализацию хранения, заменив класс FileDataKeeper, например, на MySQLDataKeeper, интерфейс и открытые методы-то не изменятся, а вот «new FileDataKeeper» надо будет менять по всему проекту.
class DataKeeper implements IDataKeeper {
private $data;
public function setData($data) {
// реализация
}
public function getData() {
// реализация
}
public function saveData() {
// реализация
}
private function processData() {
// реализация
}
}
interface IDataKeeper {
public function getData();
public function setData($data);
public function saveData();
}
self.connect(self, SIGNAL("finished(QNetworkReply*)"), self.print_response)
self.finished.connect(self.print_response)
PySide.QtCore.QUrl('http://www.yandex.ru/data/mail.js?yaru=y') True
PySide.QtCore.QUrl('http://kiks.yandex.ru/system/fc06.html') True
PySide.QtCore.QUrl('http://kiks.yandex.ru/system/fc06.swf') True
PySide.QtCore.QUrl('http://suggest.yandex.ru/jquery-1-4-2.crossframeajax.html') True
$s = new SplObjectStorage();
$o1 = new StdClass;
$o1->a = 1;
$o2 = new StdClass;
$o2->a = 1;
$o3 = new StdClass;
$o3->b = 3;
$s->attach($o1);
$s->attach($o2);
$s->attach($o1);
$s->attach($o3);
var_dump(iterator_to_array($s));
array(3) {
[0]=>
object(stdClass)#2 (1) {
["a"]=>
int(1)
}
[1]=>
object(stdClass)#3 (1) {
["a"]=>
int(1)
}
[2]=>
object(stdClass)#4 (1) {
["b"]=>
int(3)
}