Re: describe.php - PHP Extensions, Classes, Objects and Functions

From: Date: Tue, 30 Mar 2004 12:07:47 +0000
Subject: Re: describe.php - PHP Extensions, Classes, Objects and Functions
References: 1  Groups: php.general 
Request: Send a blank email to php-general+get-181810@lists.php.net to get a copy of this message
Darnit... I forgot I changed the error handler in my own scripts. Use this instead, sorry for posting bad code the first time around: <?php /** * This is a class that can be used to describe classes, objects, methods, * functions, parameters, properties, and even extensions. * Example usage: * * $desc = new Describe(); * echo '<pre>'; * print_r($desc->describeExtension('standard', true)); * * or * * $desc = new Describe(); * echo '<pre>'; * print_r($desc->describeObject($desc)); */ class Describe {
    /**
     * Wrapper function for private function _describeClass
     *
     * @param  string  $class          The string name of a class
     * @param  bool    $summary        (optional) Print the summary info only.  If false,
     *                                 then this function prints *everything* it finds.
     * @return array with class description or an error
     */
    public function describeClass($class, $summary = false)
    {
        if (class_exists($class)) {
            $class = new Reflection_Class($class);
            return Describe::_describeClass($class, $summary);
        } else {
            return "Could not describe class $class";
        }
    }
    /**
     * Wrapper function for private function _describeObject
     *
     * @param  object  $obj            Any object
     * @param  bool    $summary        (optional) Print the summary info only.  If false,
     *                                 then this function prints *everything* it finds.
     * @return array with class description or an error
     */
    public function describeObject(&$obj, $summary = false)
    {
        if (is_object($obj)) {
            return Describe::_describeObject($obj, $summary);
        } else {
            return "Could not describe the object";
        }
    }
    /**
     * This function returns an array representation of an extension.
     *
     * @param  string  $extension      Name of a loaded extension
     * @param  bool    $summary        (optional) Print the summary info only.  If false,
     *                                 then this function prints *everything* it finds.
     * @return array on success or an error on failure
     */
    public function describeExtension($extension = 'standard', $summary = false)
    {
        if (extension_loaded($extension)) {
            return Describe::_describeExtension(new Reflection_Extension($extension), $summary);
        } else {
            return "Could not describe the extension $extension";
        }
    }
    /**
     * Wrapper function for private function _describeFunction
     *
     * @param  string  $function       Name of a function
     * @param  bool    $summary        (optional) Print the summary info only.  If false,
     *                                 then this function prints *everything* it finds.
     * @return array
     */
    public function describeFunction($function, $summary = false)
    {
        if (function_exists($function)) {
            return Describe::_describeFunction(new Reflection_Function($function), $summary);
        } else {
            return "Could not describe the function $function";
        }
    }
    /**
     * This function returns an array representation of the class / object.
     *
     * @param  mixed   $class_or_obj   Either an object or the string name of a class
     * @param  string  $method         Name of a method in $class_or_obj
     * @param  bool    $summary        (optional) Print the summary info only.  If false,
     *                                 then this function prints *everything* it finds.
     * @return array
     */
    public function describeMethod($class_or_obj, $method, $summary = false)
    {
        if (is_object($class_or_obj)) {
            $class = get_class($class_or_obj);
        } else {
            $class = $class_or_obj;
        }
        if (class_exists($class) && function_exists($method)) {
            return Describe::_describeMethod(new Reflection_Method($classname, $method));
        } else {
            return "Could not describe method $method";
        }
    }
    // }}}
    // {{{ _describeObject()
    private function _describeObject(&$obj, $summary)
    {
        $class = new Reflection_Class(get_class($obj));
        $desc = array();
        if ($summary) {
            $desc['name'] = $class->getName();
            $desc['extends'] = is_string($ext = var_export($class->getParentClass(), 1)) ? $ext : 'none';
            foreach($class->getProperties() as $prop) {
                $desc['properties'][$prop->getName()] = Describe::_describeProperty($prop, true, $obj);
            }
            foreach ($class->getMethods() as $method) {
                $desc['methods'][$method->getName()] = Describe::_describeMethod($method, true);
            }
        } else {
            $desc['name'] = $class->getName();
            $desc['extends'] = is_string($ext = var_export($class->getParentClass(), 1)) ? $ext : 'none';
            $desc['comment'] = $class->getDocComment();
            $desc['file'] = $class->getFileName();
            $desc['start'] = $class->getStartLine();
            $desc['end'] = $class->getEndLine();
            $desc['instantiable'] = $class->isInstantiable() ? 'yes' : 'no';
            $desc['internal'] = $class->isInternal() ? 'internal' : 'user-defined';
            $desc['abstract'] = $class->isAbstract() ? 'abstract' : 'no';
            $desc['final'] = $class->isFinal() ? 'final' : 'no';
            $desc['interface'] = $class->isInterface() ? 'interface' : 'class';
            $desc['implements'] = $class->getInterfaces();
            $desc['constants'] = $class->getConstants();
            foreach($class->getProperties() as $prop) {
                $desc['properties'][$prop->getName()] = Describe::_describeProperty($prop, false, $obj);
            }
            foreach ($class->getMethods() as $method) {
                $desc['methods'][$method->getName()] = Describe::_describeMethod($method, false);
            }
            $desc['modifiers'] = $class->getModifiers();
        }
        return $desc;
    }
    // }}}
    // {{{ _describeClass()
    private function _describeClass(Reflection_Class &$class, $summary)
    {
        $desc = array();
        if ($summary) {
            $desc['name'] = $class->getName();
            $desc['extends'] = is_string($ext = var_export($class->getParentClass(), 1)) ? $ext : 'none';
            foreach($class->getProperties() as $prop) {
                $desc['properties'][$prop->getName()] = Describe::_describeProperty($prop, true);
            }
            foreach ($class->getMethods() as $method) {
                $desc['methods'][$method->getName()] = Describe::_describeMethod($method, true);
            }
        } else {
            $desc['name'] = $class->getName();
            $desc['extends'] = is_string($ext = var_export($class->getParentClass(), 1)) ? $ext : 'none';
            $desc['comment'] = $class->getDocComment();
            $desc['file'] = $class->getFileName();
            $desc['start'] = $class->getStartLine();
            $desc['end'] = $class->getEndLine();
            $desc['instantiable'] = $class->isInstantiable() ? 'yes' : 'no';
            $desc['internal'] = $class->isInternal() ? 'internal' : 'user-defined';
            $desc['abstract'] = $class->isAbstract() ? 'abstract' : 'no';
            $desc['final'] = $class->isFinal() ? 'final' : 'no';
            $desc['interface'] = $class->isInterface() ? 'interface' : 'class';
            $desc['implements'] = $class->getInterfaces();
            $desc['constants'] = $class->getConstants();
            foreach($class->getProperties() as $prop) {
                $desc['properties'][$prop->getName()] = Describe::_describeProperty($prop, false);
            }
            foreach ($class->getMethods() as $method) {
                $desc['methods'][$method->getName()] = Describe::_describeMethod($method, false);
            }
            $desc['modifiers'] = $class->getModifiers();
        }
        return $desc;
    }
    // }}}
    // {{{ _describeMethod()
    private function _describeMethod(Reflection_Method &$method, $summary)
    {
        $desc = array();
        if ($summary) {
            foreach ($method->getParameters() as $param) {
                $desc['parameters'][$param->getName()] = Describe::_describeParameter($param, $summary);
            }
        } else {
            $desc['internal'] = $method->isInternal() ? 'internal' : 'user-defined';
            $desc['abstract'] = $method->isAbstract() ? 'abstract' : 'no';
            $desc['final'] = $method->isFinal() ? 'final' : 'no';
            $desc['public'] = $method->isPublic() ? 'public' : 'no';
            $desc['private'] = $method->isPrivate() ? 'private' : 'no';
            $desc['protected'] = $method->isProtected() ? 'protected' : 'no';
            $desc['static'] = $method->isStatic() ? 'static' : 'no';
            $desc['constructor'] = $method->isConstructor() ? 'the constructor' : 'no, a regular method';
            $desc['file'] = $name = $method->getFileName();
            if ($statics = $method->getStaticVariables()) {
                $desc['statics'] = $statics;
            }
            foreach ($method->getParameters() as $param) {
                $desc['parameters'][$param->getName()] = Describe::_describeParameter($param, $summary);
            }
            $desc['comment'] = $method->getDocComment();
        }
        return $desc;
    }
    private function _describeParameter(Reflection_Parameter &$param, $summary)
    {
        $desc = array();
        if ($summary) {
            $desc['passed'] = $param->isPassedByReference() ? 'by reference' : 'by value';
        } else {
            $desc['name'] = $param->getName();
            $desc['null'] = $param->allowsNull() ? 'allowed' : 'not allowed';
            $desc['passed'] = $param->isPassedByReference() ? 'by reference' : 'by value';
            $desc['class'] = $param->getClass();
        }
        return $desc;
    }
    private function _describeProperty(Reflection_Property &$prop, $summary, $obj = null)
    {
        $desc = array();
        if ($summary) {
            if (is_object($obj)) {
                if ($prop->getDeclaringClass() == get_class($obj)) {
                    $desc['value'] = $prop->getValue($obj);
                }
            }
        } else {
            $desc['name'] = $prop->getName();
            $desc['public'] = $prop->isPublic() ? 'public' : 'no';
            $desc['private'] = $prop->isPrivate() ? 'private' : 'no';
            $desc['protected'] = $prop->isProtected() ? 'protected' : 'no';
            $desc['static'] = $prop->isStatic() ? 'static' : 'no';
            $desc['default'] = $prop->isDefault() ? 'declared at compile time' : 'created at run-time';
            $desc['modifiers'] = $prop->getModifiers();
            $desc['class'] = $prop->getDeclaringClass();
            $desc['string'] = $prop->toString();
        }
        return $desc;
    }
    // }}}
    // {{{ _describeExtension()
    private function _describeExtension(Reflection_Extension &$ext)
    {
        $desc['name'] = $ext->getName();
        $desc['version'] = $ext->getVersion();
        $desc['ini_entries'] = $ext->getINIEntries();
        if ($summary) {
            return $desc;
        }
        foreach ($ext->getFunctions() as $function) {
            $desc['functions'][$function->getName()] = Describe::_describeFunction($function, true);
        }
        $desc['constants'] = $ext->getConstants();
        return $desc;
    }
    // }}}
    // {{{ _describeFunction()
    private function _describeFunction(Reflection_Function &$function, $summary)
    {
        $desc = array();
        if ($summary) {
            foreach ($function->getParameters() as $param) {
                $desc['parameters'][$param->getName()] = Describe::_describeParameter($param, $summary);
            }
        } else {
            $desc['name'] = $function->getName();
            $desc['internal'] = $function->isInternal() ? 'internal' : 'user-defined';
            $desc['user'] = $function->isUserDefined() ? 'user-defined' : 'internal';
            $desc['file'] = $function->getFileName();
            $desc['start'] = $function->getStartLine();
            $desc['end'] = $function->getEndLine();
            /**
            if ($statics = $function->getStaticVariables()) {
                $desc['statics'] = $statics;
            }
            */
            foreach ($function->getParameters() as $param) {
                $desc['parameters'][$param->getName()] = Describe::_describeParameter($param, $summary);
            }
            $desc['returns'] = $function->returnsReference() ? 'reference' : 'value';
            $desc['comment'] = $function->getDocComment();
        }
        return $desc;
    }
} ?>

« previous php.general (#181810) next »