Pengantar PHP Reflection API

Halo, Habr! Saya hadir untuk Anda terjemahan artikel " Pengantar API PHP Refleksi " oleh Mustafa Magdi .

Bagaimana cara menganalisis struktur data dalam PHP




Entri


Ketika saya mulai pemrograman dalam PHP, saya tidak tahu tentang kemampuan API Refleksi . Alasan utamanya adalah saya tidak perlu mendesain kelas, modul, atau bahkan paket sederhana saya. Kemudian saya menemukan bahwa ini memainkan peran utama di banyak bidang. Dalam artikel ini, kami akan mempertimbangkan API Refleksi pada poin-poin berikut:

  1. Apakah API Refleksi itu ?
  2. Instalasi dan konfigurasi
  3. Gunakan
  4. Kesimpulan
  5. Rekomendasi


1. Apa itu API Refleksi


Dalam ilmu komputer, refleksi atau refleksi (holonim dari introspeksi, refleksi bahasa Inggris) berarti suatu proses di mana program dapat melacak dan memodifikasi struktur dan perilaku sendiri saat runtime. - Wikipedia .
Apa arti dari kemampuan untuk berhenti dan melihat ke dalam kode Anda ( reverse-engineering ) artinya? Mari kita lihat cuplikan kode berikut:

/** * Class Profile */ class Profile { /** * @return string */ public function getUserName(): string { return 'Foo'; } } 

Kelas Profile adalah kotak hitam. Menggunakan API Refleksi Anda dapat membaca apa yang ada di dalamnya:

 //  $reflectionClass = new ReflectionClass('Profile'); //    var_dump($reflectionClass->getName()); => output: string(7) "Profile" //    var_dump($reflectionClass->getDocComment()); => output: string(24) "/** * Class Profile */" 

Dengan demikian, ReflectionClass bertindak sebagai analis untuk kelas Profil kami, dan ini adalah gagasan utama API Refleksi .

PHP memberi Anda kunci ke kotak apa pun yang dikunci, jadi kami memiliki kuncinya
untuk yang berikut ini:
ReflectionClass : melaporkan informasi kelas.
ReflectionFunction : melaporkan informasi fungsi.
ReflectionParameter : Mengambil informasi tentang parameter fungsi atau metode.
ReflectionClassConstant : melaporkan informasi konstanta kelas.

Anda dapat mempelajari daftar lengkapnya di php.net

2. Instalasi dan konfigurasi


Untuk menggunakan kelas-kelas API Refleksi , tidak perlu menginstal atau mengkonfigurasi apa pun, karena mereka adalah bagian dari inti PHP.

3. Contoh penggunaan


Berikut ini adalah beberapa contoh bagaimana kami dapat menggunakan API Refleksi :

Contoh 1:
Dapatkan kelas induk untuk kelas tertentu:

 //   class Child extends Profile { } $class = new ReflectionClass('Child'); //     print_r($class->getParentClass()); // ['Profile'] 

Contoh 2:
Dapatkan dokumentasi untuk metode getUserName() :

 $method = new ReflectionMethod('Profile', 'getUserName'); var_dump($method->getDocComment()); => output: string(33) "/** * @return string */" 

Contoh 3:
Itu dapat digunakan sebagai instanceOf dan is_a() untuk memvalidasi objek:

 $class = new ReflectionClass('Profile'); $obj = new Profile(); var_dump($class->isInstance($obj)); // bool(true) //    var_dump(is_a($obj, 'Profile')); // bool(true) //    var_dump($obj instanceof Profile); // bool(true) 

Contoh 4:
Dalam beberapa situasi, Anda mungkin terjebak dengan pengujian unit dan bertanya-tanya, "Bagaimana saya bisa menguji fungsi pribadi?!"

Jangan khawatir, inilah triknya:

 //    getName() private function getName(): string { return 'Foo'; } $method = new ReflectionMethod('Profile', 'getUserName'); //          if ($method->isPrivate()) { $method->setAccessible(true); } echo $method->invoke(new Profile()); // Foo 

Contoh sebelumnya cukup sederhana, tetapi ada contoh lain di mana Anda dapat melihat bagaimana API Refleksi digunakan secara lebih luas:
  • Pembuat dokumentasi API : paket lavarel-apidoc-generator menggunakan ReflectionClass dan ReflrectionMethod secara luas untuk mendapatkan dan selanjutnya memproses informasi tentang blok dokumentasi untuk kelas dan metode, dan untuk menata blok kode ini.
  • Dependency Injection Container : Anda dapat memeriksa seluruh topik di sini

4. Kesimpulan


PHP menyediakan API Refleksi lengkap yang membantu Anda dengan mudah menjangkau berbagai area struktur OOP.

5. Referensi



Dari penerjemah:

Anda juga dapat melihat contoh menggunakan API Refleksi dalam paket Codeception di kelas Stub .
Kelas ini melalui refleksi membantu mencelupkan metode dan properti dalam pengujian unit.

Harus ditambahkan bahwa API Refleksi bekerja agak lambat, jadi Anda tidak boleh terlalu terlibat. Disarankan untuk digunakan dalam tes atau selama debugging, tetapi jika Anda bisa melakukannya tanpa itu, maka lebih baik untuk melakukannya. Dan itu pasti tidak direkomendasikan untuk digunakan dalam kode kerja proyek, seperti itu juga tidak aman.

Source: https://habr.com/ru/post/id433266/


All Articles