PHP reflection 反射

2013-08-31 16:13  1293人阅读  评论 (0)

PHP reflection 反射

<?php
$define_constants = get_defined_constants();
$define_interfaces = get_declared_interfaces();
$define_classes = get_declared_classes();

$interfaces_classes = array_merge($define_interfaces, $define_classes);
foreach ($interfaces_classes as $name) {
    $r = new ReflectionClass($name);

    // 命名空间
    if ($r->inNamespace()) {
        echo "namespace {$r->getNamespaceName()} {\n";
    }

    // 类定义
    if ($r->isInterface()) {
        echo 'interface ';
    } else {
        if ($r->isFinal()) {
            echo 'final ';
        }
        if ($r->isAbstract()) {
            echo 'abstract ';
        }
        echo 'class ';
    }
    echo $r->getName(), ' ';

    $parent = $r->getParentClass();
    if ($parent) {
        echo 'extends ', $parent->getName(), ' ';
    }

    $interfaces = $r->getInterfaceNames();
    if (count($interfaces) > 0) {
        if ($r->isInterface()) {
            echo 'extends ', implode(', ', $interfaces), ' ';
        } else {
            echo 'implements ', implode(', ', $interfaces), ' ';
        }
    }

    echo "{\n";

    // 常量
    $constants = $r->getConstants();
    foreach ($constants as $name => $value) {
        echo 'const ', $name, ' = ';
        echo var_export($value, true);
        echo ";\n";
    }
    echo "\n";

    // 属性
    $properties = $r->getProperties();
    $defaultProperties = $r->getDefaultProperties();
//  var_dump($properties); exit();
//  var_dump($defaultProperties); exit();
    foreach ($properties as $p) {
        if ($p->isPrivate()) {
            echo 'private ';
        }
        if ($p->isProtected()) {
            echo 'protected ';
        }
        if ($p->isPublic()) {
            echo 'public ';
        }
        if ($p->isStatic()) {
            echo 'static ';
        }
        echo '$', $p->getName(), ' = ';
        echo var_export($defaultProperties[$p->getName()], true);
        echo ";\n";
    }
    echo "\n";

    // 方法
    $methods = $r->getMethods();
//  var_dump($methods); exit();
    foreach ($methods as $method) {
        // 参数注释
        $doc_lines = array();
        $params = $method->getParameters();
        foreach ($params as $p) {
            $param_str = '';
            $type = $p->getClass();
            if ($type) {
                $doc_lines[] = ' * @param ' . $type->getName() . ' $' . $p->getName();
            }
            if ($p->isArray()) {
                $doc_lines[] = ' * @param array $' . $p->getName();
            }
//          if ($p->isCallable()) { // PHP > 5.4.0
//              $doc_lines[] = ' * @param callable $' . $p->getName();
//          }
        }
        if (!empty($doc_lines)) {
            echo "/**\n" . implode("\n", $doc_lines) . " */\n";
        }

        // 修饰符
        if ($method->isConstructor() || $method->isDestructor()) {
        } else {
            if ($method->isFinal()) {
                echo 'final ';
            }
            if ($method->isAbstract()) {
                echo 'abstract ';
            }
            if ($method->isPrivate()) {
                echo 'private ';
            }
            if ($method->isProtected()) {
                echo 'protected ';
            }
            if ($method->isPublic()) {
                echo 'public ';
            }
            if ($method->isStatic()) {
                echo 'static ';
            }
        }
        echo 'function ';
//      if ($method->returnsReference()); {
//          echo '&';
//      }
        echo $method->getName(), "(";

        // 参数
        $params = $method->getParameters();
        $params_arr = array();
//      var_dump($params); exit();
        foreach ($params as $p) {
            $param_str = '';
            $type = $p->getClass();
            if ($type) {
                $param_str .= $type->getName() . ' ';
            }
            if ($p->isArray()) {
                $param_str .= 'array ';
            }
//          if ($p->isCallable()) { // PHP > 5.4.0
//              $param_str .= 'callable ';
//          }


            if ($p->isPassedByReference()) {
                $param_str .= '&';
            }

            $param_str .= '$' . $p->getName();

//          if ($p->isDefaultValueConstant()) { // PHP > 5.4.6
//              $param_str .= ' = ' . var_export($p->getDefaultValueConstantName(), true);
//          }
            if ($p->isDefaultValueAvailable()) { // $p->isOptional()) {
                $param_str .= ' = ' . var_export($p->getDefaultValue(), true);
            }

            $params_arr[] = $param_str;
        }

        echo implode(', ', $params_arr);

        echo ");\n";

        // 返回值
        // 这个......, 弱类型 郁闷
    }

    // 类结束
    echo "}\n";

    // 命名空间
    if ($r->inNamespace()) {
        echo "}\n";
    }

    echo "\n";
}