diff --git a/framework/yii/base/Component.php b/framework/yii/base/Component.php index bd49bc8d20..544d7d4058 100644 --- a/framework/yii/base/Component.php +++ b/framework/yii/base/Component.php @@ -298,6 +298,32 @@ class Component extends Object return false; } + /** + * 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. * diff --git a/framework/yii/base/Object.php b/framework/yii/base/Object.php index 50ad9e9900..749ad636ec 100644 --- a/framework/yii/base/Object.php +++ b/framework/yii/base/Object.php @@ -219,6 +219,19 @@ class Object implements Arrayable return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name); } + /** + * 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.