2

「do」という名前のメソッドを持つライブラリを見ました

public function do

パーサーを完全にバグる 解析エラー: 構文エラー、予期しない T_DO、期待される T_STRING in ...

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

解析エラー: 構文エラー、予期しない T_DO、T_STRING または T_VARIABLE または '$' が必要です

Gearman ちなみに「do」機能を使っています。

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

4

4 に答える 4

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。外部的には、このメソッドは伝統的に定義されたメソッドと見分けがつきません。

于 2011-09-02T18:39:16.753 に答える
7

キーワードである関数に名前を付けるのは悪い考えです。また、doあまり説明的ではないため、さらに悪い名前かもしれません。

より適切な名前を選択してください。

于 2011-09-02T18:37:06.090 に答える
1
    class MyClass {
        function _do() {
            echo "doing something";
        }

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

    $myObject = new MyClass();
    $myObject->do();
于 2011-09-02T18:48:13.863 に答える
1

Gearman は c で書かれた pecl 拡張です。そのため、php パーサーによって解析されません。PHP では実際に do() メソッドを呼び出すことができますが、何かを宣言するときに、この予約済みキーワードを定義したり、他の目的で使用したりすることはできません。Gearman コードを見ると、次のことがわかります。

__PHP_ME_MAPPING(do, gearman_client_do, arginfo_oo_gearman_client_do, 0)

それが彼らのやり方であり、php自体からそれを行うことはできません

于 2011-09-02T18:49:20.077 に答える