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
Lepaskan: 2024-12-22 11:23:10
asal
448 orang telah melayarinya

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().
Salin selepas log masuk

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');
Salin selepas log masuk

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

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

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');
Salin selepas log masuk

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 Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan