Rumah >pembangunan bahagian belakang >tutorial php >Bagaimana untuk Mendapat Penutupan yang Ditugaskan dengan Betul kepada Hartanah Objek dalam PHP?

Bagaimana untuk Mendapat Penutupan yang Ditugaskan dengan Betul kepada Hartanah Objek dalam PHP?

DDD
DDDasal
2024-12-22 11:23:10409semak imbas

How to Correctly Invoke Closures Assigned to Object Properties in PHP?

Meminta Penutupan Ditugaskan kepada Sifat Objek Secara Terus

Menetapkan penutupan pada harta objek membolehkan pembangun mengaitkan fungsi dengan objek. Walau bagaimanapun, mengakses penutupan secara langsung boleh menimbulkan masalah.

Masalahnya:

Apabila cuba memohon penutupan yang diberikan kepada sifat objek secara langsung, ralat berikut berlaku:

Fatal error: Call to undefined method stdClass::callback().

Ini kerana harta itu disimpan sebagai objek penutupan, yang tidak mempunyai __invoke() kaedah.

Penyelesaian dalam PHP 7 dan ke atas:

Dalam PHP 7 dan seterusnya, sintaks berikut tersedia:

$obj = new stdClass;
$obj->fn = function($arg) { return "Hello $arg"; };
echo ($obj->fn)('World');

Sebagai alternatif, Penutupan ::call() boleh digunakan, walaupun ia tidak berfungsi dengannya StdClass:

Closure::call($obj->callback, ['World']);

Penyelesaian sebelum PHP 7:

Sebelum PHP 7, kaedah sihir __call boleh dilaksanakan untuk memintas seruan penutupan:

class Foo
{
    public function __call($method, $args)
    {
        if (is_callable(array($this, $method))) {
            return call_user_func_array($this->$method, $args);
        }
        // else throw exception
    }
}

$foo = new Foo;
$foo->cb = function($who) { return "Hello $who"; };
echo $foo->cb('World');

Nota: Kaedah __panggilan tidak boleh digunakan call_user_func_array(array($this, $method), $args) kerana ia akan membawa kepada gelung tak terhingga.

Atas ialah kandungan terperinci Bagaimana untuk Mendapat Penutupan yang Ditugaskan dengan Betul kepada Hartanah Objek dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn