コード例 #1
0
ファイル: Method.php プロジェクト: kukulich/php-generator
 /**
  * @return self
  */
 public static function from($from) : self
 {
     if (is_string($from) && strpos($from, '::')) {
         $from = new \ReflectionMethod($from);
     } elseif (is_array($from)) {
         $from = new \ReflectionMethod($from[0], $from[1]);
     } elseif (!$from instanceof \ReflectionFunctionAbstract) {
         $from = new \ReflectionFunction($from);
     }
     $method = new static();
     $method->name = $from->isClosure() ? NULL : $from->getName();
     foreach ($from->getParameters() as $param) {
         $method->parameters[$param->getName()] = Parameter::from($param);
     }
     if ($from instanceof \ReflectionMethod) {
         $method->static = $from->isStatic();
         $method->visibility = $from->isPrivate() ? 'private' : ($from->isProtected() ? 'protected' : NULL);
         $method->final = $from->isFinal();
         $method->abstract = $from->isAbstract() && !$from->getDeclaringClass()->isInterface();
         $method->body = $from->isAbstract() ? FALSE : '';
     }
     $method->returnReference = $from->returnsReference();
     $method->variadic = PHP_VERSION_ID >= 50600 && $from->isVariadic();
     $method->comment = $from->getDocComment() ? preg_replace('#^\\s*\\* ?#m', '', trim($from->getDocComment(), "/* \r\n\t")) : NULL;
     if (PHP_VERSION_ID >= 70000 && $from->hasReturnType()) {
         $returnType = $from->getReturnType();
         $method->returnType = $returnType->isBuiltin() ? (string) $returnType : '\\' . $returnType;
     }
     return $method;
 }
コード例 #2
0
 static function castClosure($c)
 {
     $a = array();
     if (!class_exists('ReflectionFunction', false)) {
         return $a;
     }
     $c = new \ReflectionFunction($c);
     foreach ($c->getParameters() as $p) {
         $n = ($p->isPassedByReference() ? '&$' : '$') . $p->getName();
         if ($p->isDefaultValueAvailable()) {
             $a[$n] = $p->getDefaultValue();
         } else {
             $a[] = $n;
         }
     }
     $m = self::META_PREFIX;
     $a = array($m . 'returnsRef' => true, $m . 'args' => $a);
     if (!$c->returnsReference()) {
         unset($a[$m . 'returnsRef']);
     }
     $a[$m . 'use'] = array();
     if (false === ($a[$m . 'file'] = $c->getFileName())) {
         unset($a[$m . 'file']);
     } else {
         $a[$m . 'lines'] = $c->getStartLine() . '-' . $c->getEndLine();
     }
     if (!($c = $c->getStaticVariables())) {
         unset($a[$m . 'use']);
     } else {
         foreach ($c as $p => &$c) {
             $a[$m . 'use']['$' . $p] =& $c;
         }
     }
     return $a;
 }
コード例 #3
0
ファイル: funcitons.php プロジェクト: gariev/xref
function function_signature($function_name)
{
    try {
        $rf = new ReflectionFunction($function_name);
    } catch (Exception $e) {
        return null;
    }
    $params = array();
    $unknown_param_name = 'unk0';
    foreach ($rf->getParameters() as $rp) {
        $param = $rp->isPassedByReference() ? '&' : '';
        $name = $rp->getName();
        if ($name == '') {
            $name = '$' . $unknown_param_name;
            $unknown_param_name++;
        } elseif ($name == '...') {
        } else {
            $name = '$' . $name;
        }
        $param .= $name;
        if ($rp->isOptional()) {
            $param .= ' = null';
            // is there better way to show that it's optional?
        }
        $params[] = $param;
    }
    $str = "";
    $str .= $rf->returnsReference() ? '&' : '';
    $str .= $rf->getName();
    $str .= '(' . implode(", ", $params) . ')';
    return $str;
}
コード例 #4
0
 public function testMatchReflector()
 {
     $function = FunctionDeclarationNode::create('array_walk');
     $reflector = new \ReflectionFunction('array_walk');
     // $function->getReference() should return a TokenNode or NULL, which will
     // loosely evaluate to TRUE or FALSE
     $this->assertEquals($function->getReference(), $reflector->returnsReference());
 }
コード例 #5
0
 /**
  * Returns whether this function returns a reference
  *
  * @return boolean True if this function returns a reference
  */
 public function returnsReference()
 {
     if ($this->reflectionSource instanceof ReflectionFunction) {
         return $this->reflectionSource->returnsReference();
     } else {
         return parent::returnsReference();
     }
 }
コード例 #6
0
 public static function fromReflection(\ReflectionFunction $ref)
 {
     $function = PhpFunction::create($ref->name)->setReferenceReturned($ref->returnsReference())->setBody(ReflectionUtils::getFunctionBody($ref));
     $docblock = new Docblock($ref);
     $function->setDocblock($docblock);
     $function->setDescription($docblock->getShortDescription());
     $function->setLongDescription($docblock->getLongDescription());
     foreach ($ref->getParameters() as $refParam) {
         assert($refParam instanceof \ReflectionParameter);
         // hmm - assert here?
         $param = PhpParameter::fromReflection($refParam);
         $function->addParameter($param);
     }
     return $function;
 }
