This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * This file is part of Railt package. |
||
4 | * |
||
5 | * For the full copyright and license information, please view the LICENSE |
||
6 | * file that was distributed with this source code. |
||
7 | */ |
||
8 | declare(strict_types=1); |
||
9 | |||
10 | namespace Railt\Lexer\Driver; |
||
11 | |||
12 | use Railt\Io\Readable; |
||
13 | use Railt\Lexer\Driver\NativeStateful\PCRECompiler; |
||
14 | use Railt\Lexer\Iterator\RegexNamedGroupsIterator; |
||
15 | use Railt\Lexer\Result\Eoi; |
||
16 | use Railt\Lexer\Result\Token; |
||
17 | use Railt\Lexer\Result\Unknown; |
||
18 | use Railt\Lexer\TokenInterface; |
||
19 | |||
20 | /** |
||
21 | * Class NativeRegex |
||
22 | */ |
||
23 | class NativeRegex extends SimpleLexer |
||
24 | { |
||
25 | /** |
||
26 | * NativeRegex constructor. |
||
27 | * @param array $tokens |
||
28 | * @param array $skip |
||
29 | */ |
||
30 | 3 | public function __construct(array $tokens = [], array $skip = []) |
|
31 | { |
||
32 | 3 | $this->tokens = $tokens; |
|
33 | 3 | $this->skipped = $skip; |
|
34 | 3 | } |
|
35 | |||
36 | /** |
||
37 | * @param Readable $file |
||
38 | * @return \Traversable |
||
39 | * @throws \InvalidArgumentException |
||
40 | * @throws \RuntimeException |
||
41 | */ |
||
42 | 6 | protected function exec(Readable $file): \Traversable |
|
43 | { |
||
44 | 6 | $offset = 0; |
|
45 | 6 | $regex = new RegexNamedGroupsIterator($this->getPattern(), $file->getContents()); |
|
46 | |||
47 | 6 | $iterator = $regex->getIterator(); |
|
48 | |||
49 | 6 | while ($iterator->valid()) { |
|
50 | /** @var TokenInterface $token */ |
||
51 | 6 | $token = $iterator->key() === Unknown::T_NAME |
|
52 | 1 | ? $this->unknown($iterator, $offset) |
|
53 | 6 | : $this->token($iterator, $offset); |
|
54 | |||
55 | 6 | $offset += $token->getBytes(); |
|
56 | |||
57 | 6 | yield $token; |
|
58 | } |
||
59 | |||
60 | 6 | yield new Eoi($offset); |
|
61 | 6 | } |
|
62 | |||
63 | /** |
||
64 | * @return string |
||
65 | */ |
||
66 | 6 | private function getPattern(): string |
|
67 | { |
||
68 | 6 | return (new PCRECompiler($this->tokens))->compile(); |
|
69 | } |
||
70 | |||
71 | /** |
||
72 | * @param \Traversable|\Generator $iterator |
||
73 | * @param int $offset |
||
74 | * @return Unknown |
||
75 | */ |
||
76 | 1 | private function unknown(\Traversable $iterator, int $offset): TokenInterface |
|
77 | { |
||
78 | 1 | $body = $iterator->current()[0]; |
|
0 ignored issues
–
show
|
|||
79 | 1 | $iterator->next(); |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method next() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
80 | |||
81 | 1 | $body .= $this->reduce($iterator, Unknown::T_NAME); |
|
82 | |||
83 | 1 | return new Unknown($body, $offset); |
|
84 | } |
||
85 | |||
86 | /** |
||
87 | * @param \Traversable|\Iterator $iterator |
||
88 | * @param string $key |
||
89 | * @return string |
||
90 | */ |
||
91 | 1 | protected function reduce(\Traversable $iterator, string $key): string |
|
92 | { |
||
93 | 1 | $body = ''; |
|
94 | |||
95 | 1 | while ($iterator->valid()) { |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method valid() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
96 | 1 | if ($iterator->key() !== $key) { |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method key() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
97 | 1 | break; |
|
98 | } |
||
99 | |||
100 | 1 | $body .= $iterator->current()[0]; |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method current() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
101 | |||
102 | 1 | $iterator->next(); |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method next() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
103 | } |
||
104 | |||
105 | 1 | return $body; |
|
106 | } |
||
107 | |||
108 | /** |
||
109 | * @param \Traversable|\Iterator $iterator |
||
110 | * @param int $offset |
||
111 | * @return Token |
||
112 | */ |
||
113 | 6 | private function token(\Traversable $iterator, int $offset): TokenInterface |
|
114 | { |
||
115 | 6 | [$name, $context] = [$iterator->key(), $iterator->current()]; |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method key() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() It seems like you code against a concrete implementation and not the interface
Traversable as the method current() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
116 | |||
117 | 6 | $iterator->next(); |
|
0 ignored issues
–
show
It seems like you code against a concrete implementation and not the interface
Traversable as the method next() does only exist in the following implementations of said interface: APCUIterator , AppendIterator , ArrayIterator , CachingIterator , CallbackFilterIterator , DirectoryIterator , EmptyIterator , File_Iterator , FilesystemIterator , FilterIterator , Generator , GlobIterator , HttpMessage , HttpRequestPool , Imagick , ImagickPixelIterator , InfiniteIterator , Issue523 , IteratorIterator , LimitIterator , MongoCommandCursor , MongoCursor , MongoGridFSCursor , MultipleIterator , NoRewindIterator , PHPUnit\Framework\TestSuiteIterator , PHPUnit\Runner\Filter\ExcludeGroupFilterIterator , PHPUnit\Runner\Filter\GroupFilterIterator , PHPUnit\Runner\Filter\IncludeGroupFilterIterator , PHPUnit\Runner\Filter\NameFilterIterator , PHP_Token_Stream , ParentIterator , Phar , PharData , PharIo\Manifest\AuthorCollectionIterator , PharIo\Manifest\AuthorElementCollection , PharIo\Manifest\BundledComponentCollectionIterator , PharIo\Manifest\ComponentElementCollection , PharIo\Manifest\ElementCollection , PharIo\Manifest\ExtElementCollection , PharIo\Manifest\RequirementCollectionIterator , RecursiveArrayIterator , RecursiveCachingIterator , RecursiveCallbackFilterIterator , RecursiveDirectoryIterator , RecursiveFilterIterator , RecursiveIteratorIterator , RecursiveRegexIterator , RecursiveTreeIterator , RegexIterator , SQLiteResult , SebastianBergmann\CodeCoverage\Node\Iterator , SimpleXMLIterator , SplDoublyLinkedList , SplFileObject , SplFixedArray , SplHeap , SplMaxHeap , SplMinHeap , SplObjectStorage , SplPriorityQueue , SplQueue , SplStack , SplTempFileObject , TestIterator , TestIterator2 , TheSeer\Tokenizer\TokenCollection .
Let’s take a look at an example: interface User
{
/** @return string */
public function getPassword();
}
class MyUser implements User
{
public function getPassword()
{
// return something
}
public function getDisplayName()
{
// return some name.
}
}
class AuthSystem
{
public function authenticate(User $user)
{
$this->logger->info(sprintf('Authenticating %s.', $user->getDisplayName()));
// do something.
}
}
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break. Available Fixes
Note: PHP Analyzer uses reverse abstract interpretation to narrow down the types
inside the if block in such a case.
![]() |
|||
118 | |||
119 | 6 | return new Token($name, $context, $offset); |
|
120 | } |
||
121 | } |
||
122 |
Let’s take a look at an example:
In the above example, the authenticate() method works fine as long as you just pass instances of MyUser. However, if you now also want to pass a different implementation of User which does not have a getDisplayName() method, the code will break.
Available Fixes
Change the type-hint for the parameter:
Add an additional type-check:
Add the method to the interface: