Столкновение имени метода с языковой конструкцией - PullRequest
1 голос
/ 08 января 2012

Я просто хочу назвать метод в моем классе list(). Если я попытаюсь сделать это:

class MyClass {

  function list () {
    // Do some stuff here
  }

}

... Я получаю ошибку разбора (Unexpected T_STRING...). То же самое верно, если я использую echo или print - поэтому я предполагаю, что мне не разрешается называть метод класса так же, как языковая конструкция, и , хотя я не могу найти какую-либо документацию, которая Явно заявляет, что это так, Полагаю, это имеет смысл.

У меня вопрос, кто-нибудь знает об обходе этого, , который будет работать в PHP 4.3.10 ? Я знаю, что это может быть сделано в PHP 5.3+ с замыканиями (или я полагаю, что это возможно, я на самом деле не пробовал) На сегодняшний день нет версий PHP, поддерживающих это с замыканиями, но кто-нибудь может подумать о Обходной путь, который не зависит от этого, учитывая, что здесь важен метод name ?

РЕДАКТИРОВАТЬ N.B.

Я полностью осознаю, насколько древний и мертвый PHP4, но у меня нет выбора для этого конкретного проекта. Он должен работать на платформе, распространяемой с PHP 4.3.10, которая является платформой BusyBox с очень низким уровнем ресурсов и процессором MIPS, для которой не предусмотрены компиляторы. Мне удалось создать кросс-компилятор и успешно собрать для него PHP 5.2 (я еще не пробовал 5.3, возможно, это потребовало бы компиляции и более нового Apache), но, несмотря на это, производитель настаивает на том, что это лишает законной силы их гарантию.

Ответы [ 4 ]

4 голосов
/ 08 января 2012

Дилемма, с которой вы сталкиваетесь, останется, пока вы не выберете A или B.

  • A: Выберите другое имя функции, которое не является зарезервированным словом.

  • B: Измените PHP так, чтобы он предоставлял нужные вам языковые функции.

__call недоступно в PHP 4. list является зарезервированным словом с долгого времени .

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

Поскольку B здесь не выглядит как реальный вариант, вам нужно взять A.

Надеюсь, это поможет вам прийти к выводу.

3 голосов
/ 08 января 2012

Зарезервированные ключевые слова зарезервированы:

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

Так что переименуйте ваши методы.

1 голос
/ 08 января 2012

У вас есть два варианта.

1) переименуйте ваш метод. Если нет реальной причины, по которой вы можете оправдать название вашего метода, то это именно то, что вы должны сделать.

2) пространство имен вашего класса. Если вы поместите свой класс в свое собственное пространство имен, вы сможете повторно использовать имена, которые обычно являются зарезервированными или предопределенными функциями или определены в другом месте. Однако вам следует использовать этот подход, только если вы знаете, что делаете, в противном случае это может привести к путанице.

Я бы выбрал вариант 1, если у вас нет действительно убедительной причины, по которой имя вашего метода должно совпадать с зарезервированным словом PHP.

РЕДАКТИРОВАТЬ: Вы используете PHP 4, поэтому вариант 2 не на столе. Ваш единственный выбор - использовать другое имя для вашего метода. Это или обновить до PHP 5.3. Даже если в конце концов вы не будете использовать пространство имен, я настоятельно рекомендую в любом случае обновить до PHP 5.3, так как PHP 4 устарел и существует уже долгое время. Для него больше не будет выпущено исправлений безопасности, поэтому, запустив его, вы в основном сделаете свой сервер очень небезопасным.

0 голосов
/ 08 января 2012

Вид грязного взлома, но вы можете использовать магические методы. PHP4 на самом деле не поддерживает __call, как php5, но он может работать с конструкцией 'overload'. Я не проверял это, поэтому я не уверен ...

(http://php.net/manual/en/function.overload.php)

class MyClass {
  function __call($func, $args){
    if ($func == 'list')
      return $this->_list($args);      
  }

  function _list () {
    // Do some stuff here
  }
}

overload('MyClass');

$myclass = new MyClass();
$myclass->list();
...