9

新しいキーワードを使用する式が連鎖実行で使用されるために括弧が必要なのはなぜですか?たとえば、AS3では、括弧は必要ありません。PHPでは、これはインタプリタの文体的な補助ですか、それとも私が気付いていない大きな理由がありますか?実行順序の優先順位の問題ですか?

PHPでのコンストラクターチェーン

この質問のおかげで、PHPでのオブジェクト関数呼び出しを使用したコンストラクターのチェーン化の方法を理解しました…</ p>

オブジェクト定義

余談ですが、どうやら、魔法のメソッド__constructは常に暗黙的に戻り$this、明示的に返す場合$this(またはそれに関しては何か)、エラー/警告/例外は発生しません。

class Chihuahua
{
    private $food;

    function __construct( $food )
    {
        $this->food = $food;
    }

    function burp()
    {
        echo "$this->food burp!";
    }
}

作品

(new Chihuahua('cake'))->burp();

動作しません(しかし、動作したいのですが)

new Chihuahua('cake')->burp();
4

4 に答える 4

8

通訳がこれを解析するからだと思いますが、

new (Chihuahua('cake')->burp());

それ以外の、

(new Chihuahua('cake'))->burp();

演算子->よりも優先度が高いためです。new

そして、これが原因でエラーが発生します。

Chihuahua('cake')->burp()

理解されていません。それが役に立てば幸い。

于 2012-12-29T00:50:46.400 に答える
4

newオペレーターの優先順位はオペレーターよりも低いため->です。PHPはChihuahua('cake')->burp()前に実行しようとしますnew Chihuahua('cake')。それは問題。

于 2012-12-29T00:51:24.237 に答える
1

なぜこれを行おうとしているのかわかりませんが、phpについて注意すべき点がいくつかあります。まず、はい、新しいObject()ステートメントを括弧で囲んで、実際のオブジェクトへの呼び出しをインラインキャストする必要があります。

上記の例では、burpメソッドを呼び出した後、すぐにオブジェクトを破棄しています。これが、オブジェクトのインスタンスに依存せずにオブジェクトメソッドを機能させる必要がある場合は、静的メソッドを使用しないのはなぜですか?

編集:コンストラクトをラップする方法->実行->プロセスを破棄する方法を示すために__complex静的メソッドに追加されました。

class Chihuahua
{
    public static function burp( $food )
    {
        echo "$food burp!";
    }

    protected $food = '';
    public function doBurp()
    {
        echo $this->food . " burp!";
    }

    public function __construct($food)
    {
        $this->food = $food;
    }

    public static __complex( $food )
    {
        $chi = new Chihuahua($food);
        $chi->doBurp();
        unset($chi);
    }
}

Chihuahua::burp("cake");
// - or
Chihuahua::__complex("cake");
于 2012-12-29T00:53:04.017 に答える
0

補足:括弧内のコンストラクターは、PHPv5.4以降でのみ機能します。http://3v4l.org/ZANaOhttp://3v4l.org/m9vk9を参照してください。

于 2015-01-27T09:26:01.030 に答える