Skip to content

Commit 42884e1

Browse files
committed
checks reserved class names
1 parent e0741f4 commit 42884e1

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

src/PhpGenerator/ClassType.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ public function getNamespace(): ?PhpNamespace
151151
/** @return static */
152152
public function setName(?string $name): self
153153
{
154-
if ($name !== null && !Helpers::isIdentifier($name)) {
154+
if ($name !== null && (!Helpers::isIdentifier($name) || isset(Helpers::KEYWORDS[strtolower($name)]))) {
155155
throw new Nette\InvalidArgumentException("Value '$name' is not valid class name.");
156156
}
157157
$this->name = $name;

src/PhpGenerator/Helpers.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,22 @@ final class Helpers
2929

3030
// class keywords
3131
'self' => 1, 'parent' => 1, 'static' => 1,
32+
33+
// PHP keywords
34+
'include' => 1, 'include_once' => 1, 'eval' => 1, 'require' => 1, 'require_once' => 1, 'or' => 1, 'xor' => 1,
35+
'and' => 1, 'instanceof' => 1, 'new' => 1, 'clone' => 1, 'exit' => 1, 'if' => 1, 'elseif' => 1, 'else' => 1,
36+
'endif' => 1, 'echo' => 1, 'do' => 1, 'while' => 1, 'endwhile' => 1, 'for' => 1, 'endfor' => 1, 'foreach' => 1,
37+
'endforeach' => 1, 'declare' => 1, 'enddeclare' => 1, 'as' => 1, 'try' => 1, 'catch' => 1, 'finally' => 1,
38+
'throw' => 1, 'use' => 1, 'insteadof' => 1, 'global' => 1, 'var' => 1, 'unset' => 1, 'isset' => 1, 'empty' => 1,
39+
'continue' => 1, 'goto' => 1, 'function' => 1, 'const' => 1, 'return' => 1, 'print' => 1, 'yield' => 1, 'list' => 1,
40+
'switch' => 1, 'endswitch' => 1, 'case' => 1, 'default' => 1, 'break' => 1, 'array' => 1, 'callable' => 1,
41+
'extends' => 1, 'implements' => 1, 'namespace' => 1, 'trait' => 1, 'interface' => 1, 'class' => 1, '__CLASS__' => 1,
42+
'__TRAIT__' => 1, '__FUNCTION__' => 1, '__METHOD__' => 1, '__LINE__' => 1, '__FILE__' => 1, '__DIR__' => 1,
43+
'__NAMESPACE__' => 1, 'fn' => 1, 'match' => 1, 'enum' => 1, 'static' => 1, 'abstract' => 1, 'final' => 1,
44+
'private' => 1, 'protected' => 1, 'public' => 1, 'readonly' => 1,
45+
46+
// additional reserved class names
47+
'true' => 1,
3248
];
3349

3450

tests/PhpGenerator/invalidNames.phpt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ Assert::exception(function () {
6262
new Nette\PhpGenerator\ClassType('\abc');
6363
}, Nette\InvalidArgumentException::class);
6464

65+
Assert::exception(function () {
66+
new Nette\PhpGenerator\ClassType('enum');
67+
}, Nette\InvalidArgumentException::class);
68+
69+
Assert::exception(function () {
70+
new Nette\PhpGenerator\ClassType('bool');
71+
}, Nette\InvalidArgumentException::class);
72+
6573

6674
$class = new Nette\PhpGenerator\ClassType('Abc');
6775
Assert::exception(function () use ($class) {

0 commit comments

Comments
 (0)