diff --git a/framework/yii/base/Component.php b/framework/yii/base/Component.php index bd49bc8..544d7d4 100644 --- a/framework/yii/base/Component.php +++ b/framework/yii/base/Component.php @@ -299,6 +299,32 @@ class Component extends Object } /** + * Returns a value indicating whether a method is defined. + * A method is defined if: + * + * - the class has a method with the specified name + * - an attached behavior has a method with the given name (when `$checkBehaviors` is true). + * + * @param string $name the property name + * @param boolean $checkBehaviors whether to treat behaviors' methods as methods of this component + * @return boolean whether the property is defined + */ + public function hasMethod($name, $checkBehaviors = true) + { + if (method_exists($this, $name)) { + return true; + } elseif ($checkBehaviors) { + $this->ensureBehaviors(); + foreach ($this->_behaviors as $behavior) { + if ($behavior->hasMethod($name)) { + return true; + } + } + } + return false; + } + + /** * Returns a list of behaviors that this component should behave as. * * Child classes may override this method to specify the behaviors they want to behave as. diff --git a/framework/yii/base/Object.php b/framework/yii/base/Object.php index 50ad9e9..749ad63 100644 --- a/framework/yii/base/Object.php +++ b/framework/yii/base/Object.php @@ -220,6 +220,19 @@ class Object implements Arrayable } /** + * Returns a value indicating whether a method is defined. + * + * The default implementation is a call to php function `method_exists()`. + * You may override this method when you implemented the php magic method `__call()`. + * @param string $name the property name + * @return boolean whether the property is defined + */ + public function hasMethod($name) + { + return method_exists($this, $name); + } + + /** * Converts the object into an array. * The default implementation will return all public property values as an array. * @return array the array representation of the object