2012-01-08 4 views
1

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

class MyClass { 

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

} 

... Я получаю ошибку синтаксического анализа (Unexpected T_STRING...). То же самое верно, если я использую echo или print - так что я предполагаю, что мне не разрешено называть метод класса такой же, как языковая конструкция, и while I cannot find any documentation that explicitly states this to be the case, Я полагаю, что это имеет смысл.

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

EDITN.B.

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

+2

Вы ищете эту страницу: [PHP Reserved Keywords] (http://php.net/manual/en/reserved.keywords.php) –

+1

Почему вы не можете назвать это чем-то еще? 'list()' = 'listing()', 'echo()' = 'e()' и 'print()' = 'p()' например. – Treffynnon

+0

@Cicada большое спасибо за это, я думал, что должна быть страница руководства, которую я пропустил на этом. Я все еще думаю, что * может * быть каким-то образом определить метод динамически в PHP4, но это есть, я не знаю, что. – DaveRandom

ответ

4

дилемма вы сталкиваетесь будет оставаться до тех пор, пока выберите A или B.

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

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

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

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

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

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

+0

Я думал, что A будет единственным вариантом. Я получаю от него коллегу, но я, вероятно, просто скажу ему, чтобы он жил с ней или исправил ее сам. Я могу понять его желание придерживаться того, что является вполне понятным интерфейсом, но если это невозможно, это невозможно. У вас может быть вкусный +1 для этого :-) – DaveRandom

1

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

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

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

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

EDIT: вы используете PHP 4, поэтому опция 2 находится вне таблицы. Ваш единственный выбор использует другое имя для вашего метода. Это или обновление до PHP 5.3. Даже если вы не идете с расширением имен в конце концов, я бы настоятельно советовал обновить до PHP 5.3 в любом случае, так как PHP 4 мертв и был надолго. Патчей безопасности не будет выпущено для него снова, поэтому, запуская его, вы в основном делаете ваш сервер очень неуверенным.

+1

Re 2: OP сказал, что он должен работать на мертвом PHP. Кроме того, предложение namespacing не будет работать в любом случае (зарезервировано зарезервировано): http://codepad.viper-7.com/a9FIFO – Gordon

+0

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

+0

@ Gordon: Я не знал, что о зарезервированных словах, спасибо за проверку. Я когда-либо использовал этот трюк, и это было для функции сборки, поэтому спасибо за разъяснение. – GordonM

0

Вид грязного взлома, но вы можете использовать магические методы. 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(); 
3

Reserved keywords are reserved:

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

Так переименовывать методы.