Dalam pembangunan PHP, objek adalah jenis data yang sangat biasa. Di dalam objek, ia mengandungi banyak ahli yang berbeza: sifat, kaedah, pemalar, dll.
Dalam PHP, kaedah peribadi objek tidak boleh dipanggil terus. Walau bagaimanapun, kadangkala kami perlu menukar nilai pulangan dalam kaedah peribadi ini kepada tatasusunan supaya program kami dapat memproses data ini dengan lebih baik.
Dalam artikel ini, kami akan meneroka cara menukar kaedah peribadi dalam objek PHP kepada tatasusunan supaya kami boleh memproses dan menggunakan data ini dengan lebih baik.
1. Kaedah peribadi objek
Dalam objek PHP, kaedah persendirian tidak boleh dipanggil secara luaran. Ini bermakna jika kita ingin memanggil kaedah persendirian dan mendapatkan nilai pulangannya, kita perlu memanggilnya di dalam objek dan kemudian lulus nilai pulangannya melalui beberapa kaedah.
Sebagai contoh, kami mempunyai kelas bernama Foo, yang mengandungi kaedah persendirian bernama getPrivateData():
class Foo { private function getPrivateData() { return array('name' => 'John', 'age' => 30); } }
Oleh kerana getPrivateData() ialah kaedah persendirian, kami tidak boleh Memanggilnya terus secara luaran , seperti ini:
$foo = new Foo(); $data = $foo->getPrivateData(); // 错误!无法访问私有方法
Pada masa ini kita memerlukan beberapa kemahiran untuk mendapatkan nilai pulangan kaedah getPrivateData().
2. Tukar kaedah peribadi objek kepada tatasusunan
Satu penyelesaian ialah menambah kaedah awam di dalam kelas, gunakan kaedah ini untuk memanggil kaedah persendirian, dan kemudian hantar pemulangannya nilai .
class Foo { private function getPrivateData() { return array('name' => 'John', 'age' => 30); } public function getPrivateDataArray() { return $this->getPrivateData(); } }
Dengan cara ini, anda boleh mendapatkan nilai pulangan getPrivateData() dengan memanggil kaedah getPrivateDataArray() secara luaran:
$foo = new Foo(); $data = $foo->getPrivateDataArray(); // 返回array('name' => 'John', 'age' => 30)
Walau bagaimanapun, tambahkan kaedah "pengambil nilai" untuk mendapatkan peribadi Walaupun kaedah mengembalikan nilai berfungsi, ia boleh membawa kepada pertindihan kod dan struktur berantakan. Oleh itu, kita boleh cuba menggunakan beberapa kaedah yang lebih elegan untuk menyelesaikan masalah ini.
Idea asasnya ialah menggunakan mekanisme pantulan PHP untuk mendapatkan dan memanggil kaedah persendirian dalam objek melalui objek dan kaedah pantulan.
Pertama, kita perlu membuat instantiat objek pantulan ini akan mengandungi semua maklumat yang kita perlukan untuk mendapatkan dan memanggil kaedah persendirian dalam objek.
$reflection = new ReflectionClass($object);
Di mana $objek ialah objek yang kita perlukan untuk mendapatkan kaedah persendirian dan menggunakannya untuk mentakrifkan objek pantulan.
Objek refleksi menyediakan kaedah getMethods(), yang boleh mengembalikan tatasusunan objek ReflectionMethod yang mengandungi semua kaedah. Kita boleh lelaran melalui tatasusunan ini untuk mencari kaedah peribadi yang kita mahu.
//$methods = $reflection->getMethods(); $methods = $reflection->getMethods(ReflectionMethod::IS_PRIVATE); foreach ($methods as $method) { if ($method->getName() === 'getPrivateData') { // 找到getPrivateData方法 } }
Di sini kami menggunakan parameter kedua kaedah getMethods() untuk menapis kaedah peribadi. Kemudian kita lelaran melalui tatasusunan ini, gunakan kaedah getName() untuk mendapatkan nama kaedah dan cari kaedah peribadi yang kita perlukan dengan memadankan nama kaedah.
Jika kita dapat mencari kaedah persendirian yang kita perlukan, kita perlu "mengubahnya" menjadi kaedah boleh dipanggil supaya kita boleh mendapatkan nilai Pulangannya.
$method->setAccessible(true); $data = $method->invoke($object);
Di sini, kami menggunakan kaedah setAccessible(true) untuk menjadikan kaedah persendirian boleh dipanggil. Kemudian kami menggunakan kaedah invoke(), lulus contoh objek, panggil kaedah getPrivateData() dan dapatkan nilai pulangan.
Sekarang, kami telah berjaya memperoleh nilai pulangan kaedah persendirian ini ialah tatasusunan bersekutu, tetapi kami perlu menukarnya sebuah indeks. Kita boleh menggunakan fungsi array_values() untuk mencapai operasi ini.
$data = array_values($data);
Melalui proses di atas, kami telah berjaya menukar kaedah persendirian dalam objek PHP kepada tatasusunan. Berikut ialah operasi menggabungkan tatasusunan ini menjadi tatasusunan baharu.
$reflection = new ReflectionClass($object); $methods = $reflection->getMethods(ReflectionMethod::IS_PRIVATE); $data = array(); foreach ($methods as $method) { if ($method->getName() === 'getPrivateData') { $method->setAccessible(true); $result = $method->invoke($object); $data = array_merge($data, array_values($result)); } }
Di sini kita menggunakan fungsi array_merge() untuk menggabungkan semua tatasusunan menjadi satu tatasusunan. Tatasusunan ini mengandungi nilai pulangan semua kaedah peribadi.
3. Ringkasan
Dalam artikel ini, kami meneroka cara menukar kaedah peribadi dalam objek PHP kepada tatasusunan. Untuk mencapai matlamat ini, kami menggunakan mekanisme refleksi PHP untuk mendapatkan dan memanggil kaedah peribadi dalam objek melalui objek dan kaedah refleksi. Dengan cara ini, kita boleh mendapatkan nilai pulangan kaedah peribadi ini dan menukarnya kepada tatasusunan supaya kita boleh memproses dan menggunakan data ini dengan lebih baik.
Perlu diingat bahawa walaupun kaedah ini boleh mencapai hasil yang diingini, dalam beberapa kes, ia mungkin menjejaskan kebolehbacaan dan kebolehselenggaraan kod. Oleh itu, dalam pembangunan sebenar, kita harus memilih untuk menggunakan penyelesaian yang berbeza berdasarkan keperluan dan keadaan sebenar.
Atas ialah kandungan terperinci Bagaimana untuk menukar kaedah peribadi objek PHP kepada tatasusunan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!