2011-09-02 66 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本身