PHP как создать функцию с именем "do"? - PullRequest
2 голосов
/ 02 сентября 2011

Я видел библиотеку с методом с именем "do"

public function do

полностью исправляет парсер Ошибка разбора: синтаксическая ошибка, неожиданный T_DO, ожидание T_STRING в ...

//same on call 
$obj->do() 

Ошибка разбора: синтаксическая ошибка, неожиданный T_DO, ожидаемый T_STRING или T_VARIABLE или '$' в

Gearman Кстати, использует функцию "do".

http://www.php.net/manual/en/gearmanclient.do.php

Ответы [ 4 ]

11 голосов
/ 02 сентября 2011

«do» является зарезервированным ключевым словом: http://www.php.net/manual/en/reserved.keywords.php

На той же странице, в комментариях, вы видите упоминание пользователя об этом.Помните, что этот метод должен использоваться с осторожностью:

// Now define a __call() method (requires PHP > 5.2.3 to take effect)
public function __call($func, $args)
{
    switch ($func)
    {
        case 'list':
            return $this->ls((isset($args[0]))? $args[0]: null);
        break;
        case 'unset':
            return $this->rm($args[0]);
        break;
        default:
            trigger_error("Call to undefined method ".__CLASS__."::$func()", E_USER_ERROR);
        die ();
    }

Итак, вы видите, что вы можете использовать метод do (или другое зарезервированное слово) в любом классе, используя перегрузку __call,Внешне этот метод был бы неотличим от традиционно определенного метода.

7 голосов
/ 02 сентября 2011

Это плохая идея назвать функцию, которая является ключевым словом. Это также, возможно, даже худшее имя, потому что do не очень наглядно.

Выберите лучшее имя.

1 голос
/ 02 сентября 2011

gearman - расширение pecl, написанное в c. как таковой, он не анализируется парсером php. PHP фактически позволяет вам вызывать метод do (), но не позволяет вам определять или использовать это зарезервированное ключевое слово для чего-либо еще при объявлении вещи. Если вы посмотрите на код механизма, вы заметите:

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)

так вот как они это сделали, а вы не можете сделать это из самого php

1 голос
/ 02 сентября 2011
    class MyClass {
        function _do() {
            echo "doing something";
        }

        function __call( $methodName, $arguments ) {
            if( $methodName == 'do' ) {
                $this->_do();
            }
        }
    }

    $myObject = new MyClass();
    $myObject->do();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...