name = $method->getName(); $this->filename = $method->getFileName(); $this->startline = $method->getStartLine(); $this->endline = $method->getEndLine(); $this->internal = $method->isInternal(); $this->docstring = $method->getDocComment() ?: null; $this->return_reference = $method->returnsReference(); foreach ($method->getParameters() as $param) { $this->parameters[] = new ParameterValue($param); } $this->returntype = $method->getReturnType(); if ($this->returntype) { $this->returntype = Utils::getTypeString($this->returntype); } if ($method instanceof ReflectionMethod) { $this->static = $method->isStatic(); $this->operator = $this->static ? Value::OPERATOR_STATIC : Value::OPERATOR_OBJECT; $this->abstract = $method->isAbstract(); $this->final = $method->isFinal(); $this->owner_class = $method->getDeclaringClass()->name; $this->access = Value::ACCESS_PUBLIC; if ($method->isProtected()) { $this->access = Value::ACCESS_PROTECTED; } elseif ($method->isPrivate()) { $this->access = Value::ACCESS_PRIVATE; } } if ($this->internal) { return; } $docstring = new MethodDefinitionRepresentation( $this->filename, $this->startline, $this->owner_class, $this->docstring ); $docstring->implicit_label = true; $this->addRepresentation($docstring); $this->value = $docstring; } public function setAccessPathFrom(InstanceValue $parent): void { static $magic = [ '__call' => true, '__callstatic' => true, '__clone' => true, '__construct' => true, '__debuginfo' => true, '__destruct' => true, '__get' => true, '__invoke' => true, '__isset' => true, '__set' => true, '__set_state' => true, '__sleep' => true, '__tostring' => true, '__unset' => true, '__wakeup' => true, ]; $name = \strtolower($this->name); if ('__construct' === $name) { $this->access_path = 'new \\'.$parent->getType(); } elseif ('__invoke' === $name) { $this->access_path = $parent->access_path; } elseif ('__clone' === $name) { $this->access_path = 'clone '.$parent->access_path; $this->showparams = false; } elseif ('__tostring' === $name) { $this->access_path = '(string) '.$parent->access_path; $this->showparams = false; } elseif (isset($magic[$name])) { $this->access_path = null; } elseif ($this->static) { $this->access_path = '\\'.$this->owner_class.'::'.$this->name; } else { $this->access_path = $parent->access_path.'->'.$this->name; } } public function getValueShort(): ?string { if (!$this->value || !($this->value instanceof MethodDefinitionRepresentation)) { return parent::getValueShort(); } $ds = $this->value->getDocstringWithoutComments(); if (!$ds) { return null; } $ds = \explode("\n", $ds); $out = ''; foreach ($ds as $line) { if (0 === \strlen(\trim($line)) || '@' === $line[0]) { break; } $out .= $line.' '; } if (\strlen($out)) { return \rtrim($out); } return null; } public function getModifiers(): ?string { $mods = [ $this->abstract ? 'abstract' : null, $this->final ? 'final' : null, $this->getAccess(), $this->static ? 'static' : null, ]; $out = ''; foreach ($mods as $word) { if (null !== $word) { $out .= $word.' '; } } if (\strlen($out)) { return \rtrim($out); } return null; } public function getAccessPath(): ?string { if (null !== $this->access_path && $this->showparams) { return parent::getAccessPath().'('.$this->getParams().')'; } return parent::getAccessPath(); } public function getPhpDocUrl(): ?string { if (!$this->internal) { return null; } if ($this->owner_class) { $class = \strtolower($this->owner_class); } else { $class = 'function'; } $funcname = \str_replace('_', '-', \strtolower($this->name)); if (0 === \strpos($funcname, '--') && 0 !== \strpos($funcname, '-', 2)) { $funcname = \substr($funcname, 2); } return 'https://secure.php.net/'.$class.'.'.$funcname; } }