/** * Get Class Reflection Instance * * @access protected * @throws \LogicException * @param \Symfony\Component\Finder\SplFileInfo $file * @param string $namespace * @param string $suffix * @param string $parent * @param integer $allowedParameters * @return \Darsyn\ClassFinder\Reflection\ReflectionClass */ protected function getClassReflection(SplFileInfo $file, $namespace, $suffix, $parent, $allowedParameters) { // Determine the fully-qualified class name of the found file. $class = preg_replace('#\\\\{2,}#', '\\', sprintf('%s\\%s\\%s', $namespace, strtr($file->getRelativePath(), '/', '\\'), $file->getBasename($this->extension))); // Make sure that the class name has the correct suffix. if (!empty($suffix) && substr($class, 0 - strlen($suffix)) !== $suffix) { throw new \LogicException(sprintf('The file found at "%s" does not end with the required suffix of "%s".', $file->getRealPath(), $suffix)); } // We have to perform a few checks on the class before we can return it. // - It must be an actual class; not interface, abstract or trait types. // - For this to work the constructor must not have more than the expected number of required parameters. // - And finally make sure that the class loaded was actually loaded from the directory we found it in. // TODO: Make sure that the final (file path) check doesn't cause problems with proxy classes or // bootstraped/compiled class caches. $reflect = new ReflectionClass($class, $file->getRelativePath()); if (is_object($construct = $reflect->getConstructor()) && $construct->getNumberOfRequiredParameters() > $allowedParameters || $reflect->isAbstract() || $reflect->isInterface() || $reflect->isTrait() || is_string($parent) && !empty($parent) && !$reflect->isSubclassOf($parent) || $reflect->getFileName() !== $file->getRealPath()) { throw new \LogicException(sprintf('The class definition for "%s" is invalid.', $class)); } return $reflect; }
public function testRelativePositionProcessing() { $reflect = new ReflectionClass(__CLASS__, '\\Tests\\Fixtures/Reflection/'); $this->assertEquals('Tests/Fixtures/Reflection', $reflect->getRelativeDirectory()); $this->assertEquals('Tests\\Fixtures\\Reflection', $reflect->getRelativeNamespace()); }