2

我看到了一个带有名为“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

4 回答 4

11

“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在外部,这种方法与传统定义的方法没有区别。

于 2011-09-02T18:39:16.753 回答
7

将函数命名为关键字是个坏主意。它的名字也可能更糟糕,因为do它的描述性不是很好。

选择一个更好的名字。

于 2011-09-02T18:37:06.090 回答
1
    class MyClass {
        function _do() {
            echo "doing something";
        }

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

    $myObject = new MyClass();
    $myObject->do();
于 2011-09-02T18:48:13.863 回答
1

gearman 是一个 pecl 扩展,用 c 编写。因此,它不会被 php 解析器解析。PHP 实际上允许您调用 do() 方法,但在声明内容时不允许您定义或使用此保留关键字。如果您查看 gearman 代码,您会注意到:

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)

所以他们就是这样做的,你不能从 php 本身做

于 2011-09-02T18:49:20.077 回答