Wire::hasHook PHP Method

hasHook() public method

Accomplishes the same thing as the static isHooked() method, but this is non-static, more accruate, and potentially slower than isHooked(). Less for optimization use, more for accuracy use. It checks for both static hooks and local hooks, but only accepts a method() or property name as an argument (i.e. no Class::something) since the class context is assumed from the current instance. Unlike isHooked() it also analyzes the instance's class parents for hooks, making it more accurate. As a result, this method works well for more than just optimization use. If checking for a hooked method, it should be in the form "method()". If checking for a hooked property, it should be in the form "property".
public hasHook ( string $method ) : boolean
$method string Method() or property name
return boolean
    public function hasHook($method)
    {
        $hooked = false;
        if (strpos($method, '::') !== false) {
            throw new WireException("You may only specify a 'method()' or 'property', not 'Class::something'.");
        }
        // quick exit when possible
        if (!in_array($method, self::$hookMethodCache)) {
            return false;
        }
        $_method = rtrim($method, '()');
        if (!empty($this->localHooks[$_method])) {
            // first check local hooks attached to this instance
            $hooked = true;
        } else {
            if (!empty(self::$staticHooks[get_class($this)][$_method])) {
                // now check if hooked in this class
                $hooked = true;
            } else {
                // check parent classes and interfaces
                $classes = class_parents($this, false);
                $interfaces = class_implements($this);
                if (is_array($interfaces)) {
                    $classes = array_merge($interfaces, $classes);
                }
                foreach ($classes as $class) {
                    if (!empty(self::$staticHooks[$class][$_method])) {
                        $hooked = true;
                        break;
                    }
                }
            }
        }
        return $hooked;
    }

Usage Example

Exemplo n.º 1
0
 /**
  * Returns true if the method/property hooked, false if it isn't.
  *
  * This is for optimization use. It does not distinguish about class instance. 
  * It only distinguishes about class if you provide a class with the $method argument (i.e. Class::).
  * As a result, a true return value indicates something "might" be hooked, as opposed to be 
  * being definitely hooked. 
  *
  * If checking for a hooked method, it should be in the form "Class::method()" or "method()". 
  * If checking for a hooked property, it should be in the form "Class::property" or "property". 
  * 
  * @param string $method Method or property name in one of the following formats:
  * 	Class::method()
  * 	Class::property
  * 	method()
  * 	property
  * @param Wire|null $instance Optional instance to check against (see isThisHooked method for details)
  * 	Note that if specifying an $instance, you may not use the Class::method() or Class::property options for $method argument.
  * @return bool
  *
  */
 public static function isHooked($method, Wire $instance = null)
 {
     if ($instance) {
         return $instance->hasHook($method);
     }
     $hooked = false;
     if (strpos($method, ':') !== false) {
         if (array_key_exists($method, self::$hookMethodCache)) {
             $hooked = true;
         }
         // fromClass::method() or fromClass::property
     } else {
         if (in_array($method, self::$hookMethodCache)) {
             $hooked = true;
         }
         // method() or property
     }
     return $hooked;
 }