![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/framework/DataObject/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Framework\DataObject; /** * Object Cache * * Stores objects for reuse, cleanup and to avoid circular references * * @author Magento Core Team <[email protected]> */ class Cache { /** * Singleton instance * * @var \Magento\Framework\DataObject\Cache */ protected static $_instance; /** * Running object index for anonymous objects * * @var integer */ protected $_idx = 0; /** * Array of objects * * @var array of objects */ protected $_objects = []; /** * SPL object hashes * * @var array */ protected $_hashes = []; /** * SPL hashes by object * * @var array */ protected $_objectHashes = []; /** * Objects by tags for cleanup * * @var array 2D */ protected $_tags = []; /** * Tags by objects * * @var array 2D */ protected $_objectTags = []; /** * References to objects * * @var array */ protected $_references = []; /** * References by object * * @var array 2D */ protected $_objectReferences = []; /** * Debug data such as backtrace per class * * @var array */ protected $_debug = []; /** * Singleton factory * * @return \Magento\Framework\DataObject\Cache */ public static function singleton() { if (!self::$_instance) { self::$_instance = new self(); } return self::$_instance; } /** * Load an object from registry * * @param string|object $idx * @param object $default * @return object */ public function load($idx, $default = null) { if (isset($this->_references[$idx])) { $idx = $this->_references[$idx]; } if (isset($this->_objects[$idx])) { return $this->_objects[$idx]; } return $default; } /** * Save an object entry * * @param object $object * @param string $idx * @param array|string $tags * @return string * @throws \Magento\Framework\Exception\LocalizedException * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function save($object, $idx = null, $tags = null) { //\Magento\Framework\Profiler::start('OBJECT_SAVE'); if (!is_object($object)) { return false; } $hash = spl_object_hash($object); if ($idx !== null && strpos($idx, '{') !== false) { $idx = str_replace('{hash}', $hash, $idx); } if (isset($this->_hashes[$hash])) { //throw new \Exception('test'); if ($idx !== null) { $this->_references[$idx] = $this->_hashes[$hash]; } return $this->_hashes[$hash]; } if ($idx === null) { $idx = '#' . ++$this->_idx; } if (isset($this->_objects[$idx])) { throw new \Magento\Framework\Exception\LocalizedException( new \Magento\Framework\Phrase( 'Object already exists in registry (%1). Old object class: %2, new object class: %3', [$idx, get_class($this->_objects[$idx]), get_class($object)] ) ); } $this->_objects[$idx] = $object; $this->_hashes[$hash] = $idx; $this->_objectHashes[$idx] = $hash; if (is_string($tags)) { $this->_tags[$tags][$idx] = true; $this->_objectTags[$idx][$tags] = true; } elseif (is_array($tags)) { foreach ($tags as $t) { $this->_tags[$t][$idx] = true; $this->_objectTags[$idx][$t] = true; } } //\Magento\Framework\Profiler::stop('OBJECT_SAVE'); return $idx; } /** * Add a reference to an object * * @param string|array $refName * @param string $idx * @return bool|void * @throws \Magento\Framework\Exception\LocalizedException */ public function reference($refName, $idx) { if (is_array($refName)) { foreach ($refName as $ref) { $this->reference($ref, $idx); } return; } if (isset($this->_references[$refName])) { throw new \Magento\Framework\Exception\LocalizedException( new \Magento\Framework\Phrase( 'The reference already exists: %1. New index: %2, old index: %3', [$refName, $idx, $this->_references[$refName]] ) ); } $this->_references[$refName] = $idx; $this->_objectReferences[$idx][$refName] = true; return true; } /** * Delete an object from registry * * @param string|object $idx * @return boolean */ public function delete($idx) { //\Magento\Framework\Profiler::start("OBJECT_DELETE"); if (is_object($idx)) { $idx = $this->find($idx); if (false === $idx) { //\Magento\Framework\Profiler::stop("OBJECT_DELETE"); return false; } unset($this->_objects[$idx]); //\Magento\Framework\Profiler::stop("OBJECT_DELETE"); return false; } elseif (!isset($this->_objects[$idx])) { //\Magento\Framework\Profiler::stop("OBJECT_DELETE"); return false; } unset($this->_objects[$idx]); unset($this->_hashes[$this->_objectHashes[$idx]], $this->_objectHashes[$idx]); if (isset($this->_objectTags[$idx])) { foreach ($this->_objectTags[$idx] as $t => $dummy) { unset($this->_tags[$t][$idx]); } unset($this->_objectTags[$idx]); } if (isset($this->_objectReferences[$idx])) { foreach ($this->_references as $r => $dummy) { unset($this->_references[$r]); } unset($this->_objectReferences[$idx]); } //\Magento\Framework\Profiler::stop("OBJECT_DELETE"); return true; } /** * Cleanup by class name for objects of subclasses too * * @param string $class * @return void */ public function deleteByClass($class) { foreach ($this->_objects as $idx => $object) { if ($object instanceof $class) { $this->delete($idx); } } } /** * Cleanup objects by tags * * @param array|string $tags * @return true * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function deleteByTags($tags) { if (is_string($tags)) { $tags = [$tags]; } foreach ($tags as $t) { foreach ($this->_tags[$t] as $idx => $dummy) { $this->delete($idx); } } return true; } /** * Check whether object id exists in registry * * @param string $idx * @return boolean */ public function has($idx) { return isset($this->_objects[$idx]) || isset($this->_references[$idx]); } /** * Find an object id * * @param object $object * @return string|boolean */ public function find($object) { foreach ($this->_objects as $idx => $obj) { if ($object === $obj) { return $idx; } } return false; } /** * Find objects by ids * * @param string[] $ids * @return array */ public function findByIds($ids) { $objects = []; foreach ($this->_objects as $idx => $obj) { if (in_array($idx, $ids)) { $objects[$idx] = $obj; } } return $objects; } /** * Find object by hash * * @param string $hash * @return object */ public function findByHash($hash) { return isset($this->_hashes[$hash]) ? $this->_objects[$this->_hashes[$hash]] : null; } /** * Find objects by tags * * @param array|string $tags * @return array * @SuppressWarnings(PHPMD.UnusedLocalVariable) */ public function findByTags($tags) { if (is_string($tags)) { $tags = [$tags]; } $objects = []; foreach ($tags as $t) { foreach ($this->_tags[$t] as $idx => $dummy) { if (isset($objects[$idx])) { continue; } $objects[$idx] = $this->load($idx); } } return $objects; } /** * Find by class name for objects of subclasses too * * @param string $class * @return array */ public function findByClass($class) { $objects = []; foreach ($this->_objects as $idx => $object) { if ($object instanceof $class) { $objects[$idx] = $object; } } return $objects; } /** * Debug * * @param string $idx * @param object|null $object * @return void * @SuppressWarnings(PHPMD.UnusedFormalParameter) */ public function debug($idx, $object = null) { $bt = debug_backtrace(); $debug = []; foreach ($bt as $i => $step) { $debug[$i] = [ 'file' => isset($step['file']) ? $step['file'] : null, 'line' => isset($step['line']) ? $step['line'] : null, 'function' => isset($step['function']) ? $step['function'] : null, ]; } $this->_debug[$idx] = $debug; } /** * Return debug information by ids * * @param array|string $ids * @return array */ public function debugByIds($ids) { if (is_string($ids)) { $ids = [$ids]; } $debug = []; foreach ($ids as $idx) { $debug[$idx] = $this->_debug[$idx]; } return $debug; } /** * Get all objects * * @return array */ public function getAllObjects() { return $this->_objects; } /** * Get all tags * * @return array */ public function getAllTags() { return $this->_tags; } /** * Get all tags by object * * @return array */ public function getAllTagsByObject() { return $this->_objectTags; } /** * Get all references * * @return array */ public function getAllReferences() { return $this->_references; } }