From e18dc2a1a7dd0b3062cbc0a6f8c95b2911e6e558 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Thu, 21 Jul 2011 16:09:33 -0400 Subject: [PATCH] w --- framework/YiiBase.php | 4 +- framework/base/Dictionary.php | 8 +- framework/base/Model.php | 419 ++++++++++++++++++++++----------------- framework/base/ModelBehavior.php | 6 +- framework/base/ModelEvent.php | 2 +- framework/base/Vector.php | 8 +- 6 files changed, 246 insertions(+), 201 deletions(-) diff --git a/framework/YiiBase.php b/framework/YiiBase.php index 2a74af2..3432721 100644 --- a/framework/YiiBase.php +++ b/framework/YiiBase.php @@ -141,7 +141,7 @@ class YiiBase * will be included only when the class is being used. This parameter is used only when * the path alias refers to a class. * @return string the class name or the directory that this alias refers to - * @throws Exception if the path alias is invalid + * @throws \yii\base\Exception if the path alias is invalid */ public static function import($alias, $forceInclude = false) { @@ -315,7 +315,7 @@ class YiiBase * * @param mixed $config the configuration. It can be either a string or an array. * @return mixed the created object - * @throws Exception if the configuration does not have a 'class' element. + * @throws \yii\base\Exception if the configuration does not have a 'class' element. */ public static function createComponent($config) { diff --git a/framework/base/Dictionary.php b/framework/base/Dictionary.php index 89cc0d2..6c3c952 100644 --- a/framework/base/Dictionary.php +++ b/framework/base/Dictionary.php @@ -259,7 +259,7 @@ class Dictionary extends Component implements \IteratorAggregate, \ArrayAccess, /** * Returns whether there is an element at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `isset($vector[$index])`. + * It is implicitly called when you use something like `isset($dictionary[$offset])`. * This is equivalent to [[contains]]. * @param mixed $offset the offset to check on * @return boolean @@ -272,7 +272,7 @@ class Dictionary extends Component implements \IteratorAggregate, \ArrayAccess, /** * Returns the element at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `$value = $dictionary[$index];`. + * It is implicitly called when you use something like `$value = $dictionary[$offset];`. * This is equivalent to [[itemAt]]. * @param integer $offset the offset to retrieve element. * @return mixed the element at the offset, null if no element is found at the offset @@ -285,7 +285,7 @@ class Dictionary extends Component implements \IteratorAggregate, \ArrayAccess, /** * Sets the element at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `$dictionary[$key] = $value;`. + * It is implicitly called when you use something like `$dictionary[$offset] = $item;`. * If the offset is null, the new item will be appended to the dictionary. * Otherwise, the existing item at the offset will be replaced with the new item. * This is equivalent to [[add]]. @@ -300,7 +300,7 @@ class Dictionary extends Component implements \IteratorAggregate, \ArrayAccess, /** * Unsets the element at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `unset($dictionary[$index])`. + * It is implicitly called when you use something like `unset($dictionary[$offset])`. * This is equivalent to [[remove]]. * @param mixed $offset the offset to unset element */ diff --git a/framework/base/Model.php b/framework/base/Model.php index 2621a7e..8c0fc93 100644 --- a/framework/base/Model.php +++ b/framework/base/Model.php @@ -1,79 +1,129 @@ * @link http://www.yiiframework.com/ - * @copyright Copyright © 2008-2011 Yii Software LLC + * @copyright Copyright © 2008-2012 Yii Software LLC * @license http://www.yiiframework.com/license/ */ +namespace yii\base; /** - * CModel is the base class providing the common features needed by data model objects. + * Model is the base class providing the common features needed by data model objects. * - * CModel defines the basic framework for data models that need to be validated. + * Model defines the basic framework for data models that need to be validated. * * @author Qiang Xue - * @version $Id: CModel.php 3349 2011-07-08 11:27:53Z mdomba $ - * @package system.base - * @since 1.0 + * @since 2.0 */ -abstract class CModel extends CComponent implements IteratorAggregate, ArrayAccess +class Model extends Component implements \IteratorAggregate, \ArrayAccess { - private $_errors=array(); // attribute name => array of errors - private $_validators; // validators - private $_scenario=''; // scenario + private static $_attributes = array(); // class name => array of attribute names + private $_errors = array(); // attribute name => array of errors + private $_validators; // validators + private $_scenario; // scenario + + /** + * Constructor. + * @param string $scenario name of the [[scenario]] that this model is used in. + */ + public function __construct($scenario='') + { + $this->_scenario = $scenario; + $this->init(); + $this->attachBehaviors($this->behaviors()); + $this->afterConstruct(); + } + + /** + * Initializes this model. + * This method is invoked in the constructor right after [[scenario]] is set. + * You may override this method to provide code that is needed to initialize the model (e.g. setting + * initial property values.) + */ + public function init() + { + } /** - * Returns the list of attribute names of the model. + * Returns the list of attribute names. + * By default, this method returns all public non-static properties of the class. + * You may override this method to change the default. * @return array list of attribute names. - * @since 1.0.1 */ - abstract public function attributeNames(); + public function attributeNames() + { + $className = get_class($this); + if (isset(self::$_attributes[$className])) { + return self::$_attributes[$className]; + } + + $class = new ReflectionClass($this); + $names = array(); + foreach ($class->getProperties() as $property) { + $name = $property->getName(); + if ($property->isPublic() && !$property->isStatic()) { + $names[] = $name; + } + } + return self::$_attributes[$className] = $names; + } /** * Returns the validation rules for attributes. * - * This method should be overridden to declare validation rules. + * Validation rules are used by [[validate()]] to check if attribute values are valid. + * Child classes may override this method to declare different validation rules. + * * Each rule is an array with the following structure: - *
-	 * array('attribute list', 'validator name', 'on'=>'scenario name', ...validation parameters...)
-	 * 
+ * + * ~~~php + * array( + * 'attribute list', + * 'validator type', + * 'on'=>'scenario name', + * ...other parameters... + * ) + * ~~~ + * * where - * + * function validatorName($attribute, $params) + * ~~~ + * + * If the latter, the object must be extending from [[\yii\validators\Validator]]. + * Yii provides a set of [[\yii\validators\Validator::builtInValidators|built-in validators]]. + * They each have an alias name which can be used when specifying a validation rule. * * The following are some examples: - *
+	 *
+	 * ~~~php
 	 * array(
 	 *     array('username', 'required'),
 	 *     array('username', 'length', 'min'=>3, 'max'=>12),
 	 *     array('password', 'compare', 'compareAttribute'=>'password2', 'on'=>'register'),
 	 *     array('password', 'authenticate', 'on'=>'login'),
 	 * );
-	 * 
+ * ~~~ * * Note, in order to inherit rules defined in the parent class, a child class needs to - * merge the parent rules with child rules using functions like array_merge(). + * merge the parent rules with child rules using functions such as `array_merge()`. * - * @return array validation rules to be applied when {@link validate()} is called. - * @see scenario + * @return array validation rules */ public function rules() { @@ -85,21 +135,21 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * The return value should be an array of behavior configurations indexed by * behavior names. Each behavior configuration can be either a string specifying * the behavior class or an array of the following structure: - *
-	 * 'behaviorName'=>array(
-	 *     'class'=>'path.to.BehaviorClass',
-	 *     'property1'=>'value1',
-	 *     'property2'=>'value2',
+	 *
+	 * ~~~php
+	 * 'behaviorName' => array(
+	 *     'class' => 'BehaviorClass',
+	 *     'property1' => 'value1',
+	 *     'property2' => 'value2',
 	 * )
-	 * 
+ * ~~~ * - * Note, the behavior classes must implement {@link IBehavior} or extend from - * {@link CBehavior}. Behaviors declared in this method will be attached - * to the model when it is instantiated. + * Note, the behavior classes must extend from [[Behavior]]. Behaviors declared + * in this method will be attached to the model when it is instantiated. * - * For more details about behaviors, see {@link CComponent}. - * @return array the behavior configurations (behavior name=>behavior configuration) - * @since 1.0.2 + * For more details about behaviors, see [[Component]]. + * + * @return array the behavior configurations. */ public function behaviors() { @@ -108,12 +158,16 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce /** * Returns the attribute labels. - * Attribute labels are mainly used in error messages of validation. - * By default an attribute label is generated using {@link generateAttributeLabel}. + * + * Attribute labels are mainly used for display purpose. For example, given an attribute + * `firstName`, we can declare a label `First Name` which is more user-friendly and can + * be displayed to end users. + * + * By default an attribute label is generated using [[generateAttributeLabel]]. * This method allows you to explicitly specify attribute labels. * * Note, in order to inherit labels defined in the parent class, a child class needs to - * merge the parent labels with child labels using functions like array_merge(). + * merge the parent labels with child labels using functions such as `array_merge()`. * * @return array attribute labels (name=>label) * @see generateAttributeLabel @@ -124,37 +178,40 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce } /** - * Performs the validation. + * Performs the data validation. * - * This method executes the validation rules as declared in {@link rules}. - * Only the rules applicable to the current {@link scenario} will be executed. - * A rule is considered applicable to a scenario if its 'on' option is not set + * This method executes the validation rules as declared in [[rules]]. + * Only the rules applicable to the current [[scenario]] will be executed. + * A rule is considered applicable to a scenario if its `on` option is not set * or contains the scenario. * - * Errors found during the validation can be retrieved via {@link getErrors}. + * This method will call [[beforeValidate]] and [[afterValidate]] before and + * after actual validation, respectively. If [[beforeValidate]] returns false, + * the validation and [[afterValidate]] will be cancelled. + * + * Errors found during the validation can be retrieved via [[getErrors]]. * - * @param array $attributes list of attributes that should be validated. Defaults to null, - * meaning any attribute listed in the applicable validation rules should be - * validated. If this parameter is given as a list of attributes, only - * the listed attributes will be validated. - * @param boolean $clearErrors whether to call {@link clearErrors} before performing validation + * @param array $attributes list of attributes that should be validated. + * If this parameter is empty, it means any attribute listed in the applicable + * validation rules should be validated. + * @param boolean $clearErrors whether to call [[clearErrors]] before performing validation * @return boolean whether the validation is successful without any error. * @see beforeValidate * @see afterValidate */ - public function validate($attributes=null, $clearErrors=true) + public function validate($attributes = null, $clearErrors = true) { - if($clearErrors) + if ($clearErrors) { $this->clearErrors(); - if($this->beforeValidate()) - { - foreach($this->getValidators() as $validator) - $validator->validate($this,$attributes); + } + if ($this->beforeValidate()) { + foreach ($this->getValidators() as $validator) { + $validator->validate($this, $attributes); + } $this->afterValidate(); return !$this->hasErrors(); } - else - return false; + return false; } /** @@ -163,9 +220,9 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * You may override this method to do postprocessing after model creation. * Make sure you call the parent implementation so that the event is raised properly. */ - protected function afterConstruct() + public function afterConstruct() { - if($this->hasEventHandler('onAfterConstruct')) + if ($this->hasEventHandler('onAfterConstruct')) $this->onAfterConstruct(new CEvent($this)); } @@ -177,9 +234,9 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * @return boolean whether validation should be executed. Defaults to true. * If false is returned, the validation will stop and the model is considered invalid. */ - protected function beforeValidate() + public function beforeValidate() { - $event=new CModelEvent($this); + $event = new ModelEvent($this); $this->onBeforeValidate($event); return $event->isValid; } @@ -190,7 +247,7 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * You may override this method to do postprocessing after validation. * Make sure the parent implementation is invoked so that the event can be raised. */ - protected function afterValidate() + public function afterValidate() { $this->onAfterValidate(new CEvent($this)); } @@ -198,31 +255,28 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce /** * This event is raised after the model instance is created by new operator. * @param CEvent $event the event parameter - * @since 1.0.2 */ public function onAfterConstruct($event) { - $this->raiseEvent('onAfterConstruct',$event); + $this->raiseEvent('onAfterConstruct', $event); } /** * This event is raised before the validation is performed. - * @param CModelEvent $event the event parameter - * @since 1.0.2 + * @param ModelEvent $event the event parameter */ public function onBeforeValidate($event) { - $this->raiseEvent('onBeforeValidate',$event); + $this->raiseEvent('onBeforeValidate', $event); } /** * This event is raised after the validation is performed. * @param CEvent $event the event parameter - * @since 1.0.2 */ public function onAfterValidate($event) { - $this->raiseEvent('onAfterValidate',$event); + $this->raiseEvent('onAfterValidate', $event); } /** @@ -235,12 +289,11 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * The change made to the {@link CList} object will persist and reflect * in the result of the next call of {@link getValidators}. * @return CList all the validators declared in the model. - * @since 1.1.2 */ public function getValidatorList() { - if($this->_validators===null) - $this->_validators=$this->createValidators(); + if ($this->_validators === null) + $this->_validators = $this->createValidators(); return $this->_validators; } @@ -249,21 +302,20 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * @param string $attribute the name of the attribute whose validators should be returned. * If this is null, the validators for ALL attributes in the model will be returned. * @return array the validators applicable to the current {@link scenario}. - * @since 1.0.1 */ - public function getValidators($attribute=null) + public function getValidators($attribute = null) { - if($this->_validators===null) - $this->_validators=$this->createValidators(); + if ($this->_validators === null) + $this->_validators = $this->createValidators(); - $validators=array(); - $scenario=$this->getScenario(); - foreach($this->_validators as $validator) + $validators = array(); + $scenario = $this->getScenario(); + foreach ($this->_validators as $validator) { - if($validator->applyTo($scenario)) + if ($validator->applyTo($scenario)) { - if($attribute===null || in_array($attribute,$validator->attributes,true)) - $validators[]=$validator; + if ($attribute === null || in_array($attribute, $validator->attributes, true)) + $validators[] = $validator; } } return $validators; @@ -276,14 +328,14 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce */ public function createValidators() { - $validators=new CList; - foreach($this->rules() as $rule) + $validators = new CList; + foreach ($this->rules() as $rule) { - if(isset($rule[0],$rule[1])) // attributes, validator name - $validators->add(CValidator::createValidator($rule[1],$this,$rule[0],array_slice($rule,2))); + if (isset($rule[0], $rule[1])) // attributes, validator name + $validators->add(CValidator::createValidator($rule[1], $this, $rule[0], array_slice($rule, 2))); else - throw new CException(Yii::t('yii','{class} has an invalid validation rule. The rule must specify attributes to be validated and the validator name.', - array('{class}'=>get_class($this)))); + throw new CException(Yii::t('yii', '{class} has an invalid validation rule. The rule must specify attributes to be validated and the validator name.', + array('{class}' => get_class($this)))); } return $validators; } @@ -294,13 +346,12 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * {@link CRequiredValidator} validation rule in the current {@link scenario}. * @param string $attribute attribute name * @return boolean whether the attribute is required - * @since 1.0.2 */ public function isAttributeRequired($attribute) { - foreach($this->getValidators($attribute) as $validator) + foreach ($this->getValidators($attribute) as $validator) { - if($validator instanceof CRequiredValidator) + if ($validator instanceof CRequiredValidator) return true; } return false; @@ -310,12 +361,11 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * Returns a value indicating whether the attribute is safe for massive assignments. * @param string $attribute attribute name * @return boolean whether the attribute is safe for massive assignments - * @since 1.1 */ public function isAttributeSafe($attribute) { - $attributes=$this->getSafeAttributeNames(); - return in_array($attribute,$attributes); + $attributes = $this->getSafeAttributeNames(); + return in_array($attribute, $attributes); } /** @@ -327,8 +377,8 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce */ public function getAttributeLabel($attribute) { - $labels=$this->attributeLabels(); - if(isset($labels[$attribute])) + $labels = $this->attributeLabels(); + if (isset($labels[$attribute])) return $labels[$attribute]; else return $this->generateAttributeLabel($attribute); @@ -339,10 +389,10 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * @param string $attribute attribute name. Use null to check all attributes. * @return boolean whether there is any error. */ - public function hasErrors($attribute=null) + public function hasErrors($attribute = null) { - if($attribute===null) - return $this->_errors!==array(); + if ($attribute === null) + return $this->_errors !== array(); else return isset($this->_errors[$attribute]); } @@ -352,9 +402,9 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * @param string $attribute attribute name. Use null to retrieve errors for all attributes. * @return array errors for all attributes or the specified attribute. Empty array is returned if no error. */ - public function getErrors($attribute=null) + public function getErrors($attribute = null) { - if($attribute===null) + if ($attribute === null) return $this->_errors; else return isset($this->_errors[$attribute]) ? $this->_errors[$attribute] : array(); @@ -364,7 +414,6 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * Returns the first error of the specified attribute. * @param string $attribute attribute name. * @return string the error message. Null is returned if no error. - * @since 1.0.2 */ public function getError($attribute) { @@ -376,9 +425,9 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * @param string $attribute attribute name * @param string $error new error message */ - public function addError($attribute,$error) + public function addError($attribute, $error) { - $this->_errors[$attribute][]=$error; + $this->_errors[$attribute][] = $error; } /** @@ -387,19 +436,18 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * The array values should be error messages. If an attribute has multiple errors, * these errors must be given in terms of an array. * You may use the result of {@link getErrors} as the value for this parameter. - * @since 1.0.5 */ public function addErrors($errors) { - foreach($errors as $attribute=>$error) + foreach ($errors as $attribute => $error) { - if(is_array($error)) + if (is_array($error)) { - foreach($error as $e) - $this->_errors[$attribute][]=$e; + foreach ($error as $e) + $this->_errors[$attribute][] = $e; } else - $this->_errors[$attribute][]=$error; + $this->_errors[$attribute][] = $error; } } @@ -407,10 +455,10 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * Removes errors for all attributes or a single attribute. * @param string $attribute attribute name. Use null to remove errors for all attribute. */ - public function clearErrors($attribute=null) + public function clearErrors($attribute = null) { - if($attribute===null) - $this->_errors=array(); + if ($attribute === null) + $this->_errors = array(); else unset($this->_errors[$attribute]); } @@ -425,7 +473,7 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce */ public function generateAttributeLabel($name) { - return ucwords(trim(strtolower(str_replace(array('-','_','.'),' ',preg_replace('/(?value). */ - public function getAttributes($names=null) + public function getAttributes($names = null) { - $values=array(); - foreach($this->attributeNames() as $name) - $values[$name]=$this->$name; + $values = array(); + foreach ($this->attributeNames() as $name) + $values[$name] = $this->$name; - if(is_array($names)) + if (is_array($names)) { - $values2=array(); - foreach($names as $name) - $values2[$name]=isset($values[$name]) ? $values[$name] : null; + $values2 = array(); + foreach ($names as $name) + $values2[$name] = isset($values[$name]) ? $values[$name] : null; return $values2; } else @@ -460,32 +508,33 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * @see getSafeAttributeNames * @see attributeNames */ - public function setAttributes($values,$safeOnly=true) + public function setAttributes($values, $safeOnly = true) { - if(!is_array($values)) + if (!is_array($values)) return; - $attributes=array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames()); - foreach($values as $name=>$value) + $attributes = array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames()); + foreach ($values as $name => $value) { - if(isset($attributes[$name])) - $this->$name=$value; - else if($safeOnly) - $this->onUnsafeAttribute($name,$value); + if (isset($attributes[$name])) + $this->$name = $value; + elseif ($safeOnly) + $this->onUnsafeAttribute($name, $value); } } /** * Sets the attributes to be null. * @param array $names list of attributes to be set null. If this parameter is not given, - * all attributes as specified by {@link attributeNames} will have their values unset. - * @since 1.1.3 + * all attributes as specified by [[attributeNames]] will have their values unset. */ - public function unsetAttributes($names=null) + public function unsetAttributes($names = null) { - if($names===null) - $names=$this->attributeNames(); - foreach($names as $name) - $this->$name=null; + if ($names === null) { + $names = $this->attributeNames(); + } + foreach ($names as $name) { + $this->$name = null; + } } /** @@ -494,12 +543,11 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * It does nothing otherwise. * @param string $name the unsafe attribute name * @param mixed $value the attribute value - * @since 1.1.1 */ - public function onUnsafeAttribute($name,$value) + public function onUnsafeAttribute($name, $value) { - if(YII_DEBUG) - Yii::log(Yii::t('yii','Failed to set unsafe attribute "{attribute}" of "{class}".',array('{attribute}'=>$name, '{class}'=>get_class($this))),CLogger::LEVEL_WARNING); + if (YII_DEBUG) + \Yii::warning(sprintf('Failed to set unsafe attribute "%s" of "%s".', $name, get_class($this)); } /** @@ -508,16 +556,15 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * Scenario affects how validation is performed and which attributes can * be massively assigned. * - * A validation rule will be performed when calling {@link validate()} + * A validation rule will be performed when calling [[validate]] * if its 'on' option is not set or contains the current scenario value. * * And an attribute can be massively assigned if it is associated with - * a validation rule for the current scenario. Note that an exception is - * the {@link CUnsafeValidator unsafe} validator which marks the associated - * attributes as unsafe and not allowed to be massively assigned. + * a validation rule for the current scenario. An exception is + * the [[\yii\validators\UnsafeValidator|unsafe]] validator which marks + * the associated attributes as unsafe and not allowed to be massively assigned. * * @return string the scenario that this model is in. - * @since 1.0.4 */ public function getScenario() { @@ -528,38 +575,36 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce * Sets the scenario for the model. * @param string $value the scenario that this model is in. * @see getScenario - * @since 1.0.4 */ public function setScenario($value) { - $this->_scenario=$value; + $this->_scenario = $value; } /** * Returns the attribute names that are safe to be massively assigned. * A safe attribute is one that is associated with a validation rule in the current {@link scenario}. * @return array safe attribute names - * @since 1.0.2 */ public function getSafeAttributeNames() { - $attributes=array(); - $unsafe=array(); - foreach($this->getValidators() as $validator) + $attributes = array(); + $unsafe = array(); + foreach ($this->getValidators() as $validator) { - if(!$validator->safe) + if (!$validator->safe) { - foreach($validator->attributes as $name) - $unsafe[]=$name; + foreach ($validator->attributes as $name) + $unsafe[] = $name; } else { - foreach($validator->attributes as $name) - $attributes[$name]=true; + foreach ($validator->attributes as $name) + $attributes[$name] = true; } } - foreach($unsafe as $name) + foreach ($unsafe as $name) unset($attributes[$name]); return array_keys($attributes); } @@ -571,28 +616,28 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce */ public function getIterator() { - $attributes=$this->getAttributes(); - return new CMapIterator($attributes); + $attributes = $this->getAttributes(); + return new DictionaryIterator($attributes); } /** * Returns whether there is an element at the specified offset. - * This method is required by the interface ArrayAccess. + * This method is required by the SPL interface `ArrayAccess`. + * It is implicitly called when you use something like `isset($model[$offset])`. * @param mixed $offset the offset to check on * @return boolean - * @since 1.0.2 */ public function offsetExists($offset) { - return property_exists($this,$offset); + return property_exists($this, $offset) && $this->$offset !== null; } /** * Returns the element at the specified offset. - * This method is required by the interface ArrayAccess. + * This method is required by the SPL interface `ArrayAccess`. + * It is implicitly called when you use something like `$value = $model[$offset];`. * @param integer $offset the offset to retrieve element. * @return mixed the element at the offset, null if no element is found at the offset - * @since 1.0.2 */ public function offsetGet($offset) { @@ -601,21 +646,21 @@ abstract class CModel extends CComponent implements IteratorAggregate, ArrayAcce /** * Sets the element at the specified offset. - * This method is required by the interface ArrayAccess. + * This method is required by the SPL interface `ArrayAccess`. + * It is implicitly called when you use something like `$model[$offset] = $item;`. * @param integer $offset the offset to set element * @param mixed $item the element value - * @since 1.0.2 */ - public function offsetSet($offset,$item) + public function offsetSet($offset, $item) { - $this->$offset=$item; + $this->$offset = $item; } /** * Unsets the element at the specified offset. - * This method is required by the interface ArrayAccess. + * This method is required by the SPL interface `ArrayAccess`. + * It is implicitly called when you use something like `unset($model[$offset])`. * @param mixed $offset the offset to unset element - * @since 1.0.2 */ public function offsetUnset($offset) { diff --git a/framework/base/ModelBehavior.php b/framework/base/ModelBehavior.php index e76825a..4b92927 100644 --- a/framework/base/ModelBehavior.php +++ b/framework/base/ModelBehavior.php @@ -28,9 +28,9 @@ class CModelBehavior extends CBehavior public function events() { return array( - 'onAfterConstruct'=>'afterConstruct', - 'onBeforeValidate'=>'beforeValidate', - 'onAfterValidate'=>'afterValidate', + 'onAfterConstruct' => 'afterConstruct', + 'onBeforeValidate' => 'beforeValidate', + 'onAfterValidate' => 'afterValidate', ); } diff --git a/framework/base/ModelEvent.php b/framework/base/ModelEvent.php index a9b465a..f1c4584 100644 --- a/framework/base/ModelEvent.php +++ b/framework/base/ModelEvent.php @@ -28,7 +28,7 @@ class CModelEvent extends CEvent * If true, the normal execution cycles will continue, including performing the real validations and calling * {@link CModel::afterValidate}. */ - public $isValid=true; + public $isValid = true; /** * @var CDbCrireria the query criteria that is passed as a parameter to a find method of {@link CActiveRecord}. * Note that this property is only used by {@link CActiveRecord::onBeforeFind} event. diff --git a/framework/base/Vector.php b/framework/base/Vector.php index 99f49fb..22591d2 100644 --- a/framework/base/Vector.php +++ b/framework/base/Vector.php @@ -299,7 +299,7 @@ class Vector extends Component implements \IteratorAggregate, \ArrayAccess, \Cou /** * Returns a value indicating whether there is an item at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `isset($vector[$index])`. + * It is implicitly called when you use something like `isset($vector[$offset])`. * @param integer $offset the offset to be checked * @return boolean whether there is an item at the specified offset. */ @@ -311,7 +311,7 @@ class Vector extends Component implements \IteratorAggregate, \ArrayAccess, \Cou /** * Returns the item at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `$value = $vector[$index];`. + * It is implicitly called when you use something like `$value = $vector[$offset];`. * This is equivalent to [[itemAt]]. * @param integer $offset the offset to retrieve item. * @return mixed the item at the offset @@ -325,7 +325,7 @@ class Vector extends Component implements \IteratorAggregate, \ArrayAccess, \Cou /** * Sets the item at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `$vector[$index] = $value;`. + * It is implicitly called when you use something like `$vector[$offset] = $item;`. * If the offset is null or equal to the number of the existing items, * the new item will be appended to the vector. * Otherwise, the existing item at the offset will be replaced with the new item. @@ -347,7 +347,7 @@ class Vector extends Component implements \IteratorAggregate, \ArrayAccess, \Cou /** * Unsets the item at the specified offset. * This method is required by the SPL interface `ArrayAccess`. - * It is implicitly called when you use something like `unset($vector[$index])`. + * It is implicitly called when you use something like `unset($vector[$offset])`. * This is equivalent to [[removeAt]]. * @param integer $offset the offset to unset item * @throws Exception if the offset is out of range, or the vector is read only.