4. Магия в PHP
class Component {
public $publicProperty;
protected $_protectedProperty;
public function setProtectedProperty($value) {
$this->_protectedProperty = $value;
return true;
}
public function getProtectedProperty() {
return $this->_protectedProperty;
}
}
5. class Component {
public function __get($propertyName) {
$methodName = 'get'.$propertyName;
if (method_exists($this, $methodName)) {
return call_user_func( array($this, $methodName) );
} else {
throw new Exception("Missing property {$propertyName}'!");
}
}
public function __set($propertyName, $value) {
$methodName = 'set'.$propertyName;
if (method_exists($this, $methodName)) {
return call_user_func( array($this, $methodName), $value );
} else {
throw new Exception("Missing property {$propertyName}'!");
}
}
7. Автозагрузка классов
Подключение файлов по принципу DLL:
require_once('components/SomeClass.php');
$someObj = new SomeClass();
…
require_once('components/OtherClass.php');
$otherObj = new OtherClass();
…
require_once('components/SomeClass.php');
$anotherSomeObj = new SomeClass();
8. class Autoloader {
public function autoload($className) {
$classFileName = ‘components/'.$className.'.php';
if (file_exists($classFileName)) {
require_once($classFileName);
return true;
}
return false;
}
public function register() {
return spl_autoload_register( array($this, 'autoload') );
}
public function __construct() {
$this->register();
}
}
9. Автозагрузка классов в контексте Yii:
Yii::import(‘application.components.SomeClass');
Yii::import(‘application.components.OtherClass');
…
$someObj = new SomeClass();
«Карта» автозагрузки классов:
‘SomeComponent’ => ‘/home/www/…/components/SomeClass.php’,
‘OtherComponent’ => ‘/home/www/…/components/OtherClass.php’,
10. Порождение компонентов
function createComponent(array $componentConfig) {
$className = $componentConfig['class'];
if (empty($className)) {
throw new Exception(‘Missing parameter "class"!');
}
unset($componentConfig['class']);
if (!class_exists($className)) {
Yii::import($className); // Автозагрузка
}
$component = new $className();
foreach($componentConfig as $name=>$value) {
$component->$name = $value; // Конфигурация
}
return $component;
}
11. Задание любого объекта через массив:
$componentConfig = array(
'class'=>'CUrlManager',
'urlFormat'=>'path',
'showScriptName'=>false,
'rules'=>array(
'/'=>'site/index',
'<controller:w+>/<id:d+>*'=>'<controller>/view',
),
);
$component = createComponent($componentConfig);
12. Фабрика компонентов
“Request component
by name”
Factory Client
$componentsConfig
$components “Create and store
1 by name”
createComponent() * Component
getComponent()
ComponentA ComponentB …
13. Одиночка (Singleton)
class Singleton {
private static $_selfInstance = null;
public static function getInstance() {
if (!is_object(self::$_selfInstance)) {
self::$_selfInstance = new Singleton();
}
return self::$_selfInstance;
}
private function __construct() {
// закрытый конструктор
}
}
$singleton = Singleton::getInstance();
24. Проблема множественного
наследования
ActiveRecord
ArPosition ArFile
Save custom records Bind physical file with
display order the db record
ArPositionFile
Position + File
26. class ArBehaviorExample extends CBehavior {
public function behaviorMethod() {
$owner = $this->getOwner();
$owner->create_date = date('Y-m-d H:i:s', strtotime('NOW'));
}
}
$user = new User();
// Добавляем поведение:
$behavior = new ArBehaviorExample();
$user->attachBehavior($behavior);
// Вызываем метод поведения:
$user->behaviorMethod();
echo $user->create_date; // Вывод: ‘2012-03-22 16:46’
27. Yii
• Динамический код
• Компонентная структура
• Приложение = «одиночка» + «фабрика»
• Отложенная загрузка и создание
объектов
• MVC
• «PDO» и «Active Record»
• События
• Поведения