Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2005/05/28

counter hits
since 1999/11/06


PHP5を試してみる - 組み込みクラス一覧をリフレクションAPIを使って表示してみる

memoサンプルは、EXPERIENCEで実際に確認できるようにしてますので、気になる方は見てみてください。

PHP5での例外処理で、組み込みクラスの1つである「exception」クラスが出てきましたが、調べてみると、知らない間に結構組み込まれているようです(^-^;

そこで、クラスの一覧を出力するサンプルスクリプトを作ってみました。PHPVolcanoにもサンプルスクリプトがありますが、ここではPHP5.0.0β2から追加されたリフレクションAPIを使ってみました。また、interfaceの一覧も表示します。リフレクションを使用する深い意味はなかったんですが、せっかくの新機能なので。。。(^-^;

一覧される内容としては、

  • クラス名
  • 親クラス名
  • 実装しているinterface名
  • メンバー変数名(privateを含む)
  • メソッド名(引数、privateを含む)

な感じになっています。ちなみに、PHPマニュアルの方もようやく追いつきましたね。

実行結果は、www.doyouphp.jpでの実行結果を参照してください。見ていただくと分かりますが、exception以外にもリフレクション、各種イテレータ(iterator)、OCI(LOB)、DOM、SOAPなどに組み込みクラスが存在しています。

●11.builtin.php5

<?php
echo phpversion();
?>
<hr>
<?php
printClasses(get_declared_classes());
echo "<hr>";
printInterfaces(get_declared_interfaces());

function printClasses($arr) { printObjects($arr, "class"); }
function printInterfaces($arr) { printObjects($arr, "interface"); }
function printObjects($arr, $type) {
    $class = null;
    echo "<ol>\n";
    foreach($arr as $class_name) {
        $class= new ReflectionClass($class_name);
        echo "<li><font color=\"blue\">" . $type . "</font> "
            . getAbstractString($class->isAbstract())
            . getFinalString($class->isFinal())
            . $class->getName();
        if ($class->getParentClass() != "") {
            echo " <font color=\"red\">extends</font> "
                . $class->getParentClass()->getName();
        }
        if (is_array($class->getInterfaces()) &&
            sizeof($class->getInterfaces()) > 0) {
                echo "  <font color=\"red\">implements</font> ";
                foreach ($class->getInterfaces() as $i_f) {
                    echo $i_f->getName();
                }
        }
        echo "</li>\n";
        printProperties($class);
        printMethods($class);
        $class = null;
    }
    echo "</ol>\n";
}
?>
<?php
function printProperties($class)
{
    echo "<ul>\n";
    foreach($class->getProperties() as $prop) {
        echo "<li><font color=\"red\">"
            . getModifierString($prop->getModifiers())
            . "</font> "
            . $prop->getName()
            . "</li>\n";
    }
    echo "</ul>\n";
}
function printMethods($class)
{
    echo "<ul>\n";
    foreach($class->getMethods() as $method) {
        echo "<li><font color=\"red\">"
            . getModifierString($method->getModifiers())
            . "</font> "
            . ($method->returnsReference() ? '&' : '')
            . $method->getName();
        printMethodParameters($method);
        echo "</li>\n";
    }
    echo "</ul>\n";
}
function printMethodParameters($method)
{
    $tmp = array();
    echo "(";
    foreach($method->getParameters() as $i => $param) {
        $tmp[] = $param->getName();
    }
    echo join($tmp, ", ") . ")<br>";
    echo "<ul>";
    foreach($method->getStaticVariables() as $i => $vals) {
        echo "<li>static " . $vals;
    }
    echo "</ul>";
}
function getModifierString($modifiers)
{
    return implode(" ", Reflection::getModifierNames($modifiers));
}
function getFinalString($isfinal) { return ($isfinal ? "final " : ""); }
function getAbstractString($isabs) { return ($isabs ? "abstract " : ""); }
?>
<hr>
<?php
    show_source($_SERVER["SCRIPT_FILENAME"]);
?>

リフレクションAPIには、PHPスクリプト中のコメントを取得するようなメソッドも用意されていますので、ひょっとするとPHPDocなどのドキュメンテーション化ツールでも使われるようになるのかなぁ。。。と思ってみたり。



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2005 by Hideyuki SHIMOOKA all rights reserved.