2011-09-02 70 views
2

我看到了一个名叫法库 “做”PHP如何创建一个名为“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

+0

你应该把你的问题,你的目的是创建一个模拟做目的。 – webbiedave

回答

11

“做”是保留关键字: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(); 
    } 

所以你看,你可以通过使用__call超负荷使用任何类do方法(或其他一些保留字)。从外部看,这种方法与传统定义的方法无法区分。

+2

谢谢我知道这是一个保留字,并且你回答了我的问题。 – bman

7

它是一个坏主意来命名一个功能是一个关键词。它也可能更糟糕的名字,因为do不是很具描述性。

选择一个更好的名字。

+1

我没有选择。我为Gearman创建了一个虚拟类文件,该文件上面有一个“do”方法。我知道它是一个保留字,但它使它工作,我不知道如何。 – bman

+0

你是什么意思虚拟? –

+3

@Daniel这是一个cop-out的答案。他问如何可能,而不是他应该或不应该。 – AlienWebguy

1
class MyClass { 
     function _do() { 
      echo "doing something"; 
     } 

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

    $myObject = new MyClass(); 
    $myObject->do(); 
+0

发布相同答案的任何特定实用程序我在10分钟前发布? :P –

+1

@Chris没有注意到,我正在做一些研究,以确保它是正确的答案,然后点击后。 – nobody

1

gearman是一个pecl扩展,用c语言编写。因此,它不会被php解析器解析。 PHP实际上允许你调用do()方法,但是在声明内容时不会让你定义或使用这个保留关键字来做其他事情。如果你看一下Gearman的代码,你会发现:

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0) 

所以这就是他们怎么做,你不能从PHP本身

相关问题