PHP如何创建一个名为“do”的函数?

发布于 2024-12-02 20:19:20 字数 406 浏览 3 评论 0原文

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

I saw a library with a method named "do"

public function do

totally bugs out parser
Parse error: syntax error, unexpected T_DO, expecting T_STRING in ...

//same on call 
$obj->do() 

Parse error: syntax error, unexpected T_DO, expecting T_STRING or T_VARIABLE or '$' in

Gearman Uses a "do" function by the way.

http://www.php.net/manual/en/gearmanclient.do.php

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

清风夜微凉 2024-12-09 20:19:20

“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 ();
    }

所以您会看到,您可以通过使用 __call 在任何类中使用 do 方法(或其他保留字)超载。从外部来看,该方法与传统定义的方法没有什么区别。

"do" is a reserved keyword: http://www.php.net/manual/en/reserved.keywords.php

On that same page, in the comments, you see a user mention a way around this. Bear in mind that this method must be used with care:

// 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 ();
    }

So you see, you could use a do method (or some other reserved word) in any class by using the __call overload. Externally, this method would be indistinguishable from a traditionally defined method.

烟酒忠诚 2024-12-09 20:19:20

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

选择一个更好的名字。

Its a bad idea to name a function that is a keyword. Its also, maybe even worse name because do isn't very descriptive.

Choose a better name.

暗藏城府 2024-12-09 20:19:20
    class MyClass {
        function _do() {
            echo "doing something";
        }

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

    $myObject = new MyClass();
    $myObject->do();
    class MyClass {
        function _do() {
            echo "doing something";
        }

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

    $myObject = new MyClass();
    $myObject->do();
聊慰 2024-12-09 20:19:20

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

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)

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

gearman is a pecl extension, written in c. as such, it is not parsed by the php parser. PHP actually allows you to call a do() method, but wont let you define or use this reserved keyword for anything else when declaring stuff. If you look at the gearman code, you will notice:

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)

so that's how they did it and you cant do it from php itself

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文