Можно ли использовать новый в качестве имени метода в PHP 5.3? - PullRequest
2 голосов
/ 27 ноября 2010

Я завидую Руби с использованием им "нового" в качестве метода. Возможно ли достичь этого в PHP 5.3 с использованием пространств имен?

class Foo
{
     public function new()
     {
         echo 'Hello';
     }
}

Ответы [ 4 ]

5 голосов
/ 27 ноября 2010

как вы можете видеть здесь , "new" находится в списке зарезервированных слов, поэтому вы не можете использовать его для названия метода.

Вы не можете использовать любыеследующих слов в качестве констант, имен классов, имен функций или методов

3 голосов
/ 27 ноября 2010

Нет.Как уже указывалось в другом месте, new является зарезервированным ключевым словом.Попытка использовать его в качестве имени метода приведет к ошибке синтаксического анализа: «синтаксическая ошибка, неожиданная T_NEW, ожидаемая T_STRING».Пространства имен не помогут, потому что ключевое слово new применяется к любому пространству имен.Единственный способ обойти это было бы с помощью виртуального метода, например

/**
 * @method String new new($args) returns $args
 */
class Foo
{
     protected function _new($args)
     {
         return $args;
     }
     public function __call($method, $args)
     {
         if($method === 'new') {
             return call_user_func_array(array($this, '_new'), $args);
         } else {
             throw new LogicException('Unknown method');
         }
     }
}
$foo = new Foo;
echo $foo->new('hello'); // return hello
echo $foo->boo();        // throws Exception

Но я бы не одобрил это.Все магические методы работают медленнее, чем прямой вызов методов, и если простое правило не существует, имя метода не может быть new, так и будет.Используйте синоним.

3 голосов
/ 27 ноября 2010

Ну, краткий ответ на этот вопрос выглядит как нет , поскольку это зарезервированное ключевое слово .

Было бы неплохо иметь доступ к таким классам, но зарезервированные слова важны по причине. Вместо этого люди склонны использовать другие синонимы: create, new, getInstance () [обычно статическое использование] и т. Д.

1 голос
/ 27 ноября 2017

Да, начиная с PHP7. Но только в классах, интерфейсах и чертах.

Теперь разрешены глобально зарезервированные слова как имена свойств, констант и методов внутри классов, интерфейсов и признаков. ...

- http://php.net/manual/en/migration70.other-changes.php#migration70.other-changes.loosening-reserved-words

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...