Source of file FileReflection.php
Size: 7,160 Bytes - Last Modified: 2014-03-12T23:21:18+01:00
/home/theseer/Downloads/ZendFramework-2.3.0/library/Zend/Code/Reflection/FileReflection.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 | <?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\Reflection; use Zend\Code\Scanner\CachingFileScanner; class FileReflection implements ReflectionInterface { /** * @var string */ protected $filePath = null; /** * @var string */ protected $docComment = null; /** * @var int */ protected $startLine = 1; /** * @var int */ protected $endLine = null; /** * @var string */ protected $namespaces = array(); /** * @var array */ protected $uses = array(); /** * @var array */ protected $requiredFiles = array(); /** * @var ReflectionClass[] */ protected $classes = array(); /** * @var FunctionReflection[] */ protected $functions = array(); /** * @var string */ protected $contents = null; /** * @param string $filename * @param bool $includeIfNotAlreadyIncluded * @throws Exception\InvalidArgumentException If file does not exists * @throws Exception\RuntimeException If file exists but is not included or required */ public function __construct($filename, $includeIfNotAlreadyIncluded = false) { if (($fileRealPath = realpath($filename)) === false) { $fileRealPath = stream_resolve_include_path($filename); } if (!$fileRealPath) { throw new Exception\InvalidArgumentException(sprintf( 'No file for %s was found.', $filename )); } if (!in_array($fileRealPath, get_included_files())) { if (!$includeIfNotAlreadyIncluded) { throw new Exception\RuntimeException(sprintf( 'File %s must be required before it can be reflected', $filename )); } include $fileRealPath; } $this->filePath = $fileRealPath; $this->reflect(); } /** * Required by the Reflector interface. * * @todo What should this do? * @return null */ public static function export() { return null; } /** * Return the file name of the reflected file * * @return string */ public function getFileName() { // @todo get file name from path return $this->filePath; } /** * Get the start line - Always 1, staying consistent with the Reflection API * * @return int */ public function getStartLine() { return $this->startLine; } /** * Get the end line / number of lines * * @return int */ public function getEndLine() { return $this->endLine; } /** * @return string */ public function getDocComment() { return $this->docComment; } /** * @return DocBlockReflection */ public function getDocBlock() { if (!($docComment = $this->getDocComment())) { return false; } $instance = new DocBlockReflection($docComment); return $instance; } /** * @return array */ public function getNamespaces() { return $this->namespaces; } /** * @return string */ public function getNamespace() { if (count($this->namespaces) == 0) { return null; } return $this->namespaces[0]; } /** * @return array */ public function getUses() { return $this->uses; } /** * Return the reflection classes of the classes found inside this file * * @return ClassReflection[] */ public function getClasses() { $classes = array(); foreach ($this->classes as $class) { $classes[] = new ClassReflection($class); } return $classes; } /** * Return the reflection functions of the functions found inside this file * * @return FunctionReflection[] */ public function getFunctions() { $functions = array(); foreach ($this->functions as $function) { $functions[] = new FunctionReflection($function); } return $functions; } /** * Retrieve the reflection class of a given class found in this file * * @param null|string $name * @return ClassReflection * @throws Exception\InvalidArgumentException for invalid class name or invalid reflection class */ public function getClass($name = null) { if (null === $name) { reset($this->classes); $selected = current($this->classes); return new ClassReflection($selected); } if (in_array($name, $this->classes)) { return new ClassReflection($name); } throw new Exception\InvalidArgumentException(sprintf( 'Class by name %s not found.', $name )); } /** * Return the full contents of file * * @return string */ public function getContents() { return file_get_contents($this->filePath); } public function toString() { return ''; // @todo } /** * Serialize to string * * Required by the Reflector interface * * @todo What should this serialization look like? * @return string */ public function __toString() { return ''; } /** * This method does the work of "reflecting" the file * * Uses Zend\Code\Scanner\FileScanner to gather file information * * @return void */ protected function reflect() { $scanner = new CachingFileScanner($this->filePath); $this->docComment = $scanner->getDocComment(); $this->requiredFiles = $scanner->getIncludes(); $this->classes = $scanner->getClassNames(); $this->namespaces = $scanner->getNamespaces(); $this->uses = $scanner->getUses(); } /** * Validate / check a file level DocBlock * * @param array $tokens Array of tokenizer tokens * @return void */ protected function checkFileDocBlock($tokens) { foreach ($tokens as $token) { $type = $token[0]; $value = $token[1]; $lineNum = $token[2]; if (($type == T_OPEN_TAG) || ($type == T_WHITESPACE)) { continue; } elseif ($type == T_DOC_COMMENT) { $this->docComment = $value; $this->startLine = $lineNum + substr_count($value, "\n") + 1; return; } else { // Only whitespace is allowed before file DocBlocks return; } } } } |