From 2557929f084efc6c62d2e01a4747f170fc846b1e Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Wed, 27 Jan 2021 14:54:08 -0500 Subject: [PATCH] Minor hooks optimization in Wire class --- wire/core/Wire.php | 55 +++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/wire/core/Wire.php b/wire/core/Wire.php index fcacba6e..96786bfe 100644 --- a/wire/core/Wire.php +++ b/wire/core/Wire.php @@ -352,6 +352,22 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { */ protected $localHooks = array(); + /** + * @var WireHooks|null + * + */ + private $_wireHooks = null; + + /** + * @return WireHooks|null + * @since 3.0.171 + * + */ + protected function _wireHooks() { + if($this->_wireHooks === null) $this->_wireHooks = $this->wire()->hooks; + return $this->_wireHooks; + } + /** * Return all local hooks for this instance * @@ -423,7 +439,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { return $this->_callMethod($method, $arguments); } /** @var WireHooks $hooks */ - $hooks = $this->wire('hooks'); + $hooks = $this->_wireHooks(); if($hooks && $hooks->isMethodHooked($this, $method)) { $result = $hooks->runHooks($this, $method, $arguments); return $result['return']; @@ -460,7 +476,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { if($val !== null) return $val; } } - $hooks = $this->wire('hooks'); /** @var WireHooks $hooks */ + $hooks = $this->_wireHooks(); if($hooks) { $result = $hooks->runHooks($this, $method, $arguments); if(!$result['methodExists'] && !$result['numHooksRun']) { @@ -539,7 +555,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { */ protected function ___callUnknown($method, $arguments) { if($arguments) {} // intentional to avoid unused argument notice - $config = $this->wire('config'); + $config = $this->wire()->config; if($config && $config->disableUnknownMethodException) return null; throw new WireException("Method " . $this->className() . "::$method does not exist or is not callable in this context"); } @@ -563,7 +579,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { * */ public function runHooks($method, $arguments, $type = 'method') { - return $this->wire('hooks')->runHooks($this, $method, $arguments, $type); + return $this->_wireHooks()->runHooks($this, $method, $arguments, $type); } /** @@ -580,7 +596,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { * */ public function getHooks($method = '', $type = 0) { - return $this->wire('hooks')->getHooks($this, $method, $type); + return $this->_wireHooks()->getHooks($this, $method, $type); } /** @@ -610,7 +626,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { static public function isHooked($method, Wire $instance = null) { /** @var ProcessWire $wire */ $wire = $instance ? $instance->wire() : ProcessWire::getCurrentInstance(); - if($instance) return $instance->wire('hooks')->hasHook($instance, $method); + if($instance) return $instance->wire()->hooks->hasHook($instance, $method); return $wire->hooks->isHooked($method); } @@ -630,17 +646,15 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { * * #pw-group-hooks * - * @param string $method Method() or property name: + * @param string $name Method() name or property name: * - 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`. * @return bool True if this class instance has the hook, false if not. * @throws WireException When you try to call it with a Class::something() type method, which is not supported. * */ - public function hasHook($method) { - // Accomplishes the same thing as the static isHooked() method, but this is non-static, more accruate, - // potentially slower than isHooked(). Less for optimization use, more for accuracy use. - return $this->wire('hooks')->hasHook($this, $method); + public function hasHook($name) { + return $this->_wireHooks()->hasHook($this, $name); } /** @@ -684,7 +698,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { * */ public function addHook($method, $toObject, $toMethod = null, $options = array()) { - return $this->wire('hooks')->addHook($this, $method, $toObject, $toMethod, $options); + return $this->_wireHooks()->addHook($this, $method, $toObject, $toMethod, $options); } /** @@ -736,7 +750,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { // This is the same as calling addHook with the 'before' option set the $options array. $options['before'] = true; if(!isset($options['after'])) $options['after'] = false; - return $this->wire('hooks')->addHook($this, $method, $toObject, $toMethod, $options); + return $this->_wireHooks()->addHook($this, $method, $toObject, $toMethod, $options); } /** @@ -785,7 +799,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { public function addHookAfter($method, $toObject, $toMethod = null, $options = array()) { $options['after'] = true; if(!isset($options['before'])) $options['before'] = false; - return $this->wire('hooks')->addHook($this, $method, $toObject, $toMethod, $options); + return $this->_wireHooks()->addHook($this, $method, $toObject, $toMethod, $options); } /** @@ -832,7 +846,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { // This is the same as calling addHook with the 'type' option set to 'property' in the $options array. // Note that descending classes that override __get must call getHook($property) and/or runHook($property). $options['type'] = 'property'; - return $this->wire('hooks')->addHook($this, $property, $toObject, $toMethod, $options); + return $this->_wireHooks()->addHook($this, $property, $toObject, $toMethod, $options); } /** @@ -892,7 +906,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { * */ public function addHookMethod($method, $toObject, $toMethod = null, $options = array()) { - return $this->wire('hooks')->addHook($this, $method, $toObject, $toMethod, $options); + return $this->_wireHooks()->addHook($this, $method, $toObject, $toMethod, $options); } /** @@ -925,7 +939,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { * */ public function removeHook($hookId) { - return $this->wire('hooks')->removeHook($this, $hookId); + return $this->_wireHooks()->removeHook($this, $hookId); } @@ -1043,7 +1057,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { if(is_null($old) || is_null($new) || $lastValue !== $new) { /** @var WireHooks $hooks */ - $hooks = $this->wire('hooks'); + $hooks = $this->_wireHooks(); if(($hooks && $hooks->isHooked('changed()')) || !$hooks) { $this->changed($what, $old, $new); // triggers ___changed hook } else { @@ -1225,7 +1239,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { $notice = $this->wire(new $class($text, $flags)); $notice->class = $this->className(); if($this->_notices[$name] === null) $this->_notices[$name] = $this->wire(new Notices()); - $notices = $this->wire('notices'); /** @var Notices $notices */ + $notices = $this->wire()->notices; if($notices) $notices->add($notice); // system wide if(!($notice->flags & Notice::logOnly)) $this->_notices[$name]->add($notice); // local only return $this; @@ -1620,6 +1634,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { $wired = $this->_wire; if($wired === $wire) return; $this->_wire = $wire; + if($this->_wireHooks) $this->_wireHooks = $wire->wire()->hooks; if($wired) return; $this->getInstanceNum(); $this->wired(); @@ -1818,7 +1833,7 @@ abstract class Wire implements WireTranslatable, WireFuelable, WireTrackable { if($value !== null) return $value; } - $hooks = $this->wire('hooks'); /** @var WireHooks $hooks */ + $hooks = $this->_wireHooks(); /** @var WireHooks $hooks */ if($hooks && $hooks->isHooked($name)) { // potential property hook $result = $hooks->runHooks($this, $name, array(), 'property'); return $result['return'];