Search code examples
phpnamespacesphpstormkeywordpsr-4

PHP reserved keywords allowed in namespace? (public, private, default)


PhpStorm is highlighting the following namespace as an error.

<?php

namespace App\Http\Controllers\Public;

Error: Expected: identifier

In general. Are reserved keywords like public, function, class not acceptable for namespacing?


Solution

  • The PHP manual hints that as of PHP 7.0.0 these keywords are allowed as property, constant, and method names of classes, interfaces and traits, except that class may not be used as constant name, which also incorporate the requested keyword public.

    List of reserved keywords, which you can't use for namespacing:

    __halt_compiler, abstract, and, array, as, break, callable, case, catch, class, clone, const, continue, declare, default, die, do, echo, else, elseif, empty, enddeclare, endfor, endforeach, endif, endswitch, endwhile, eval, exit, extends, final, for, foreach, function, global, goto, if, implements, include, include_once, instanceof, insteadof, interface, isset, list, namespace, new, or, print, private, protected, public, require, require_once, return, static, switch, throw, trait, try, unset, use, var, while, xor

    A potential workaround to fix this issue is to add an extra character to the word or use the plural form of the word. Another opportunity would be to go one level up in the namespace and use the keyword as a prefix PublicFooController. (or even suffix, if you prefer that)

    My intention was to scope my web app into public (for guests and visitors) and private (for private needs) area.
    I went for namespace App\Http\Controllers\Frontend and namespace App\Http\Controllers\Backend instead of trying to incorperate the words public and private in to my namespacing, even if I personally think these generally fits better to my needs, because both have frontend and backend. But... Anyway, this keeps me off having trouble organizing my files and namespaces the way I would do, when I would use public and private.