function File::isReference
Determine if the passed token is a reference operator.
Returns true if the specified token position represents a reference. Returns false if the token represents a bitwise operator.
Parameters
int $stackPtr The position of the T_BITWISE_AND token.:
Return value
boolean
File
-
vendor/
squizlabs/ php_codesniffer/ src/ Files/ File.php, line 2096
Class
Namespace
PHP_CodeSniffer\FilesCode
public function isReference($stackPtr) {
if ($this->tokens[$stackPtr]['code'] !== T_BITWISE_AND) {
return false;
}
$tokenBefore = $this->findPrevious(Tokens::$emptyTokens, $stackPtr - 1, null, true);
if ($this->tokens[$tokenBefore]['code'] === T_FUNCTION || $this->tokens[$tokenBefore]['code'] === T_CLOSURE || $this->tokens[$tokenBefore]['code'] === T_FN) {
// Function returns a reference.
return true;
}
if ($this->tokens[$tokenBefore]['code'] === T_DOUBLE_ARROW) {
// Inside a foreach loop or array assignment, this is a reference.
return true;
}
if ($this->tokens[$tokenBefore]['code'] === T_AS) {
// Inside a foreach loop, this is a reference.
return true;
}
if (isset(Tokens::$assignmentTokens[$this->tokens[$tokenBefore]['code']]) === true) {
// This is directly after an assignment. It's a reference. Even if
// it is part of an operation, the other tests will handle it.
return true;
}
$tokenAfter = $this->findNext(Tokens::$emptyTokens, $stackPtr + 1, null, true);
if ($this->tokens[$tokenAfter]['code'] === T_NEW) {
return true;
}
if (isset($this->tokens[$stackPtr]['nested_parenthesis']) === true) {
$brackets = $this->tokens[$stackPtr]['nested_parenthesis'];
$lastBracket = array_pop($brackets);
if (isset($this->tokens[$lastBracket]['parenthesis_owner']) === true) {
$owner = $this->tokens[$this->tokens[$lastBracket]['parenthesis_owner']];
if ($owner['code'] === T_FUNCTION || $owner['code'] === T_CLOSURE || $owner['code'] === T_FN) {
$params = $this->getMethodParameters($this->tokens[$lastBracket]['parenthesis_owner']);
foreach ($params as $param) {
if ($param['reference_token'] === $stackPtr) {
// Function parameter declared to be passed by reference.
return true;
}
}
}
//end if
}
else {
$prev = false;
for ($t = $this->tokens[$lastBracket]['parenthesis_opener'] - 1; $t >= 0; $t--) {
if ($this->tokens[$t]['code'] !== T_WHITESPACE) {
$prev = $t;
break;
}
}
if ($prev !== false && $this->tokens[$prev]['code'] === T_USE) {
// Closure use by reference.
return true;
}
}
//end if
}
//end if
// Pass by reference in function calls and assign by reference in arrays.
if ($this->tokens[$tokenBefore]['code'] === T_OPEN_PARENTHESIS || $this->tokens[$tokenBefore]['code'] === T_COMMA || $this->tokens[$tokenBefore]['code'] === T_OPEN_SHORT_ARRAY) {
if ($this->tokens[$tokenAfter]['code'] === T_VARIABLE) {
return true;
}
else {
$skip = Tokens::$emptyTokens;
$skip[] = T_NS_SEPARATOR;
$skip[] = T_SELF;
$skip[] = T_PARENT;
$skip[] = T_STATIC;
$skip[] = T_STRING;
$skip[] = T_NAMESPACE;
$skip[] = T_DOUBLE_COLON;
$nextSignificantAfter = $this->findNext($skip, $stackPtr + 1, null, true);
if ($this->tokens[$nextSignificantAfter]['code'] === T_VARIABLE) {
return true;
}
}
//end if
}
//end if
return false;
}