blob: 399ec84514791d2b3227c1cf0d8f05d8bfbb5632 [file] [log] [blame]
eZ component: Reflection, Design
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Reflection API of PHP
(http://www.php.net/manual/en/language.oop5.reflection.php) itself is
implemented as an extension written in C for maximum performance and conceptual
reasons. The Reflection component is based on this PHP extension and several
elements are derived from the given base classes.
Design description
------------------
The Reflection component is shown in the class diagram. For
all classes of the Reflection API new subclasses are introduced which provide
additional functionality and methods to access annotations and data types.
ezcReflectionClass
ezcReflectionClass inherits from ReflectionClass and redefines all methods
which return a PHP reflection object to return objects from the Reflection
component. In addition to that methods for annotation handling are
introduced e.g. getTags getAnnotations, isTagged hasAnnotation. The generic
getDocComment method is superseded by getShortDescription and
getLongDescription. These methods return only the relevant parts of interest
from a PHPDoc comment.
class ezcReflectionClass extends ReflectionClass {
public void __construct(string $name)
public ezcReflectionMethod getMethod(string $name)
public ezcReflectionMethod getConstructor()
public ezcReflectionMethod[] getMethods()
public ezcReflectionClassType getParentClass()
public ezcReflectionProperty getProperty(string $name)
public ezcReflectionProperty[] getProperties()
public boolean isWebService()
public string getShortDescription()
public string getLongDescription()
public boolean isTagged(string $with)
public ezcReflectionDocTag[] getTags(string $name)
public ezcReflectionExtension getExtension()
}
The enhancements to the Reflection API in the classes ezcReflectionFunction,
ezcReflectionMethod, ezcReflectionParameter, ezcReflectionProperty and
ezcReflectionExtension are analogue to those made in ezcReflectionClass and have
a similar behavior.
class ezcReflectionExtension extends ReflectionExtension {
public void __construct(string $name)
public ezcReflectionFunction[] getFunctions()
public ezcReflectionClass[] getClasses()
}
class ezcReflectionFunction extends ReflectionFunction {
public void __construct(string $name)
public ezcReflectionParameter[] getParameters()
public ezcReflectionType getReturnType()
public string getReturnDescription()
public boolean isWebmethod()
public string getShortDescription()
public string getLongDescription()
public boolean isTagged(string $with)
public ezcReflectionDocTag[] getTags(string $name)
}
class ezcReflectionMethod extends ReflectionMethod {
public void __construct(mixed class, string name)
public ezcReflectionParameter[] getParameters()
public ezcReflectionType getReturnType()
public string getReturnDescription()
public boolean isWebmethod()
public string getShortDescription()
public string getLongDescription()
public boolean isTagged(string $with)
public ezcReflectionDocTag[] getTags(string $name)
public boolean isMagic()
public ezcReflectionClassType getDeclaringClass()
}
class ezcReflectionParameter extends ReflectionParameter {
public void __construct(mixed mixed, mixed parameter)
public ezcReflectionType getType()
public ezcReflectionClassType getClass()
public ezcReflectionFunction getDeclaringFunction()
public ezcReflectionClassType getDeclaringClass()
}
class ezcReflectionProperty extends ReflectionProperty {
public void __construct(mixed class, string name)
public ezcReflectionType getType()
public ezcReflectionClassType getDeclaringClass()
}
ezcReflection
A static class called ezcReflection is defined which acts as a central
entry point and factory for reflection.
It holds a factory for reflection type objects and a factory for
documentation parser objects.
getTypeByName will return the appropriate type object for a given data type
name e.g., specified in an annotation.
For extensibility it is possible to set a different factory for type objects
and implement custom type objects with new features.
Currently the ezcReflectionPhpDocParser is used to parse the documentation
to gather type information. If another documentation style then PHPDoc is used
a new parser can be set with setDocParser. The parser object has to support
the clone operation, because each new type object got its own parser object.
ezcReflectionTypeFactory
A type factory has to implement the interface ezcReflectionTypeFactory and
can be used to extend the provided type system with additional features.
ezcReflectionTypeFactoryImpl
If no type factory is provided the default implementation
ezcReflectionTypeFactoryImpl is chosen which performs proper data type
mapping for type names provided as strings.
class ezcReflection {
public static ezcReflectionDocParser getDocParserInstance()
public static setDocParser(ezcReflectionDocParser $docParser)
public void setReflectionTypeFactory(ezcReflectionTypeFactory $factory)
public static ezcReflectionType getTypeByName(string $typeName)
}
ezcReflectionTypeMapper
ezcReflectionTypeMapper is a helper class used by the default type factory,
the primitive type class and some of the annotation classes. It provides
mappings from various type names which may occur in documentation to
standardized type names or XML Schema data types.
ezcReflectionType
The type interface acts as a central interface for the type system. It is
equipped with several methods to reflect characteristics of a data type. For
convenience and usability also methods for an XML Schema mapping are
incorporated at this point.
interface ezcReflectionType {
function ezcReflectionType getArrayType();
function ezcReflectionType getMapIndexType();
function ezcReflectionType getMapValueType();
function boolean isArray();
function boolean isClass();
function boolean isPrimitive();
function boolean isMap();
function string toString();
function boolean isStandardType();
function string getXmlName();
function DOMElement getXmlSchema(DOMDocument $dom);
}
ezcReflectionAbstractType
The abstract type is one implementation of the type interface and serves as
an abstract base class for ezcReflectionPrimitiveType and
ezcReflectionArrayType.
ezcReflectionPrimitiveType
The primitive type is a specialization of ezcReflectionAbstractType and
represents the primitive types boolean, integer, float, string and resource.
ezcReflectionArrayType
The array type is the second class to extend ezcReflectionAbstractType and
it distinguishes between simple arrays and maps.
ezcReflectionClassType
This implementation of the type interface represents a class as a type. For
this purpose it is a specialization of ezcReflectionClass to inherit all its
capabilities, i.e. unlike ezcReflectionPrimitiveType and
ezcReflectionArrayType the ezcReflectionClassType is tightly integrated with
the Reflection API.
class ezcReflectionClassType extends ezcReflectionClass implements ezcReflectionType {
public ezcReflectionType getArrayType()
public ezcReflectionType getMapIndexType()
public ezcReflectionType getMapValueType()
public boolean isArray()
public boolean isClass()
public boolean isPrimitive()
public boolean isMap()
public string toString()
public boolean isStandardType()
public string getXmlName(boolean $usePrefix)
public DOMElement getXmlSchema(DOMDocument dom, namespaceXSD)
public void __construct(string $name)
}
ezcReflectionDocParser
Is an generic documentation parser interface to be able to parse what ever
documentation style is used.
ezcReflectionPhpDocParser
This class parses PHPDoc comments and provides retrieved data in the form
of annotation objects.
ezcReflectionAnnotationFactory
This factory creates an ezcReflectionAnnotation object for a given
annotation.
ezcReflectionAnnotation
This is a generic class to represent an annotation and it also serves as a
base class for several specialized annotation classes, e.g.
ezcReflectionAnnotationParam, ezcReflectionAnnotationReturn and
ezcReflectionAnnotationVar.
ezcReflectionAnnotationWebService
This annotation declares a class as to be published as a SOAP or ReST Web Service
ezcReflectionAnnotationWebMethod
This annotation declares a method as to be published as a WSDL Operation of a SOAP Web Service
ezcReflectionAnnotationRestMethod
This annotation declares a method as to be published as a ReSTful Web Service;
The first parameter specifies the HTTP verb and the second one is a regular
expression for retrieving the method's arguments from a request URI.
ezcReflectionAnnotationRestIn
This annotation specifies the deserializer class for a ReSTful Web Service.
ezcReflectionAnnotationRestOut
This annotation specifies serializer class for a ReSTful Web Service.
Guidelines
----------
Algorithms
----------
Data structures
---------------
Diagrams
========
class_diagram.png - Class diagram of the Reflection component and its type system
php-reflection-api.png - Class diagram of the PHP5 Reflection API