Page Menu
Home
WickedGov Phorge
Search
Configure Global Search
Log In
Files
F6032499
CalledClassPass.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
CalledClassPass.php
View Options
<?php
/*
* This file is part of Psy Shell.
*
* (c) 2012-2023 Justin Hileman
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace
Psy\CodeCleaner
;
use
PhpParser\Node
;
use
PhpParser\Node\Expr\ConstFetch
;
use
PhpParser\Node\Expr\FuncCall
;
use
PhpParser\Node\Name
;
use
PhpParser\Node\Stmt\Class_
;
use
PhpParser\Node\Stmt\Trait_
;
use
PhpParser\Node\VariadicPlaceholder
;
use
Psy\Exception\ErrorException
;
/**
* The called class pass throws warnings for get_class() and get_called_class()
* outside a class context.
*/
class
CalledClassPass
extends
CodeCleanerPass
{
private
bool
$inClass
=
false
;
/**
* @param array $nodes
*
* @return Node[]|null Array of nodes
*/
public
function
beforeTraverse
(
array
$nodes
)
{
$this
->
inClass
=
false
;
}
/**
* @throws ErrorException if get_class or get_called_class is called without an object from outside a class
*
* @param Node $node
*
* @return int|Node|null Replacement node (or special return value)
*/
public
function
enterNode
(
Node
$node
)
{
if
(
$node
instanceof
Class_
||
$node
instanceof
Trait_
)
{
$this
->
inClass
=
true
;
}
elseif
(
$node
instanceof
FuncCall
&&
!
$this
->
inClass
)
{
// We'll give any args at all (besides null) a pass.
// Technically we should be checking whether the args are objects, but this will do for now.
//
// @todo switch this to actually validate args when we get context-aware code cleaner passes.
if
(!
empty
(
$node
->
args
)
&&
!
$this
->
isNull
(
$node
->
args
[
0
]))
{
return
;
}
// We'll ignore name expressions as well (things like `$foo()`)
if
(!(
$node
->
name
instanceof
Name
))
{
return
;
}
$name
=
\strtolower
(
$node
->
name
);
if
(
\in_array
(
$name
,
[
'get_class'
,
'get_called_class'
]))
{
$msg
=
\sprintf
(
'%s() called without object from outside a class'
,
$name
);
throw
new
ErrorException
(
$msg
,
0
,
\E_USER_WARNING
,
null
,
$node
->
getStartLine
());
}
}
}
/**
* @param Node $node
*
* @return int|Node|Node[]|null Replacement node (or special return value)
*/
public
function
leaveNode
(
Node
$node
)
{
if
(
$node
instanceof
Class_
)
{
$this
->
inClass
=
false
;
}
}
private
function
isNull
(
Node
$node
):
bool
{
if
(
$node
instanceof
VariadicPlaceholder
)
{
return
false
;
}
return
$node
->
value
instanceof
ConstFetch
&&
\strtolower
(
$node
->
value
->
name
)
===
'null'
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Oct 4 2026, 18:21 (5 w, 4 d ago)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
b7/69/64c8b78fb198bbb9ce30fc7617eb
Default Alt Text
CalledClassPass.php (2 KB)
Attached To
Mode
rMWPROD MediaWiki Production
Attached
Detach File
Event Timeline
Log In to Comment