Rumah >pembangunan bahagian belakang >tutorial php >Membangunkan sambungan PHP dengan C dan PHP-CPP: Lanjutan
Membangunkan sambungan PHP dengan C dan PHP-CPP: Topik Lanjutan dan Amalan Terbaik
mata utama
__toString
Pengenalan ini tidak lengkap, kerana tumpuan utama artikel lebih banyak menunjukkan keupayaan berorientasikan objek PHP-CPP daripada butiran pelaksanaan berorientasikan objek.
Dalam artikel ini, kami akan terus menyelam ke dalam pembangunan perpustakaan kompleks, menambah lebih banyak fungsi ahli, dan menangani beberapa topik lanjutan dalam penulisan sambungan PHP berorientasikan objek menggunakan PHP-CPP:
kembali penunjuk ini;
__toString
keseluruhan proses penyediaan persekitaran dijelaskan dalam artikel pertama.
kembali penunjuk ini dalam c
Seperti yang disebutkan dalam artikel kedua, kami menggunakan fungsi ahli untuk melaksanakan pelbagai operasi matematik pada nombor kompleks. Dalam demonstrasi ini, kami akan melaksanakan empat fungsi tersebut: Tambah, Sub, Mul, dan Div. Saya akan menerangkan tiga yang pertama terlebih dahulu. Fungsi DIV melibatkan pengendalian pengecualian, yang akan dibincangkan kemudian.
mari kita lihat fungsi MUL (untuk pendaraban). Fungsi Tambah dan sub adalah kira -kira sama.
Nota: Dalam artikel ini, saya tidak akan memperkenalkan beberapa topik asas yang dibincangkan sebelum ini, seperti mengubah suai fail Makefile dan INI, mendaftarkan fungsi ahli, kelas dan ruang nama, dll. Sila rujuk bahagian sebelumnya untuk kandungan ini.Mengembalikan penunjuk ini dari C ke PHP adalah mudah. Di dalam fungsi C ini, penunjuk ini (sebagai jenis* kompleks) boleh dikembalikan kepada PHP sebagai jenis nilai php ::. Penukaran tidak kehilangan sebarang maklumat objek. Ia juga tidak memerlukan penukaran jenis yang jelas.
Pointer Objek Kompleks Kembali
Kembali ini biasanya bermakna objek itu sendiri telah berubah. Tetapi dalam beberapa kes kita mungkin mahu mengembalikan objek baru dan meninggalkan objek "semasa" (objek panggilan) tidak berubah.
Dalam kelas kompleks kami, kami mempunyai fungsi seperti ini yang mengembalikan bilangan konjugasi nombor kompleks yang diberikan (A BI menjadi A-BI).
<code class="language-c++">Php::Value add(Php::Parameters ¶ms) { Php::Value t = params[0]; Complex *a = (Complex *) t.implementation(); r += (double) a->getReal(); i += (double) a->getImage(); return this; }</code>
Titik utama di sini adalah bahawa kita perlu menggunakan objek Php :: untuk secara jelas menukar objek* kompleks kita ke php :: objek, jadi apabila objek kemudian dihuraikan oleh skrip php, maklumat kelas dipastikan dan disimpan dengan betul dan disimpan dengan betul dan disimpan dengan betul dan disimpan dengan baik Kebolehcapaiannya.
Parameter pertama fungsi ini adalah jenis kelas, dalam kes ini TRCOMPLEX. Saya menggunakan nama ini kerana saya telah membungkus kelas ini ("kompleks") ke ruang nama berasingan ("tr").
Parameter kedua adalah objek yang akan diluluskan.
Kembali contoh kelas baru adalah sedikit lebih rumit daripada hanya mengembalikan penunjuk ini, tetapi ia masih boleh diurus selagi anda membaca dokumentasi dan mencari bahagian yang betul. Untuk lebih banyak contoh penggunaan, anda mungkin mahu membaca bahagian ini dalam dokumentasi PHP-CPP rasmi.
Buka __ToString Magice Method
Di kelas kami, terdapat fungsi __toString
yang mencetak nombor jamak dengan cara yang lebih mudah dibaca, contohnya: 1 2i. Dalam jawatan terdahulu saya, fungsi ini tidak terdedah (atau "didaftarkan" dalam terminologi PHP-CPP), tetapi ia masih boleh dipanggil dari dalam PHP. Walau bagaimanapun, agar fungsi ini dipanggil pada objek kompleks selepas kami menggunakan beberapa operasi matematik (mis. "Echo $ a- & gt; tambah ($ b)-& gt; sub ($ c)"), kita perlu disusun Ia didaftarkan secara eksplisit dalam lanjutan:
<code class="language-c++">Php::Value conjugate() { Complex *t = new Complex(); t->r = r; t->i = -i; return Php::Object("tr\Complex", t); }</code>
Isu yang kami sampaikan dalam isu repositori PHP-CPP #150 membincangkan secara terperinci mengapa kami perlu melakukan ini.
Panggilan fungsi ahli rantai
Satu perkara yang mesti dilaksanakan di kelas ini adalah untuk dapat menghubungkan fungsi ahli supaya kita dapat melakukan pengiraan berikut: $ a- & gt; add ($ b)-& gt; sub ($ c). Hasilnya masih boleh memanggil fungsi anggotanya.
Ini dilakukan dengan kaedah di atas, iaitu, mengembalikan penunjuk ini kepada PHP. Walau bagaimanapun, perpustakaan PHP-CPP yang lebih tua mempunyai kesilapan apabila objek dereferen, dan jika kaedah pautan dipanggil, "kesalahan segmen" dibuat.
Isu telah dikemukakan (#151) dan komit yang mengandungi patch kod sumber PHP-CPP telah diserahkan. Jika anda menggunakan versi lama perpustakaan PHP-CPP untuk menyusun perpustakaan PHP-CPP dan perpustakaan anda sendiri, sila kemas kini kod sumber PHP dan menyusun semula dan memasang semula perpustakaan PHP-CPP dan perpustakaan anda.
seperti yang dijelaskan dalam ringkasan penyerahan:
<code class="language-c++">complex.method("__toString", &Complex::__toString);</code>
Saya gembira kerja projek saya sendiri dapat membantu perpustakaan yang saya gunakan menjadi lebih baik.
Pengecualian dan pengendalian dalam php
Dua lagi fungsi dalam kelas kompleks kita boleh membuang pengecualian kembali ke PHP untuk pemprosesan: Div dan Phi. Bekas operasi pembahagian, sementara yang terakhir mengembalikan sudut nombor kompleks, seperti yang ditunjukkan dalam perwakilan alternatifnya, perwakilan koordinat polar (r, θ).
Jika anda lulus nombor jamak sebagai parameter (atau pemanggil), tetapi bahagian dan bahagian khayalan sebenarnya 0, kedua -dua operasi mungkin gagal. Bagi kedua -dua operasi ini, kita perlu melakukan pengendalian pengecualian. Ingatlah bahawa kita membuang pengecualian dalam kod C, dan skrip PHP akan menangkap pengecualian dan melakukan pemprosesan yang diperlukan:
<code class="language-c++">Php::Value add(Php::Parameters ¶ms) { Php::Value t = params[0]; Complex *a = (Complex *) t.implementation(); r += (double) a->getReal(); i += (double) a->getImage(); return this; }</code>
Dalam skrip PHP, kami menangkap pengecualian ini seperti ini:
<code class="language-c++">Php::Value conjugate() { Complex *t = new Complex(); t->r = r; t->i = -i; return Php::Object("tr\Complex", t); }</code>
coretan kod di atas akan memaparkan baris teks berikut:
<code class="language-c++">complex.method("__toString", &Complex::__toString);</code>
Ia sangat mudah, bukan? Pengecualian C yang dibina dalam lanjutan kami diluluskan kembali ke PHP dan ditangkap dengan betul. Di samping itu, kita boleh mengendalikan pengecualian seperti kita mengendalikan pengecualian PHP asli yang dibuang oleh kod PHP yang lain!
Uji semua fungsi
Akhirnya, kita boleh menyusun dan memasang lanjutan kompleks. Sekiranya semuanya berjalan lancar, kami dapat mengesahkan pemasangan pelanjutan dengan mengeluarkan arahan berikut di terminal: make && sudo make install
<code>修复问题#151,链式方法调用无法正常工作…… ……因为每个对象的引用计数未正确更新,这导致即使对象已分配给不同的变量,该对象也会被销毁。</code>Terminal harus memaparkan garis yang mengatakan "/etc/php5/cli/conf.d/complex.ini", kami dapat memastikan pelanjutan kami dipasang dan siap dipanggil oleh mana -mana skrip PHP.
NOTA: Jika kita menyemak MAKEFILE untuk pelanjutan ini, kita akan melihat bahawa kita memasang lanjutan PHP ini ke dalam persekitaran CLInya. Jika kita mahu memasang pelanjutan ini supaya Apache dapat memuatkannya, kita menukar baris berikut:
<code class="language-c++">Php::Value div(Php::Parameters ¶ms) { Php::Value t = params[0]; Complex *b = (Complex*) t.implementation(); double t1 = b->mod() * b->mod(); if (t1 == 0) throw Php::Exception("Division by zero"); double tr = r * (double) (b->getReal()) + i * (double) (b->getImage()); double ti = i * (double) (b->getReal()) - r * (double) (b->getImage()); r = tr / t1; i = ti / t1; return this; }</code>skrip php ujian untuk lanjutan ini adalah seperti berikut, dengan beberapa nota:
<code class="language-php">$a=new tr\Complex(1,2); $c=new tr\Complex(); //$c实际上是0+0i try { $res=$a->div($c); } catch(Exception $e) { echo "Caught exception: ".$e->getMessage()."\n"; } }</code>Semua skrip ujian harus dijalankan dengan betul dan pengecualian ditangkap dengan betul.
Kesimpulan
Ini meringkaskan siri artikel 3 saya untuk membina perpustakaan yang kuat ini dengan C untuk sambungan PHP. Kami merangkumi asas-asas, aspek berorientasikan objek, dan beberapa topik lanjutan dalam pengaturcaraan berorientasikan objek. Kami juga membantu PHP-CPP memperbaiki.Apa lagi yang boleh kita lakukan dengan PHP-CPP? Saya akan memetik beberapa baris komunikasi e-mel yang saya terima dari Emiel Bruijntjes (pengarang bersama PHP-CPP):
Jika anda sedang menjalankan projek dan mempunyai satu atau lebih keperluan berikut, perpustakaan PHP-CPP adalah ideal: -Anda sedang menjalankan struktur/algoritma perisian/data dan anda ingin memastikan bahawa perisian anda juga boleh digunakan dalam projek bukan PHP pada masa akan datang. - Anda mahu menggunakan alat atau perpustakaan yang belum tersedia sebagai lanjutan PHP. -Anda mahukan prestasi yang lebih baik dari kod C/C anda (berbanding dengan PHP), tetapi anda juga ingin membina kod berstruktur, berorientasikan objek untuk pemahaman dan penyelenggaraan yang mudah oleh pemaju/rakan sekerja lain.Kemungkinan besar: kerangka kerja (seperti Phalcon), bahasa templat (seperti smarty atau ranting), dan sebagainya.
Sila tinggalkan komen dan pendapat anda dan beritahu kami apa yang telah anda lakukan dengan perpustakaan ini!
Soalan Lazim untuk membangunkan sambungan PHP dengan C
Terdapat banyak manfaat untuk membangunkan sambungan PHP menggunakan C. Pertama, ia membolehkan anda memanfaatkan kuasa dan fleksibiliti C dalam aplikasi PHP anda. Ini dapat meningkatkan prestasi, terutamanya dalam tugas-tugas yang berintensifkan. Kedua, ia menyediakan cara untuk menggunakan semula kod C yang sedia ada dalam persekitaran PHP, yang dapat menjimatkan banyak masa dan usaha pembangunan. Akhirnya, ia membolehkan anda membuat sambungan PHP tersuai yang memanjangkan fungsi PHP dan menyediakan ciri -ciri yang tidak terdapat di perpustakaan PHP standard.
Untuk mula menggunakan C untuk pembangunan lanjutan PHP, anda perlu mempunyai pemahaman asas mengenai bahasa pengaturcaraan PHP dan C. Anda juga perlu memasang persekitaran pembangunan PHP dan pengkompil C. Selepas memasang prasyarat ini, anda boleh mula menulis sambungan PHP di C. Terdapat banyak sumber yang tersedia dalam talian, termasuk tutorial dan kod sampel untuk membimbing anda melalui proses ini.
php-cpp adalah perpustakaan untuk membangunkan sambungan PHP menggunakan C. Ia menyediakan satu set kelas dan kaedah C, memudahkan proses menulis sambungan PHP. Dengan PHP-CPP, anda boleh menulis sambungan PHP dengan cara yang lebih semula jadi dan intuitif, menggunakan sintaks dan konsep C yang biasa. Ini boleh menjadikan proses pembangunan lebih cekap dan mengurangkan kesilapan.
Ya, PHP-CPP adalah perisian sumber terbuka yang boleh digunakan dalam projek peribadi dan komersial. Walau bagaimanapun, adalah penting untuk memahami bahawa walaupun perpustakaan itu sendiri adalah percuma, anda mungkin perlu melabur masa dan sumber dalam mempelajari cara menggunakannya dengan berkesan dan mengekalkan sambungan PHP anda.
Beberapa cabaran umum dalam pembangunan lanjutan PHP menggunakan C termasuk pengurusan memori yang betul, pengendalian kesilapan dan pengecualian, dan antara muka antara PHP dan C. Cabaran-cabaran ini dapat diatasi dengan mendapat gambaran tentang PHP dan C, menggunakan amalan pengaturcaraan yang baik, dan memanfaatkan ciri dan alat yang disediakan oleh PHP-CPP.
Sambungan PHP yang ditulis dalam C boleh disahpepijat menggunakan alat debugging standard C. Di samping itu, PHP-CPP menyediakan beberapa ciri yang boleh membantu debugging, seperti pengendalian pengecualian dan pelaporan ralat.
Ya, PHP-CPP boleh digunakan dengan perpustakaan C yang lain. Ini membolehkan anda memanfaatkan pelbagai ciri C dalam sambungan PHP.
Anda boleh meningkatkan prestasi sambungan PHP dengan menggunakan algoritma yang cekap dan struktur data, meminimumkan penggunaan memori, dan mengoptimumkan kod C. Di samping itu, PHP-CPP menyediakan beberapa ciri yang dapat membantu meningkatkan prestasi, seperti akses langsung kepada pembolehubah dan fungsi PHP.
Ya, projek PHP-CPP adalah sumber terbuka dan sumbangan masyarakat dialu-alukan. Anda boleh menyumbang kod anda dengan melaporkan pepijat, mencadangkan ciri -ciri baru, atau menyerahkan patch.
Terdapat banyak sumber yang tersedia dalam talian untuk belajar menggunakan C untuk pembangunan lanjutan PHP. Sumber -sumber ini termasuk tutorial, kod sampel, dokumentasi, dan forum. Di samping itu, laman web PHP-CPP menyediakan sejumlah besar maklumat dan sumber penggunaan perpustakaan.
Atas ialah kandungan terperinci Membangunkan sambungan PHP dengan C dan PHP-CPP: Lanjutan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!