blob: 7114b4987f89aaab3c3b6cab1e12ea1200a586a5 [file] [log] [blame]
<?php
/**
* File containing the ezcReflectionObject class.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Reflection
* @version //autogen//
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Extends the ReflectionObject class to provide type information
* using PHPDoc annotations.
*
* @package Reflection
* @version //autogen//
* @author Stefan Marr <mail@stefan-marr.de>
* @author Falko Menge <mail@falko-menge.de>
*/
class ezcReflectionObject extends ReflectionObject
{
/**
* @var ezcReflectionDocCommentParser Parser for source code annotations
*/
protected $docParser;
/**
* @var object|ReflectionObject
* Instance or ReflectionObject of the object to be reflected
*/
protected $reflectionSource;
/**
* Constructs a new ezcReflectionObject.
*
* @param object|ReflectionObject $argument
* Instance or ReflectionObject of the object to be reflected
*/
public function __construct( $argument )
{
if ( !$argument instanceof parent )
{
parent::__construct( $argument );
}
$this->reflectionSource = $argument;
// TODO: Parse comment on demand to save CPU time and memory
$this->docParser = ezcReflection::getDocCommentParser();
$this->docParser->parse( $this->getDocComment() );
}
/**
* Use overloading to call additional methods
* of the ReflectionObject instance given to the constructor.
*
* @param string $method Method to be called
* @param array $arguments Arguments that were passed
* @return mixed
*/
public function __call( $method, $arguments )
{
$callback = array( $this->reflectionSource, $method );
if ( $this->reflectionSource instanceof parent
and is_callable( $callback ) )
{
// query external reflection object
return call_user_func_array( $callback, $arguments );
}
else
{
throw new ezcReflectionCallToUndefinedMethodException( __CLASS__, $method );
}
}
/**
* Forwards a method invocation to either the reflection source passed to
* the constructor of this class when creating an instance or to the parent
* class.
*
* This method is part of the dependency injection mechanism and serves as
* a helper for implementing wrapper methods without code duplication.
* @param string $method Name of the method to be invoked
* @param mixed[] $arguments Arguments to be passed to the method
* @return mixed Return value of the invoked method
*/
protected function forwardCallToReflectionSource( $method, $arguments = array() ) {
if ( $this->reflectionSource instanceof parent ) {
return call_user_func_array( array( $this->reflectionSource, $method ), $arguments );
} else {
//*
return call_user_func_array( array( $this, 'parent::' . $method ), $arguments );
/*/
$argumentStrings = array();
foreach ( array_keys( $arguments ) as $key ) {
$argumentStrings[] = '$arguments[' . var_export( $key, true ) . ']';
}
$cmd = 'return parent::$method( ' . implode( ', ', $argumentStrings ) . ' );';
return eval( $cmd );
//*/
}
}
/**
* Returns an ezcReflectionMethod object of the method specified by $name.
*
* @param string $name Name of the method
* @return ezcReflectionMethod
* @throws ReflectionException if method doesn't exist
*/
public function getMethod( $name ) {
$method = $this->forwardCallToReflectionSource( __FUNCTION__, array( $name ) );
if ( $this->reflectionSource instanceof parent ) {
return new ezcReflectionMethod( $this, $method );
} else {
return new ezcReflectionMethod( $this, $method->name );
}
}
/**
* Returns an ezcReflectionMethod object of the constructor method.
*
* @return ezcReflectionMethod
*/
public function getConstructor() {
$constructor = $this->forwardCallToReflectionSource( __FUNCTION__ );
if ($constructor != null) {
if ( $this->reflectionSource instanceof parent ) {
return new ezcReflectionMethod( $this, $constructor );
} else {
return new ezcReflectionMethod( $this, $constructor->name );
}
} else {
return null;
}
}
/**
* Returns the methods as an array of ezcReflectionMethod objects.
*
* @param integer $filter
* A combination of
* ReflectionMethod::IS_STATIC,
* ReflectionMethod::IS_PUBLIC,
* ReflectionMethod::IS_PROTECTED,
* ReflectionMethod::IS_PRIVATE,
* ReflectionMethod::IS_ABSTRACT and
* ReflectionMethod::IS_FINAL
* @return ezcReflectionMethod[]
*/
public function getMethods( $filter = -1 ) {
$methods = $this->forwardCallToReflectionSource( __FUNCTION__, array( $filter ) );
$extMethods = array();
foreach ( $methods as $method ) {
if ( $this->reflectionSource instanceof parent ) {
$extMethods[] = new ezcReflectionMethod( $this, $method );
} else {
$extMethods[] = new ezcReflectionMethod( $this, $method->name );
}
}
return $extMethods;
}
/**
* Returns an array of all interfaces implemented by the class.
*
* @return ezcReflectionClass[]
*/
public function getInterfaces() {
$ifaces = $this->forwardCallToReflectionSource( __FUNCTION__ );
$result = array();
foreach ($ifaces as $i) {
$result[] = new ezcReflectionClass( $i );
}
return $result;
}
/**
* Returns the class' parent class, or, if none exists, FALSE
*
* @return ezcReflectionClass|boolean
*/
public function getParentClass()
{
$parentClass = $this->forwardCallToReflectionSource( __FUNCTION__ );
if ( is_object( $parentClass ) ) {
return new ezcReflectionClass( $parentClass );
}
else {
return false;
}
}
/**
* Returns the class' property specified by its name
*
* @param string $name Name of the property
* @return ezcReflectionProperty
* @throws RelectionException if property doesn't exist
*/
public function getProperty($name) {
$prop = $this->forwardCallToReflectionSource( __FUNCTION__, array( $name ) );
return new ezcReflectionProperty($prop, $name);
}
/**
* Returns an array of this class' properties
*
* @param integer $filter
* A combination of
* ReflectionProperty::IS_STATIC,
* ReflectionProperty::IS_PUBLIC,
* ReflectionProperty::IS_PROTECTED and
* ReflectionProperty::IS_PRIVATE
* @return ezcReflectionProperty[] Properties of the class
*/
public function getProperties($filter = -1) {
$props = $this->forwardCallToReflectionSource( __FUNCTION__, array( $filter ) );
$extProps = array();
foreach ($props as $prop) {
$extProps[] = new ezcReflectionProperty( $prop );
}
return $extProps;
}
/**
* Returns the short description of the class from the source code
* documentation
*
* @return string short description of the class
* @since PHP 5.1.0
*/
public function getShortDescription() {
return $this->docParser->getShortDescription();
}
/**
* Returns the long description of the class from the source code
* documentation
*
* @return string Long description of the class
* @since PHP 5.1.0
*/
public function getLongDescription() {
return $this->docParser->getLongDescription();
}
/**
* Checks whether the class is annotated with the annotation $annotation
*
* @param string $annotation Name of the annotation
* @return boolean
* @since PHP 5.1.0
*/
public function hasAnnotation($annotation) {
return $this->docParser->hasAnnotation($annotation);
}
/**
* Returns an array of annotations (optinally only annotations of a given name)
*
* @param string $name Name of the annotations
* @return ezcReflectionAnnotation[] Annotations
* @since PHP 5.1.0
*/
public function getAnnotations( $name = '' ) {
if ( $name == '' ) {
return $this->docParser->getAnnotations();
}
else {
return $this->docParser->getAnnotationsByName($name);
}
}
/**
* Returns NULL or the extension the class belongs to
*
* @return ezcReflectionExtension
*/
public function getExtension() {
$ext = $this->forwardCallToReflectionSource( __FUNCTION__ );
if ($ext) {
return new ezcReflectionExtension($ext);
} else {
return null;
}
}
// only pure wrapper methods follow bellow this line
/**
* Returns FALSE or the name of the extension the class belongs to
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string|boolean Extension name or FALSE
*/
public function getExtensionName() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the name of the class.
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string Class name
*/
public function getName() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the doc comment for the class.
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string Doc comment
* @since PHP 5.1.0
*/
public function getDocComment() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the class' constant specified by its name
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string $name Name of the constant
* @return mixed
*/
public function getConstant( $name ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $name ) );
}
/**
* Returns an associative array containing this class' constants and their
* values.
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return array<string, mixed> Constants and their values
*/
public function getConstants() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns an associative array containing copies of all default property
* values of the class.
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return array<string, mixed> Copies of all default property values
*/
public function getDefaultProperties() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the line this class' declaration ends at
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return integer Line this class' declaration ends at
*/
public function getEndLine() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the filename of the file this class was declared in
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string The filename of the file this class was declared in
*/
public function getFileName() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns an array of names of interfaces this class implements
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string[] Array of names of interfaces this class implements
*/
public function getInterfaceNames() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns a bitfield of the access modifiers for this class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return integer Bitfield of the access modifiers for this method
*/
public function getModifiers() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the line this class' declaration starts at
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return integer The line this class' declaration starts at
*/
public function getStartLine() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns an associative array containing all static property values of
* the class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return array<string,mixed>
* An associative array containing all static property values of
* the class
*/
public function getStaticProperties() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the value of a static property
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string $name Name of the static property
* @param mixed $default Default value
* @return mixed Value of a static property
* @since PHP 5.1.0
*/
public function getStaticPropertyValue( $name, $default = null ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $name, $default ) );
}
/**
* Returns whether a constant exists or not
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string $name Name of the constant
* @return boolean Whether a constant exists or not
* @since PHP 5.1.0
*/
public function hasConstant( $name ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $name ) );
}
/**
* Returns whether a method exists or not
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string $name Name of the method
* @return boolean Whether a method exists or not
* @since PHP 5.1.0
*/
public function hasMethod( $name ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $name ) );
}
/**
* Returns whether a property exists or not
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string $name Name of the property
* @return boolean Whether a property exists or not
* @since PHP 5.1.0
*/
public function hasProperty( $name ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $name ) );
}
/**
* Returns whether this class is a subclass of another class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string|ReflectionClass $class
* Name or ReflectionClass object of the super class
* @return boolean Whether this class is a subclass of the given super lass
*/
public function isSubclassOf( $class ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $class ) );
}
/**
* Returns whether this class implements a given interface
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string|ReflectionClass $interface
* Name or ReflectionClass object of the interface
* @return boolean Whether the given interface is implemented or not
*/
public function implementsInterface( $interface ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $interface ) );
}
/**
* Returns whether this class is abstract
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is abstract
*/
public function isAbstract() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is final
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is final
*/
public function isFinal() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is instantiable
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is instantiable
*/
public function isInstantiable() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is an interface
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is an interface
*/
public function isInterface() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is an internal class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is an internal class
*/
public function isInternal() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is iterateable (can be used inside foreach)
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean
* Whether this class is iterateable (can be used inside foreach)
*/
public function isIterateable() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is user-defined
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is user-defined
*/
public function isUserDefined() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether the given object is an instance of this class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param object $object An object to be checked
* @return boolean Whether the given object is an instance of this class
*/
public function isInstance( $object ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $object ) );
}
/**
* Returns an instance of this class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param mixed $argument,... Arguments
* @return object An instance of this class
*/
public function newInstance( $arguments ) {
/**
* Note from PHP Manual: func_get_args() returns a copy of the passed
* arguments only, and does not account for default (non-passed)
* arguments.
*/
$arguments = func_get_args();
return $this->forwardCallToReflectionSource( __FUNCTION__, $arguments );
}
/**
* Returns an instance of this class
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param array<integer,mixed> $arguments Arguments
* @return object An instance of this class
* @since PHP 5.1.3
*/
public function newInstanceArgs( array $arguments = null ) {
return $this->forwardCallToReflectionSource( __FUNCTION__, array( $arguments ) );
}
/**
* Sets the value of a static property
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @param string $name Name of the static property
* @param mixed $default Value
* @return void
* @since PHP 5.1.0
*/
public function setStaticPropertyValue( $name, $value ) {
$this->forwardCallToReflectionSource( __FUNCTION__, array( $name, $value ) );
}
/**
* Returns the name of namespace where this class is defined
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string The name of namespace where this class is defined
* @since PHP 5.3.0
*/
public function getNamespaceName() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns whether this class is defined in a namespace
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return boolean Whether this class is defined in a namespace
* @since PHP 5.3.0
*/
public function inNamespace() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns the short name of the class (without namespace part)
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string
* Returns the short name of the class (without namespace part)
* @since PHP 5.3.0
*/
public function getShortName() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Returns a string representation
*
* This is purely a wrapper method, which either calls the corresponding
* method of the parent class or forwards the call to the ReflectionClass
* instance passed to the constructor.
* @return string A string representation
*/
public function __toString() {
return $this->forwardCallToReflectionSource( __FUNCTION__ );
}
/**
* Exports a ReflectionObject instance.
*
* Returns the output if TRUE is specified for $return, printing it otherwise.
* This is purely a wrapper method, which calls the corresponding method of
* the parent class (ReflectionObject::export()).
* @param ReflectionObject $object ReflectionClass instance of the object
* @param boolean $return
* Whether to return (TRUE) or print (FALSE) the output
* @return mixed
*/
public static function export($object, $return = false) {
return parent::export($object, $return);
}
}
?>