CComponent
| Пакет | system.base |
|---|---|
| Наследование | class CComponent |
| Подклассы | CAccessRule, CAction, CActiveFinder, CApplicationComponent, CAuthAssignment, CAuthItem, CBaseActiveRelation, CBaseController, CBaseUrlRule, CBaseUserIdentity, CBehavior, CCacheDependency, CChainedCacheDependency, CChainedLogFilter, CCodeFile, CConsoleCommand, CConsoleCommandRunner, CDataProvider, CDataProviderIterator, CDateFormatter, CDbColumnSchema, CDbCommand, CDbCommandBuilder, CDbCriteria, CDbDataReader, CDbExpression, CDbMigration, CDbSchema, CDbTableSchema, CDbTransaction, CEvent, CFilter, CFormElement, CGettextFile, CGridColumn, CHttpCookie, CList, CLocale, CLogFilter, CLogRoute, CLogger, CMap, CMemCacheServerConfiguration, CModel, CModule, CNumberFormatter, CPagination, CQueue, CSort, CStack, CTheme, CUploadedFile, CValidator, CWebService, CWsdlGenerator |
| С тех пор | 1.0 |
| Исходный код | framework/base/CComponent.php |
CComponent реализует протокол определения, использования свойств и событий.
Свойство определяется методом-геттером и/или методом-сеттером. К свойствам можно обращаться так же, как к обычным членам объекта. Чтение или запись свойства вызовет вызов соответствующего метода-геттера или метода-сеттера, например
$a=$component->text; // equivalent to $a=$component->getText();
$component->text='abc'; // equivalent to $component->setText('abc');
Подписи методов-геттера и метода-сеттера следующие,
// getter, defines a readable property 'text'
public function getText() { ... }
// setter, defines a writable property 'text' with $value to be set to the property
public function setText($value) { ... }
Событие определяется наличием метода, имя которого начинается с 'on'. Имя события — имя метода. Когда поднимается событие, к нему будут автоматически вызваны функции (так называемые обработчики событий) в порядке их подключения к событию. Обработчики событий должны иметь следующий формат,
function eventHandler($event) { ... }
где $event содержит параметры, связанные с событием. Чтобы подключить обработчик событий к событию, см. attachEventHandler. Также можно использовать следующий синтаксис:
$component->onClick=$callback; // or $component->onClick->add($callback);где $callback относится к допустимому PHP-обработчику. Ниже приведены примеры обработчиков:
'handleOnClick' // handleOnClick() is a global function
array($object,'handleOnClick') // using $object->handleOnClick()
array('Page','handleOnClick') // using Page::handleOnClick()
Для поднятия события используйте raiseEvent. Метод on, определяющий событие, обычно записывается следующим образом:
public function onClick($event)
{
$this->raiseEvent('onClick',$event);
}
где $event — экземпляр CEvent или его дочернего класса. Затем можно вызвать событие, вызвав метод on, вместо прямого вызова raiseEvent. Имена свойств и событий регистронезависимы.
CComponent поддерживает поведения. Поведение — экземпляр IBehavior, подключенный к компоненту. К методам поведения можно обращаться так, как будто они принадлежат компоненту. К одному и тому же компоненту можно подключить несколько поведений.
Чтобы подключить поведение к компоненту, вызовите attachBehavior; чтобы отключить поведение от компонента, вызовите detachBehavior.
Поведение можно временно включить или выключить, вызвав соответственно enableBehavior или disableBehavior. При отключении методы поведения не могут быть вызваны через компонент.
Начиная с версии 1.1.0, к свойствам поведения (будь то его общедоступные переменные-члены или свойства, определенные с помощью геттеров и/или сеттеров) можно получить доступ через компонент, к которому оно подключено.
Публичные методы
| Метод | Описание | Определено |
|---|---|---|
| __call() | Вызывает именованный метод, который не является методом класса. | CComponent |
| __get() | Возвращает значение свойства, список обработчиков событий или поведение по его имени. | CComponent |
| __isset() | Проверяет, является ли значение свойства нулевым. | CComponent |
| __set() | Устанавливает значение свойства компонента. | CComponent |
| __unset() | Устанавливает свойство компонента в null. | CComponent |
| asa() | Возвращает объект поведения с заданным именем. | CComponent |
| attachBehavior() | Подключает поведение к этому компоненту. | CComponent |
| attachBehaviors() | Подключает список поведений к компоненту. | CComponent |
| attachEventHandler() | Подключает обработчик событий к событию. | CComponent |
| canGetProperty() | Определяет, можно ли считать свойство. | CComponent |
| canSetProperty() | Определяет, можно ли установить свойство. | CComponent |
| detachBehavior() | Отключает поведение от компонента. | CComponent |
| detachBehaviors() | Отключает все поведения от компонента. | CComponent |
| detachEventHandler() | Отсоединяет существующий обработчик событий. | CComponent |
| disableBehavior() | Отключает подключенное поведение. | CComponent |
| disableBehaviors() | Отключает все подключенные к этому компоненту поведения. | CComponent |
| enableBehavior() | Включает подключенное поведение. | CComponent |
| enableBehaviors() | Включает все подключенные к этому компоненту поведения. | CComponent |
| evaluateExpression() | Вычисляет PHP-выражение или обработчик в контексте этого компонента. | CComponent |
| getEventHandlers() | Возвращает список подключенных обработчиков событий для события. | CComponent |
| hasEvent() | Определяет, задано ли событие. | CComponent |
| hasEventHandler() | Проверяет, есть ли прикрепленные обработчики к событию с данным именем. | CComponent |
| hasProperty() | Определяет, определено ли свойство. | CComponent |
| raiseEvent() | Поднимает событие. | CComponent |
Подробности методов
__call() метод
public mixed __call(string $name, array $parameters) | ||
| $name | string | имя метода |
| $parameters | array | параметры метода |
| {return} | mixed | значение возврата метода |
public function __call($name,$parameters)
{
if($this->_m!==null)
{
foreach($this->_m as $object)
{
if($object->getEnabled() && method_exists($object,$name))
return call_user_func_array(array($object,$name),$parameters);
}
}
if(class_exists('Closure', false) && ($this->canGetProperty($name) || property_exists($this, $name)) && $this->$name instanceof Closure)
return call_user_func_array($this->$name, $parameters);
throw new CException(Yii::t('yii','{class} and its behaviors do not have a method or closure named "{name}".',
array('{class}'=>get_class($this), '{name}'=>$name)));
}
Вызывает именованный метод, который не является методом класса. Не вызывайте этот метод. Это магический PHP-метод, который мы переопределяем для реализации функции поведения.
__get() метод
public mixed __get(string $name) | ||
| $name | string | имя свойства или имя события |
| {return} | mixed | значение свойства, обработчики событий, подключенные к событию, или поведение с заданным именем |
public function __get($name)
{
$getter='get'.$name;
if(method_exists($this,$getter))
return $this->$getter();
elseif(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
{
// duplicating getEventHandlers() here for performance
$name=strtolower($name);
if(!isset($this->_e[$name]))
$this->_e[$name]=new CList;
return $this->_e[$name];
}
elseif(isset($this->_m[$name]))
return $this->_m[$name];
elseif(is_array($this->_m))
{
foreach($this->_m as $object)
{
if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))
return $object->$name;
}
}
throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
array('{class}'=>get_class($this), '{property}'=>$name)));
}
Возвращает значение свойства, список обработчиков событий или поведение на основе его имени. Не вызывать этот метод. Это магический метод PHP, который мы переопределяем, чтобы разрешить использование следующего синтаксиса для чтения свойства или получения обработчиков событий:
$value=$component->propertyName; $handlers=$component->eventName;
См. также
__isset() метод
public boolean __isset(string $name) | ||
| $name | string | имя свойства или имя события |
| {return} | boolean | |
public function __isset($name)
{
$getter='get'.$name;
if(method_exists($this,$getter))
return $this->$getter()!==null;
elseif(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
{
$name=strtolower($name);
return isset($this->_e[$name]) && $this->_e[$name]->getCount();
}
elseif(is_array($this->_m))
{
if(isset($this->_m[$name]))
return true;
foreach($this->_m as $object)
{
if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))
return $object->$name!==null;
}
}
return false;
}
Проверяет, является ли значение свойства null. Не вызывать этот метод. Это магический метод PHP, который мы переопределяем, чтобы разрешить использование isset() для определения, установлено ли свойство компонента или нет.
__set() метод
public mixed __set(string $name, mixed $value) | ||
| $name | string | имя свойства или имя события |
| $value | mixed | значение свойства или обратный вызов |
| {return} | mixed | |
public function __set($name,$value)
{
$setter='set'.$name;
if(method_exists($this,$setter))
return $this->$setter($value);
elseif(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
{
// duplicating getEventHandlers() here for performance
$name=strtolower($name);
if(!isset($this->_e[$name]))
$this->_e[$name]=new CList;
return $this->_e[$name]->add($value);
}
elseif(is_array($this->_m))
{
foreach($this->_m as $object)
{
if($object->getEnabled() && (property_exists($object,$name) || $object->canSetProperty($name)))
return $object->$name=$value;
}
}
if(method_exists($this,'get'.$name))
throw new CException(Yii::t('yii','Property "{class}.{property}" is read only.',
array('{class}'=>get_class($this), '{property}'=>$name)));
else
throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
array('{class}'=>get_class($this), '{property}'=>$name)));
}
Устанавливает значение свойства компонента. Не вызывать этот метод. Это магический метод PHP, который мы переопределяем, чтобы разрешить использование следующего синтаксиса для установки свойства или добавления обработчика событий
$this->propertyName=$value; $this->eventName=$callback;
См. также
__unset() метод
public mixed __unset(string $name) | ||
| $name | string | имя свойства или имя события |
| {return} | mixed | |
public function __unset($name)
{
$setter='set'.$name;
if(method_exists($this,$setter))
$this->$setter(null);
elseif(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
unset($this->_e[strtolower($name)]);
elseif(is_array($this->_m))
{
if(isset($this->_m[$name]))
$this->detachBehavior($name);
else
{
foreach($this->_m as $object)
{
if($object->getEnabled())
{
if(property_exists($object,$name))
return $object->$name=null;
elseif($object->canSetProperty($name))
return $object->$setter(null);
}
}
}
}
elseif(method_exists($this,'get'.$name))
throw new CException(Yii::t('yii','Property "{class}.{property}" is read only.',
array('{class}'=>get_class($this), '{property}'=>$name)));
}
Устанавливает свойство компонента в значение null. Не вызывать этот метод. Это магический метод PHP, который мы переопределяем, чтобы разрешить использование unset() для установки свойства компонента в null.
asa() метод
public IBehavior asa(string $behavior) | ||
| $behavior | string | имя поведения |
| {return} | IBehavior | объект поведения или null, если поведения не существует |
public function asa($behavior)
{
return isset($this->_m[$behavior]) ? $this->_m[$behavior] : null;
}
Возвращает объект поведения с заданным именем. Имя 'asa' означает 'как'.
attachBehavior() метод
public IBehavior attachBehavior(string $name, mixed $behavior) | ||
| $name | string | имя поведения. Оно должно однозначно идентифицировать это поведение. |
| $behavior | mixed | конфигурация поведения. Передается как первый параметр в YiiBase::createComponent для создания объекта поведения. Также можно передать уже созданный экземпляр поведения (новое поведение заменит уже созданное поведение с тем же именем, если оно существует). |
| {return} | IBehavior | объект поведения |
public function attachBehavior($name,$behavior)
{
if(!($behavior instanceof IBehavior))
$behavior=Yii::createComponent($behavior);
$behavior->setEnabled(true);
$behavior->attach($this);
return $this->_m[$name]=$behavior;
}
Прикрепляет поведение к этому компоненту. Этот метод создаст объект поведения на основе заданной конфигурации. После этого объект поведения будет инициализирован вызовом его метода IBehavior::attach.
attachBehaviors() метод
public void attachBehaviors(array $behaviors) | ||
| $behaviors | array | список поведений, которые должны быть присоединены к компоненту |
public function attachBehaviors($behaviors)
{
foreach($behaviors as $name=>$behavior)
$this->attachBehavior($name,$behavior);
}
Прикрепляет список поведений к компоненту. Каждое поведение индексируется по его имени и должно быть экземпляром IBehavior, строкой, задающей класс поведения, или массивом следующей структуры:
array(
'class'=>'path.to.BehaviorClass',
'property1'=>'value1',
'property2'=>'value2',
)
attachEventHandler() метод
public void attachEventHandler(string $name, callback $handler) | ||
| $name | string | имя события |
| $handler | callback | обработчик события |
public function attachEventHandler($name,$handler)
{
$this->getEventHandlers($name)->add($handler);
}
Прикрепляет обработчик события к событию.
Обработчик события должен быть допустимым PHP обратным вызовом, т.е., строкой, ссылающейся на имя глобальной функции, или массивом, содержащим два элемента, где первый элемент — объект, а второй — имя метода объекта.
Обработчик события должен быть определен со следующим сигнатуро,
function handlerName($event) {}
где $event включает параметры, связанные с событием. Это удобный метод прикрепления обработчика к событию. Он эквивалентен следующему коду:
$component->getEventHandlers($eventName)->add($eventHandler);
Используя getEventHandlers, можно также указать порядок выполнения нескольких обработчиков, прикрепленных к одному событию. Например:
$component->getEventHandlers($eventName)->insertAt(0,$eventHandler);заставляет обработчик вызываться первым.
См. также
canGetProperty() метод
public boolean canGetProperty(string $name) | ||
| $name | string | имя свойства |
| {return} | boolean | можно ли прочитать свойство |
public function canGetProperty($name)
{
return method_exists($this,'get'.$name);
}
Определяет, можно ли прочитать свойство. Свойство можно прочитать, если у класса есть метод-геттер для имени свойства. Обратите внимание, что имя свойства нечувствительно к регистру.
См. также
canSetProperty() метод
public boolean canSetProperty(string $name) | ||
| $name | string | имя свойства |
| {return} | boolean | можно ли записать свойство |
public function canSetProperty($name)
{
return method_exists($this,'set'.$name);
}
Определяет, можно ли установить свойство. Свойство можно записать, если у класса есть метод-сеттер для имени свойства. Обратите внимание, что имя свойства нечувствительно к регистру.
См. также
detachBehavior() метод
public IBehavior detachBehavior(string $name) | ||
| $name | string | имя поведения. Оно однозначно идентифицирует поведение. |
| {return} | IBehavior | открепленное поведение. Null, если поведение не существует. |
public function detachBehavior($name)
{
if(isset($this->_m[$name]))
{
$this->_m[$name]->detach($this);
$behavior=$this->_m[$name];
unset($this->_m[$name]);
return $behavior;
}
}
Отсоединяет поведение от компонента. Будет вызван метод IBehavior::detach поведения.
detachBehaviors() метод
public void detachBehaviors() |
public function detachBehaviors()
{
if($this->_m!==null)
{
foreach($this->_m as $name=>$behavior)
$this->detachBehavior($name);
$this->_m=null;
}
}
Отсоединяет все обработчики событий от компонента.
detachEventHandler() метод
public boolean detachEventHandler(string $name, callback $handler) | ||
| $name | string | имя события |
| $handler | callback | обработчик события, который нужно удалить |
| {return} | boolean | успех или неудача процесса отсоединения |
public function detachEventHandler($name,$handler)
{
if($this->hasEventHandler($name))
return $this->getEventHandlers($name)->remove($handler)!==false;
else
return false;
}
Отсоединяет существующий обработчик события. Этот метод является обратным attachEventHandler.
См. также
disableBehavior() метод
public void disableBehavior(string $name) | ||
| $name | string | имя поведения. Оно уникально идентифицирует поведение. |
public function disableBehavior($name)
{
if(isset($this->_m[$name]))
$this->_m[$name]->setEnabled(false);
}
Отключает прикрепленное поведение. Поведение эффективно только при включенном состоянии.
disableBehaviors() метод
public void disableBehaviors() |
public function disableBehaviors()
{
if($this->_m!==null)
{
foreach($this->_m as $behavior)
$behavior->setEnabled(false);
}
}
Отключает все прикрепленные к этому компоненту поведения.
enableBehavior() метод
public void enableBehavior(string $name) | ||
| $name | string | имя поведения. Оно уникально идентифицирует поведение. |
public function enableBehavior($name)
{
if(isset($this->_m[$name]))
$this->_m[$name]->setEnabled(true);
}
Включает прикрепленное поведение. Поведение эффективно только при включенном состоянии. Поведение включается при первом присоединении.
enableBehaviors() метод
public void enableBehaviors() |
public function enableBehaviors()
{
if($this->_m!==null)
{
foreach($this->_m as $behavior)
$behavior->setEnabled(true);
}
}
Включает все поведения, прикреплённые к этому компоненту.
evaluateExpression() метод (доступен с версии v1.1.0)
public mixed evaluateExpression(mixed $_expression_, array $_data_=array ( )) | ||
| $_expression_ | mixed | PHP-выражение или PHP-обработчик для вычисления. |
| $_data_ | array | дополнительные параметры, которые должны быть переданы вышеуказанному выражению/обработчику. |
| {return} | mixed | результат выражения |
public function evaluateExpression($_expression_,$_data_=array())
{
if(is_string($_expression_))
{
extract($_data_);
try
{
return eval('return ' . $_expression_ . ';');
}
catch (ParseError $e)
{
return false;
}
}
else
{
$_data_[]=$this;
return call_user_func_array($_expression_, $_data_);
}
}
Вычисляет PHP-выражение или обратный вызов в контексте этого компонента.
Допустимый PHP обратный вызов может быть именем метода класса в формате array(ClassName/Object, MethodName), или анонимной функцией (доступно только в PHP 5.3.0 и выше).
Если используется PHP обратный вызов, соответствующая сигнатура функции/метода должна быть
function foo($param1, $param2, ..., $component) { ... }
где элементы массива во втором параметре этого метода будут переданы в обратный вызов как $param1, $param2, ...; и последний параметр будет сам компонент. Если используется PHP выражение, второй параметр будет «извлечен» в PHP переменные, которые могут быть напрямую доступны в выражении. См. PHP extract для получения более подробной информации. В выражении объект компонента может быть доступен с помощью $this.
PHP-выражение может быть любым PHP-кодом, который имеет значение. Чтобы узнать больше о том, что такое выражение, пожалуйста, обратитесь к руководству PHP.
getEventHandlers() метод
public CList getEventHandlers(string $name) | ||
| $name | string | имя события |
| {return} | CList | список присоединённых обработчиков событий для события |
public function getEventHandlers($name)
{
if($this->hasEvent($name))
{
$name=strtolower($name);
if(!isset($this->_e[$name]))
$this->_e[$name]=new CList;
return $this->_e[$name];
}
else
throw new CException(Yii::t('yii','Event "{class}.{event}" is not defined.',
array('{class}'=>get_class($this), '{event}'=>$name)));
}
Возвращает список присоединённых обработчиков событий для события.
hasEvent() метод
public boolean hasEvent(string $name) | ||
| $name | string | имя события |
| {return} | boolean | определено ли событие |
public function hasEvent($name)
{
return !strncasecmp($name,'on',2) && method_exists($this,$name);
}
Определяет, определено ли событие. Событие определено, если в классе есть метод с именем, подобным 'onXXX'. Обратите внимание, что имя события регистронезависимо.
hasEventHandler() метод
public boolean hasEventHandler(string $name) | ||
| $name | string | имя события |
| {return} | boolean | есть ли для события один или несколько обработчиков |
public function hasEventHandler($name)
{
$name=strtolower($name);
return isset($this->_e[$name]) && $this->_e[$name]->getCount()>0;
}
Проверяет, есть ли для указанного события прикрепленные обработчики.
hasProperty() метод
public boolean hasProperty(string $name) | ||
| $name | string | имя свойства |
| {return} | boolean | определено ли свойство |
public function hasProperty($name)
{
return method_exists($this,'get'.$name) || method_exists($this,'set'.$name);
}
Определяет, определено ли свойство. Свойство определено, если в классе определён метод получения или установки значения свойства. Обратите внимание, что имена свойств регистронезависимы.
См. также
raiseEvent() метод
public void raiseEvent(string $name, CEvent $event) | ||
| $name | string | имя события |
| $event | CEvent | параметр события |
public function raiseEvent($name,$event)
{
$name=strtolower($name);
if(isset($this->_e[$name]))
{
foreach($this->_e[$name] as $handler)
{
if(is_string($handler))
call_user_func($handler,$event);
elseif(is_callable($handler,true))
{
if(is_array($handler))
{
// an array: 0 - object, 1 - method name
list($object,$method)=$handler;
if(is_string($object)) // static method call
call_user_func($handler,$event);
elseif(method_exists($object,$method))
$object->$method($event);
else
throw new CException(Yii::t('yii','Event "{class}.{event}" is attached with an invalid handler "{handler}".',
array('{class}'=>get_class($this), '{event}'=>$name, '{handler}'=>$handler[1])));
}
else // PHP 5.3: anonymous function
call_user_func($handler,$event);
}
else
throw new CException(Yii::t('yii','Event "{class}.{event}" is attached with an invalid handler "{handler}".',
array('{class}'=>get_class($this), '{event}'=>$name, '{handler}'=>gettype($handler))));
// stop further handling if param.handled is set true
if(($event instanceof CEvent) && $event->handled)
return;
}
}
elseif(YII_DEBUG && !$this->hasEvent($name))
throw new CException(Yii::t('yii','Event "{class}.{event}" is not defined.',
array('{class}'=>get_class($this), '{event}'=>$name)));
}
Возбуждает событие. Этот метод представляет собой возникновение события. Он вызывает все присоединённые обработчики для события.
© 2008–2017 by Yii Software LLC
Licensed under the three clause BSD license.
http://www.yiiframework.com/doc/api/1.1/CComponent