コード例 #1
0
ファイル: closure.php プロジェクト: xihewang/atoum
 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;
 }