【问题标题】:PHP how to create a function named "do"?PHP如何创建一个名为“do”的函数?
【发布时间】:2011-09-02 18:35:43
【问题描述】:

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

【问题讨论】:

  • 你应该提出你的目的是创建一个模拟对象。

标签: php function reserved-words


【解决方案1】:

“do”是保留关键字:http://www.php.net/manual/en/reserved.keywords.php

在同一页面上,在 cmets 中,您会看到用户提到了解决此问题的方法。请记住,必须小心使用此方法:

// 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 方法(或其他一些保留字)。从外部看,这种方法与传统定义的方法没有区别。

【讨论】:

  • 谢谢我知道do是一个保留字,你回答了我的问题。
【解决方案2】:

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

选择一个更好的名字。

【讨论】:

  • 我别无选择。我正在为上面的 Gearman 创建一个虚拟类文件,它有一个“do”方法。我知道它是一个保留字,但他们让它工作我不知道如何。
  • @Daniel 这是一个逃避现实的答案。他问这是怎么可能的,而不是他是否应该或不应该。
  • @Geocine:也许你应该在你的问题中解释这一点。
  • 无论你把保留字放在哪里,它都不起作用,解析器会发牢骚,我在一个类中使用它。克里斯下来他们回答了我的问题。谢谢
【解决方案3】:
    class MyClass {
        function _do() {
            echo "doing something";
        }

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

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

【讨论】:

  • 在发布我 10 分钟前发布的相同答案时有什么特别的实用工具吗? :P
  • @Chris 没注意到,我正在做一些研究以确保它是正确的答案,然后点击发布。
【解决方案4】:

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

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-28
    • 2019-12-05
    • 2021-12-15
    • 2022-01-20
    • 2020-12-29
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多