コード例 #7
0
ファイル: PhpFunction.php プロジェクト: ingeniorweb/symfo3cv
 public static function fromReflection(\ReflectionFunction $ref)
 {
     $function = new static();
     if (false === ($pos = strrpos($ref->name, '\\'))) {
         $function->setName(substr($ref->name, $pos + 1));
         $function->setNamespace(substr($ref->name, $pos));
     } else {
         $function->setName($ref->name);
     }
     $function->referenceReturned = $ref->returnsReference();
     $function->docblock = ReflectionUtils::getUnindentedDocComment($ref->getDocComment());
     foreach ($ref->getParameters() as $refParam) {
         assert($refParam instanceof \ReflectionParameter);
         $param = PhpParameter::fromReflection($refParam);
         $function->addParameter($param);
     }
     return $function;
 }
コード例 #8
0
ファイル: Class.php プロジェクト: amptools-net/midori-php
 /**
  * Returns the signature of a function.
  *
  * @param  ReflectionFunction $function
  * @return string
  * @since  Method available since Release 3.3.2
  * @todo   Find a better place for this method.
  */
 public static function getFunctionSignature(ReflectionFunction $function)
 {
     if ($function->returnsReference()) {
         $reference = '&';
     } else {
         $reference = '';
     }
     return sprintf('function %s%s(%s)', $reference, $function->getName(), self::getMethodParameters($function));
 }
コード例 #9
0
ファイル: reflection.php プロジェクト: alphaxxl/hhvm
var_dump($rf->getNumberOfRequiredParameters());
print "\n";
print "--- getParameters(\"f\") ---\n";
var_dump($rf->getParameters());
print "\n";
print "--- getStaticVariables(\"f\") ---\n";
var_dump($rf->getStaticVariables());
print "\n";
print "--- isInternal(\"f\") ---\n";
var_dump($rf->isInternal());
print "\n";
print "--- isUserDefined(\"f\") ---\n";
var_dump($rf->isUserDefined());
print "\n";
print "--- returnsReference(\"f\") ---\n";
var_dump($rf->returnsReference());
print "\n";
print "--- export(\"f\") ---\n";
var_dump($rf->export('f', true));
print "\n";
# invoke() can't be used because $b is pass-by-reference.
print "--- invokeArgs(\"f\") ---\n";
$b = "b";
var_dump($rf->invokeArgs(array("a", &$b, "c")));
var_dump($rf->invokeArgs(array("a", &$b, "c")));
print "\n";
print "--- getStaticVariables(\"f\") ---\n";
$rf = new ReflectionFunction("f");
var_dump($rf->getStaticVariables());
print "\n";
/**
コード例 #10
0
ファイル: ProjectDatabase.class.php プロジェクト: gariev/xref
 /**
  * @param ReflectionMethod $rm
  * @return XRef_Function
  */
 private function getFunctionByReflection(ReflectionFunction $rf)
 {
     $m = new XRef_Function();
     $m->name = $rf->getName();
     $m->index = $m->bodyStarts = $m->bodyEnds = $m->nameIndex = -1;
     $m->isDeclaration = false;
     $m->returnsReference = $rf->returnsReference();
     foreach ($rf->getParameters() as $rp) {
         $p = new XRef_FunctionParameter();
         $p->hasDefaultValue = $rp->isOptional();
         $p->name = $rp->getName();
         $p->isPassedByReference = $rp->isPassedByReference();
         $m->parameters[] = $p;
     }
     return $m;
 }
コード例 #11
0
ファイル: aliasBuilder.php プロジェクト: asgrim/PHPPHP
<?php

$funcs = get_defined_functions();
$output = "<?php\nuse PHPPHP\\Engine\\ParamData;\n\nreturn array(\n";
foreach ($funcs['internal'] as $func) {
    $output .= "    array('{$func}', ";
    $r = new ReflectionFunction($func);
    $output .= $r->returnsReference() ? 'true' : 'false';
    $output .= ', array(';
    foreach ($r->getParameters() as $param) {
        $output .= "new ParamData('" . $param->getName() . "', ";
        $output .= $param->isPassedByReference() ? "true" : "false";
        if ($param->isArray()) {
            $output .= ", 'array', ";
        } else {
            $output .= ", '', ";
        }
        $output .= $param->isOptional() ? "true" : 'false';
        $output .= "), ";
    }
    $output .= ")),\n";
}
$output .= ");";
file_put_contents(__DIR__ . '/aliases.php', $output);
コード例 #12
0
ファイル: 025.php プロジェクト: badlamer/hhvm
$func = new ReflectionFunction("test");
var_dump($func->export("test"));
echo "--getName--\n";
var_dump($func->getName());
echo "--isInternal--\n";
var_dump($func->isInternal());
echo "--isUserDefined--\n";
var_dump($func->isUserDefined());
echo "--getFilename--\n";
var_dump($func->getFilename());
echo "--getStartline--\n";
var_dump($func->getStartline());
echo "--getEndline--\n";
var_dump($func->getEndline());
echo "--getDocComment--\n";
var_dump($func->getDocComment());
echo "--getStaticVariables--\n";
var_dump($func->getStaticVariables());
echo "--invoke--\n";
var_dump($func->invoke(array(1, 2, 3)));
echo "--invokeArgs--\n";
var_dump($func->invokeArgs(array(1, 2, 3)));
echo "--returnsReference--\n";
var_dump($func->returnsReference());
echo "--getParameters--\n";
var_dump($func->getParameters());
echo "--getNumberOfParameters--\n";
var_dump($func->getNumberOfParameters());
echo "--getNumberOfRequiredParameters--\n";
var_dump($func->getNumberOfRequiredParameters());
echo "Done\n";