public function build(\reflectionClass $class, &$instance = null) { $this->factory = null; if ($class->isInterface() === false && $class->isAbstract() === false) { $constructor = $class->getConstructor(); if ($constructor === null || $constructor->isPublic() === true) { $constructorParameters = $closureParameters = array(); if ($constructor !== null) { $this->allArgumentsAreOptional = $constructor->getNumberOfRequiredParameters() === 0; foreach ($constructor->getParameters() as $position => $parameter) { $closureParameters[$position] = ($parameter->isPassedByReference() === false ? '' : '& ') . ($constructorParameters[$position] = '$' . $parameter->getName()); if (self::isVariadic($parameter)) { $closureParameters[$position] = '...' . $closureParameters[$position]; $constructorParameters[$position] = '...' . $constructorParameters[$position]; } switch (true) { case $parameter->isDefaultValueAvailable(): $defaultValue = var_export($parameter->getDefaultValue(), true); break; case $parameter->isOptional() && self::isVariadic($parameter) === false: $defaultValue = 'null'; break; default: $defaultValue = null; } if ($defaultValue !== null) { $closureParameters[$position] .= ' = ' . $defaultValue; } } } if ($constructor === null || sizeof($closureParameters) <= 0) { $this->factory = function () use(&$instance, $class) { return $instance = $class->newInstanceArgs(func_get_args()); }; } else { $this->factory = eval('return function(' . join(', ', $closureParameters) . ') use (& $instance) { return ($instance = new ' . $class->getName() . '(' . join(', ', $constructorParameters) . ')); };'); } } } return $this; }
protected function generateInterfaceCode(\reflectionClass $class, $mockNamespace, $mockClass) { $addIteratorAggregate = $class->isInstantiable() === false && ($class->implementsInterface('traversable') === true && $class->implementsInterface('iterator') === false && $class->implementsInterface('iteratorAggregate') === false); return 'namespace ' . ltrim($mockNamespace, '\\') . ' {' . PHP_EOL . 'final class ' . $mockClass . ' implements \\' . ($addIteratorAggregate === false ? '' : 'iteratorAggregate, \\') . $class->getName() . ', \\' . __NAMESPACE__ . '\\aggregator' . PHP_EOL . '{' . PHP_EOL . self::generateMockControllerMethods() . $this->generateInterfaceMethodCode($class, $addIteratorAggregate) . '}' . PHP_EOL . '}'; }
protected function isExcluded(\reflectionClass $class) { $className = $class->getName(); if ($this->isInExcludedClasses($className) === true || $this->isInExcludedNamespaces($className) === true) { return true; } else { $fileName = $class->getFileName(); return $fileName === false || $this->isInExcludedDirectories($fileName) === true; } }
protected static function generateInterfaceCode(\reflectionClass $class, $mockNamespace, $mockClass) { return 'namespace ' . ltrim($mockNamespace, '\\') . ' {' . PHP_EOL . 'final class ' . $mockClass . ' implements \\' . $class->getName() . ', \\' . __NAMESPACE__ . '\\aggregator' . PHP_EOL . '{' . PHP_EOL . self::generateMockControllerMethod() . self::generateInterfaceMethodCode($class) . '}' . PHP_EOL . '}'; }