annotate vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 4c8ae668cc8c
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Prophecy.
Chris@0 5 * (c) Konstantin Kudryashov <ever.zet@gmail.com>
Chris@0 6 * Marcello Duarte <marcello.duarte@gmail.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Prophecy\Doubler;
Chris@0 13
Chris@0 14 use ReflectionClass;
Chris@0 15
Chris@0 16 /**
Chris@0 17 * Cached class doubler.
Chris@0 18 * Prevents mirroring/creation of the same structure twice.
Chris@0 19 *
Chris@0 20 * @author Konstantin Kudryashov <ever.zet@gmail.com>
Chris@0 21 */
Chris@0 22 class CachedDoubler extends Doubler
Chris@0 23 {
Chris@0 24 private $classes = array();
Chris@0 25
Chris@0 26 /**
Chris@0 27 * {@inheritdoc}
Chris@0 28 */
Chris@0 29 public function registerClassPatch(ClassPatch\ClassPatchInterface $patch)
Chris@0 30 {
Chris@0 31 $this->classes[] = array();
Chris@0 32
Chris@0 33 parent::registerClassPatch($patch);
Chris@0 34 }
Chris@0 35
Chris@0 36 /**
Chris@0 37 * {@inheritdoc}
Chris@0 38 */
Chris@0 39 protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
Chris@0 40 {
Chris@0 41 $classId = $this->generateClassId($class, $interfaces);
Chris@0 42 if (isset($this->classes[$classId])) {
Chris@0 43 return $this->classes[$classId];
Chris@0 44 }
Chris@0 45
Chris@0 46 return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces);
Chris@0 47 }
Chris@0 48
Chris@0 49 /**
Chris@0 50 * @param ReflectionClass $class
Chris@0 51 * @param ReflectionClass[] $interfaces
Chris@0 52 *
Chris@0 53 * @return string
Chris@0 54 */
Chris@0 55 private function generateClassId(ReflectionClass $class = null, array $interfaces)
Chris@0 56 {
Chris@0 57 $parts = array();
Chris@0 58 if (null !== $class) {
Chris@0 59 $parts[] = $class->getName();
Chris@0 60 }
Chris@0 61 foreach ($interfaces as $interface) {
Chris@0 62 $parts[] = $interface->getName();
Chris@0 63 }
Chris@0 64 sort($parts);
Chris@0 65
Chris@0 66 return md5(implode('', $parts));
Chris@0 67 }
Chris@0 68 }