<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/
namespace Zend\Code\Scanner;
use Zend\Code\Exception;
class DerivedClassScanner extends ClassScanner
{
/**
* @var DirectoryScanner
*/
protected $directoryScanner = null;
/**
* @var ClassScanner
*/
protected $classScanner = null;
/**
* @var array
*/
protected $parentClassScanners = array();
/**
* @var array
*/
protected $interfaceClassScanners = array();
/**
* @param ClassScanner $classScanner
* @param DirectoryScanner $directoryScanner
*/
public function __construct(ClassScanner $classScanner, DirectoryScanner $directoryScanner)
{
$this->classScanner = $classScanner;
$this->directoryScanner = $directoryScanner;
$currentScannerClass = $classScanner;
while ($currentScannerClass && $currentScannerClass->hasParentClass()) {
$currentParentClassName = $currentScannerClass->getParentClass();
if ($directoryScanner->hasClass($currentParentClassName)) {
$currentParentClass = $directoryScanner->getClass($currentParentClassName);
$this->parentClassScanners[$currentParentClassName] = $currentParentClass;
$currentScannerClass = $currentParentClass;
} else {
$currentScannerClass = false;
}
}
foreach ($interfaces = $this->classScanner->getInterfaces() as $iName) {
if ($directoryScanner->hasClass($iName)) {
$this->interfaceClassScanners[$iName] = $directoryScanner->getClass($iName);
}
}
}
/**
* @return null|string
*/
public function getName()
{
return $this->classScanner->getName();
}
/**
* @return null|string
*/
public function getShortName()
{
return $this->classScanner->getShortName();
}
/**
* @return bool
*/
public function isInstantiable()
{
return $this->classScanner->isInstantiable();
}
/**
* @return bool
*/
public function isFinal()
{
return $this->classScanner->isFinal();
}
/**
* @return bool
*/
public function isAbstract()
{
return $this->classScanner->isAbstract();
}
/**
* @return bool
*/
public function isInterface()
{
return $this->classScanner->isInterface();
}
/**
* @return array
*/
public function getParentClasses()
{
return array_keys($this->parentClassScanners);
}
/**
* @return bool
*/
public function hasParentClass()
{
return ($this->classScanner->getParentClass() != null);
}
/**
* @return null|string
*/
public function getParentClass()
{
return $this->classScanner->getParentClass();
}
/**
* @param bool $returnClassScanners
* @return array
*/
public function getInterfaces($returnClassScanners = false)
{
if ($returnClassScanners) {
return $this->interfaceClassScanners;
}
$interfaces = $this->classScanner->getInterfaces();
foreach ($this->parentClassScanners as $pClassScanner) {
$interfaces = array_merge($interfaces, $pClassScanner->getInterfaces());
}
return $interfaces;
}
/**
* Return a list of constant names
*
* @return array
*/
public function getConstantNames()
{
$constants = $this->classScanner->getConstantNames();
foreach ($this->parentClassScanners as $pClassScanner) {
$constants = array_merge($constants, $pClassScanner->getConstantNames());
}
return $constants;
}
/**
* Return a list of constants
*
* @param bool $namesOnly Set false to return instances of ConstantScanner
* @return array|ConstantScanner[]
*/
public function getConstants($namesOnly = true)
{
if (true === $namesOnly) {
trigger_error('Use method getConstantNames() instead', E_USER_DEPRECATED);
return $this->getConstantNames();
}
$constants = $this->classScanner->getConstants();
foreach ($this->parentClassScanners as $pClassScanner) {
$constants = array_merge($constants, $pClassScanner->getConstants($namesOnly));
}
return $constants;
}
/**
* Return a single constant by given name or index of info
*
* @param string|int $constantNameOrInfoIndex
* @throws Exception\InvalidArgumentException
* @return bool|ConstantScanner
*/
public function getConstant($constantNameOrInfoIndex)
{
if ($this->classScanner->hasConstant($constantNameOrInfoIndex)) {
return $this->classScanner->getConstant($constantNameOrInfoIndex);
}
foreach ($this->parentClassScanners as $pClassScanner) {
if ($pClassScanner->hasConstant($constantNameOrInfoIndex)) {
return $pClassScanner->getConstant($constantNameOrInfoIndex);
}
}
throw new Exception\InvalidArgumentException(sprintf(
'Constant %s not found in %s',
$constantNameOrInfoIndex,
$this->classScanner->getName()
));
}
/**
* Verify if class or parent class has constant
*
* @param string $name
* @return bool
*/
public function hasConstant($name)
{
if ($this->classScanner->hasConstant($name)) {
return true;
}
foreach ($this->parentClassScanners as $pClassScanner) {
if ($pClassScanner->hasConstant($name)) {
return true;
}
}
return false;
}
/**
* Return a list of property names
*
* @return array
*/
public function getPropertyNames()
{
$properties = $this->classScanner->getPropertyNames();
foreach ($this->parentClassScanners as $pClassScanner) {
$properties = array_merge($properties, $pClassScanner->getPropertyNames());
}
return $properties;
}
/**
* @param bool $returnScannerProperty
* @return array
*/
public function getProperties($returnScannerProperty = false)
{
$properties = $this->classScanner->getProperties($returnScannerProperty);
foreach ($this->parentClassScanners as $pClassScanner) {
$properties = array_merge($properties, $pClassScanner->getProperties($returnScannerProperty));
}
return $properties;
}
/**
* Return a single property by given name or index of info
*
* @param string|int $propertyNameOrInfoIndex
* @throws Exception\InvalidArgumentException
* @return bool|PropertyScanner
*/
public function getProperty($propertyNameOrInfoIndex)
{
if ($this->classScanner->hasProperty($propertyNameOrInfoIndex)) {
return $this->classScanner->getProperty($propertyNameOrInfoIndex);
}
foreach ($this->parentClassScanners as $pClassScanner) {
if ($pClassScanner->hasProperty($propertyNameOrInfoIndex)) {
return $pClassScanner->getProperty($propertyNameOrInfoIndex);
}
}
throw new Exception\InvalidArgumentException(sprintf(
'Property %s not found in %s',
$propertyNameOrInfoIndex,
$this->classScanner->getName()
));
}
/**
* Verify if class or parent class has property
*
* @param string $name
* @return bool
*/
public function hasProperty($name)
{
if ($this->classScanner->hasProperty($name)) {
return true;
}
foreach ($this->parentClassScanners as $pClassScanner) {
if ($pClassScanner->hasProperty($name)) {
return true;
}
}
return false;
}
/**
* @return array
*/
public function getMethodNames()
{
$methods = $this->classScanner->getMethodNames();
foreach ($this->parentClassScanners as $pClassScanner) {
$methods = array_merge($methods, $pClassScanner->getMethodNames());
}
return $methods;
}
/**
* @return MethodScanner[]
*/
public function getMethods()
{
$methods = $this->classScanner->getMethods();
foreach ($this->parentClassScanners as $pClassScanner) {
$methods = array_merge($methods, $pClassScanner->getMethods());
}
return $methods;
}
/**
* @param int|string $methodNameOrInfoIndex
* @return MethodScanner
* @throws Exception\InvalidArgumentException
*/
public function getMethod($methodNameOrInfoIndex)
{
if ($this->classScanner->hasMethod($methodNameOrInfoIndex)) {
return $this->classScanner->getMethod($methodNameOrInfoIndex);
}
foreach ($this->parentClassScanners as $pClassScanner) {
if ($pClassScanner->hasMethod($methodNameOrInfoIndex)) {
return $pClassScanner->getMethod($methodNameOrInfoIndex);
}
}
throw new Exception\InvalidArgumentException(sprintf(
'Method %s not found in %s',
$methodNameOrInfoIndex,
$this->classScanner->getName()
));
}
/**
* Verify if class or parent class has method by given name
*
* @param string $name
* @return bool
*/
public function hasMethod($name)
{
if ($this->classScanner->hasMethod($name)) {
return true;
}
foreach ($this->parentClassScanners as $pClassScanner) {
if ($pClassScanner->hasMethod($name)) {
return true;
}
}
return false;
}
}
# |
Change |
User |
Description |
Committed |
|
#1
|
18334 |
Liz Lam |
initial add of jambox |
|
|