1

少し問題があります。JavaScript では、スコープを転送することが可能です:

var aaa = new function () {
    that = this;
    that.bbb  = 'foo';
    this.ccc = new function () {
        this.ddd = 'bar';
        this.eee = function () {
            return that.bbb+this.ddd;
        }
    }
}

aaa.ccc.eee() は「foobar」を返します。PHPで同じ効果を得るにはどうすればよいですか? 私はコードをもっている:

class bbb {
    public $ccc = 'bar';
        function __construct () {
            echo($that->aaa.$this->ccc);
        }
}
class aaa {
    public $that;
    public $aaa = 'foo';
    public $bbb;
    function __construct () {
        echo($this->aaa);
        $this->$bbb = new bbb();
        $this->$that = $this;
    }
}
$a = new aaa ();

私はそのようなものを使用する必要があります:

$this->bbb = new bbb ($this);

class bbb {
    public $that;
    function __contruct ($parent) {
        $that = $parent
        ....
    }
}

?

4

3 に答える 3

3

JS コードとまったく同じことを実行することを妨げるものは何もありませんが、これは PHP で毎日目にするものではありません。

PHP5.3

$aaa = (object)array(
    'bbb' => 'foo',
    'ccc' => (object) array(
        'ddd' => 'bar',
        'eee' => function() use(&$aaa){ $self = $aaa->ccc; return $aaa->bbb.$self->ddd; }
    ),
);

echo call_user_func($aaa->ccc->eee);

PHP 5.3 では$this、クロージャー内で変数を使用することはできないため、インポートされた変数の 1 つ (この場合は ) から必要なコンテキストに到達する必要があることに注意してください$aaa

また、関数を「直接」呼び出すことはできないことに注意してください。これは、 $aaa-ccc->eee()PHP が最悪です:$aaa->cccは型のオブジェクトでstdClassあり、そのクラスには という名前の正式なメンバーがないためeeeです。

ここでは、参照によるキャプチャによって「かわいい」ことも$aaaできます。これにより、オブジェクト グラフ全体を 1 行で定義できます (1 つのステートメントでクロージャを使用せずに値によるキャプチャを$aaa定義する必要がある場合は、別のステートメントでクロージャを追加し$aaa->ccc->eee = function() ...ます)。

PHP5.4

$aaa = (object)array(
    'bbb' => 'foo',
    'ccc' => (object) array(
        'ddd' => 'bar',
        'eee' => function() use(&$aaa) { return $aaa->bbb.$this->ddd; }
    ),
);

$aaa->ccc->eee = $aaa->ccc->eee->bindTo($aaa->ccc);
echo call_user_func($aaa->ccc->eee);

PHP 5.4 では$this、最初に「再バインド」する限り、クロージャー内で使用できますbindTo。前に述べたのと同じ理由で、クロージャーを定義すると同時にこれを行うことはできません:PHPは最悪です。

于 2012-08-01T11:34:56.047 に答える
1

JavaScript で行っていることは、PHP で行っていることとはまったく異なります。JavaScript ではクロージャを実行し、PHP では非常に不正な形式のクラスを実行しています。

PHPでは、最も近いものは(IIFEがないなどの理由で醜いですが)

$tmp = function() {
    $that = new stdClass();
    $that->bbb = "foo";

    $tmp = function() use ($that) {
        $this_ = new stdClass();
        $this_->ddd = "bar";
        $this_->eee = function() use ($that, $this_) {
            return $that->bbb . $this_->ddd;
        };
        return $this_;
    };
    $that->ccc = $tmp();
    return $that;
};

$aaa = $tmp();

var_dump( call_user_func( $aaa->ccc->eee ));
//string(6) "foobar"

PHP 5.4.5 でテスト済み。

于 2012-08-01T11:30:45.263 に答える
0
class bbb {
    function __construct ($parrent) {
        echo $parrent->ccc;
    }
}

class aaa {
    public $aaa = 'foo';
    public $bbb;
    public $ccc = 'bar';

    function __construct () {
        echo $this->aaa;
        $this->bbb = new bbb($this);
    }
}

$a = new aaa();
于 2012-08-01T11:42:13.677 に答える