我看到一个名为“do”
的方法的库public function do
完全错误解析器 解析错误:语法错误,意外的T_DO,期待T_STRING ...
//same on call
$obj->do()
解析错误:语法错误,意外的T_DO,期待T_STRING或T_VARIABLE或'$'in
Gearman顺便使用“do”功能。
答案 0 :(得分: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
方法(或其他一些保留字)。在外部,这种方法与传统定义的方法无法区分。
答案 1 :(得分:7)
命名一个关键字函数是个坏主意。它也可能更糟糕,因为do
不是很具描述性。
选择一个更好的名字。
答案 2 :(得分:1)
class MyClass {
function _do() {
echo "doing something";
}
function __call( $methodName, $arguments ) {
if( $methodName == 'do' ) {
$this->_do();
}
}
}
$myObject = new MyClass();
$myObject->do();
答案 3 :(得分:1)
gearman是一个pecl扩展,用c编写。因此,它不会被php解析器解析。 PHP实际上允许您调用do()方法,但在声明内容时不允许您为其他任何内容定义或使用此保留关键字。如果你看齿轮手代码,你会注意到:
__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)
所以他们是这样做的,你不能从php本身做到这一点