anda kesal. Setiap kali anda ingin mencuba nilai pulangan atau tugasan yang berubah -ubah, anda perlu menukar kod sumber anda, laksanakan permohonan anda, dan lihat hasilnya ... pada akhirnya, anda tidak pasti sama ada anda telah mengeluarkan semua var_dumps dari kod. Adakah keadaan ini biasa dengan anda?
Takeaways Key
Malangnya, shell interaktif bukan repl kerana ia tidak mempunyai "p" (cetak). Saya terpaksa melaksanakan kenyataan Echo untuk melihat kandungan $ a. Dalam repl yang benar, kami akan melihatnya sebaik sahaja memberikan nilai kepadanya.
php -a Interactive shell php > $a = 'Hello world!'; php > echo $a; Hello world! php >
Komposer
Muat turun langsung (Linux/Mac)
composer g require psy/psysh:~0.1 psysh
Selain itu, anda boleh memasukkannya ke setiap projek dengan komposer seperti yang anda lihat kemudian dalam artikel ini.
wget psysh.org/psysh chmod +x psysh ./psysh
bantuan utama akan menjadi kawan baik anda. Itulah yang akan memberi anda pelbagai arahan dan penjelasan mereka:
./psysh Psy Shell v0.1.11 (PHP 5.5.8 — cli) by Justin Hileman >>>
pada dasarnya, apa yang boleh dilakukan oleh repl adalah:
>>> help help Show a list of commands. Type `help [foo]` for information about [foo]. Aliases: ? ls List local, instance or class variables, methods and constants. Aliases: list, dir dump Dump an object or primitive. doc Read the documentation for an object, class, constant, method or property. Aliases: rtfm, man show Show the code for an object, class, constant, method or property. wtf Show the backtrace of the most recent exception. Aliases: last-exception, wtf? trace Show the current call stack. buffer Show (or clear) the contents of the code input buffer. Aliases: buf clear Clear the Psy Shell screen. history Show the Psy Shell history. exit End the current session and return to caller. Aliases: quit, q
>>> help ls Usage: ls [--vars] [-c|--constants] [-f|--functions] [-k|--classes] [-I|--interfaces] [-t|--traits] [-p|--properties] [-m|--methods] [-G|--grep="..."] [-i|--insensitive] [-v|--invert] [-g|--globals] [-n|--internal] [-u|--user] [-C|-- category="..."] [-a|--all] [-l|--long] [target] Aliases: list, dir Arguments: target A target class or object to list. Options: --vars Display variables. --constants (-c) Display defined constants. --functions (-f) Display defined functions. --classes (-k) Display declared classes. --interfaces (-I) Display declared interfaces. --traits (-t) Display declared traits. --properties (-p) Display class or object properties (public properties by default). --methods (-m) Display class or object methods (public methods by default). --grep (-G) Limit to items matching the given pattern (string or regex). --insensitive (-i) Case-insensitive search (requires --grep). --invert (-v) Inverted search (requires --grep). --globals (-g) Include global variables. --internal (-n) Limit to internal functions and classes. --user (-u) Limit to user-defined constants, functions and classes. --category (-C) Limit to constants in a specific category (e.g. "date"). --all (-a) Include private and protected methods and properties. --long (-l) List in long format: includes class names and method signatures. Help: List variables, constants, classes, interfaces, traits, functions, methods, and properties. Called without options, this will return a list of variables currently in scope. If a target object is provided, list properties, constants and methods of that target. If a class, interface or trait name is passed instead, list constants and methods on that class. e.g. >>> ls >>> ls $foo >>> ls -k --grep mongo -i >>> ls -al ReflectionClass >>> ls --constants --category date >>> ls -l --functions --grep /^array_.*/ >>>
Sila ambil perhatian bahawa jika kita membandingkan Psysh terhadap konsol interaktif PHP, Psysh mencetak nilai $ A sebaik sahaja ia diberikan.
Contoh yang lebih kompleks boleh seperti berikut:
php -a Interactive shell php > $a = 'Hello world!'; php > echo $a; Hello world! php >
Saya menentukan fungsi berkata () dan memohonnya. Kedua -dua null yang anda lihat adalah kerana definisi fungsi atau pelaksanaannya tidak mengembalikan nilai (fungsi bergema nilai). Di samping itu, sambil menentukan fungsi, prompt berubah dari >>> ke ....
Bolehkah kita menentukan kelas dan memberi instantiate?
composer g require psy/psysh:~0.1 psysh
Apabila saya instantiated foo, pembina mengembalikan rujukan kepada objek tersebut. Inilah sebabnya Psysh Printed
wget psysh.org/psysh chmod +x psysh ./psysh
Jika dengan apa -apa peluang anda terlupa kaedah mana yang ditakrifkan oleh kelas, anda kini mempunyai jawapannya. Pernahkah anda menggunakan antara muka baris arahan Linux OS atau Mac? Kemudian anda mungkin biasa dengan arahan LS. Ingat pilihan -la?
./psysh Psy Shell v0.1.11 (PHP 5.5.8 — cli) by Justin Hileman >>>
Sweet, bukan?
kuasa sebenar psysh bersinar apabila diintegrasikan dengan aplikasi web, jadi mari kita bina satu.
Saya akan melaksanakan aplikasi cepat untuk mempamerkan corak reka bentuk penghias. Rajah kelas UML corak sedemikian adalah seperti berikut:
Jangan bimbang jika anda tidak tahu banyak tentang UML atau corak reka bentuk, pemahamannya tidak diperlukan untuk artikel ini.
Juga untuk projek ini, saya membuat satu set kes ujian. Kes -kes ujian itu boleh dijalankan oleh PHPUnit. Sekali lagi, anda tidak perlu mengenali ujian unit untuk memahami artikel ini.
Kod sumber lengkap untuk aplikasi kecil ini boleh didapati di https://github.com/sitePoint-examples/psysh
Pertama sekali, mari kita tentukan fail komposer.json kami untuk mengisytiharkan kebergantungan pada psysh:
>>> help help Show a list of commands. Type `help [foo]` for information about [foo]. Aliases: ? ls List local, instance or class variables, methods and constants. Aliases: list, dir dump Dump an object or primitive. doc Read the documentation for an object, class, constant, method or property. Aliases: rtfm, man show Show the code for an object, class, constant, method or property. wtf Show the backtrace of the most recent exception. Aliases: last-exception, wtf? trace Show the current call stack. buffer Show (or clear) the contents of the code input buffer. Aliases: buf clear Clear the Psy Shell screen. history Show the Psy Shell history. exit End the current session and return to caller. Aliases: quit, q
selepas komposer memasang, anda harus baik untuk pergi.
sila lihat kod sumber berikut dari fail awam/decorator.php. Ia akan meneliti objek SimpleWindow, DihiasiWindow, dan TitledWindow untuk mempamerkan corak penghias:
>>> help ls Usage: ls [--vars] [-c|--constants] [-f|--functions] [-k|--classes] [-I|--interfaces] [-t|--traits] [-p|--properties] [-m|--methods] [-G|--grep="..."] [-i|--insensitive] [-v|--invert] [-g|--globals] [-n|--internal] [-u|--user] [-C|-- category="..."] [-a|--all] [-l|--long] [target] Aliases: list, dir Arguments: target A target class or object to list. Options: --vars Display variables. --constants (-c) Display defined constants. --functions (-f) Display defined functions. --classes (-k) Display declared classes. --interfaces (-I) Display declared interfaces. --traits (-t) Display declared traits. --properties (-p) Display class or object properties (public properties by default). --methods (-m) Display class or object methods (public methods by default). --grep (-G) Limit to items matching the given pattern (string or regex). --insensitive (-i) Case-insensitive search (requires --grep). --invert (-v) Inverted search (requires --grep). --globals (-g) Include global variables. --internal (-n) Limit to internal functions and classes. --user (-u) Limit to user-defined constants, functions and classes. --category (-C) Limit to constants in a specific category (e.g. "date"). --all (-a) Include private and protected methods and properties. --long (-l) List in long format: includes class names and method signatures. Help: List variables, constants, classes, interfaces, traits, functions, methods, and properties. Called without options, this will return a list of variables currently in scope. If a target object is provided, list properties, constants and methods of that target. If a class, interface or trait name is passed instead, list constants and methods on that class. e.g. >>> ls >>> ls $foo >>> ls -k --grep mongo -i >>> ls -al ReflectionClass >>> ls --constants --category date >>> ls -l --functions --grep /^array_.*/ >>>
kita boleh melaksanakan kod melalui CLI PHP (antara muka baris perintah) atau melalui webserver jika seseorang dikonfigurasi. Kami juga boleh menggunakan pelayan web dalaman PHP.
Pelaksanaan kod di atas melalui antara muka baris arahan akan kelihatan seperti ini:
<span>>>> $a = 'hello'; </span><span>=> "hello" </span><span>>>></span>
Bagaimana kita boleh berinteraksi dengan psysh? Hanya tambah psyshell :: debug (get_defined_vars ()); Di mana sahaja di kod di mana anda ingin menyahpepijat permohonan anda, biasanya di mana anda akan memasukkan pernyataan var_dump ():
>>> function say($a) { ... echo $a; ... } => null >>> say('hello'); hello => null >>>
Selepas menyimpan fail, kami akan mendapat output berikut:
>>> class Foo ... { ... protected $a; ... ... public function setA($a) { ... $this->a = $a; ... } ... ... public function getA() { ... return $this->a; ... } ... } => null >>> $foo = new Foo(); => <Foo #000000001dce50dd000000002dda326e> {} >>> $foo->setA('hello'); => null >>> $foo->getA(); => "hello" >>>
Pelaksanaan skrip akan digantung, dan kami kini mempunyai petikan Psysh untuk dimainkan. Saya lulus get_defined_vars () sebagai parameter kepada psyshell :: debug () jadi saya mempunyai akses kepada semua pembolehubah yang ditetapkan di dalam shell:
>>> ls $foo Class Methods: getA, setA >>>
mari kita periksa pembolehubah tetingkap $:
php -a Interactive shell php > $a = 'Hello world!'; php > echo $a; Hello world! php >
sesuatu yang bagus tentang mempunyai psysh di dalam aplikasi adalah bahawa kita boleh memeriksa kod sumber objek instantiated.
composer g require psy/psysh:~0.1 psysh
So, $ Window adalah contoh SimpleWindow, yang melaksanakan antara muka tetingkap ... Saya tertanya -tanya apa kod sumber untuk antara muka tetingkap kelihatan seperti ...
wget psysh.org/psysh chmod +x psysh ./psysh
Kenapa SimpleWindow dan HiamedWindow mempunyai output yang sama? Mari kita periksa objek $ dihiasiWindow.
./psysh Psy Shell v0.1.11 (PHP 5.5.8 — cli) by Justin Hileman >>>
Objek ini adalah "lebih berat" daripada SimpleWindow, jadi kod sumber mungkin panjang ... mari kita lihat kod sumber untuk kaedah render () sahaja:
>>> help help Show a list of commands. Type `help [foo]` for information about [foo]. Aliases: ? ls List local, instance or class variables, methods and constants. Aliases: list, dir dump Dump an object or primitive. doc Read the documentation for an object, class, constant, method or property. Aliases: rtfm, man show Show the code for an object, class, constant, method or property. wtf Show the backtrace of the most recent exception. Aliases: last-exception, wtf? trace Show the current call stack. buffer Show (or clear) the contents of the code input buffer. Aliases: buf clear Clear the Psy Shell screen. history Show the Psy Shell history. exit End the current session and return to caller. Aliases: quit, q
Kaedah getWindowReference () dipanggil, dan kemudian ia mengembalikan hasil dari kaedah render (). Mari kita periksa sumber getWindowReference ():
>>> help ls Usage: ls [--vars] [-c|--constants] [-f|--functions] [-k|--classes] [-I|--interfaces] [-t|--traits] [-p|--properties] [-m|--methods] [-G|--grep="..."] [-i|--insensitive] [-v|--invert] [-g|--globals] [-n|--internal] [-u|--user] [-C|-- category="..."] [-a|--all] [-l|--long] [target] Aliases: list, dir Arguments: target A target class or object to list. Options: --vars Display variables. --constants (-c) Display defined constants. --functions (-f) Display defined functions. --classes (-k) Display declared classes. --interfaces (-I) Display declared interfaces. --traits (-t) Display declared traits. --properties (-p) Display class or object properties (public properties by default). --methods (-m) Display class or object methods (public methods by default). --grep (-G) Limit to items matching the given pattern (string or regex). --insensitive (-i) Case-insensitive search (requires --grep). --invert (-v) Inverted search (requires --grep). --globals (-g) Include global variables. --internal (-n) Limit to internal functions and classes. --user (-u) Limit to user-defined constants, functions and classes. --category (-C) Limit to constants in a specific category (e.g. "date"). --all (-a) Include private and protected methods and properties. --long (-l) List in long format: includes class names and method signatures. Help: List variables, constants, classes, interfaces, traits, functions, methods, and properties. Called without options, this will return a list of variables currently in scope. If a target object is provided, list properties, constants and methods of that target. If a class, interface or trait name is passed instead, list constants and methods on that class. e.g. >>> ls >>> ls $foo >>> ls -k --grep mongo -i >>> ls -al ReflectionClass >>> ls --constants --category date >>> ls -l --functions --grep /^array_.*/ >>>
Kaedah ini mengembalikan harta WindowReference Object, dan seperti yang kita lihat dari perintah LS -AL di atas, ia adalah contoh acmepatternsdecoratorsimplewindow. Sudah tentu, kita hanya dapat melihat bagaimana DihiasiWindow :: __ membina () berfungsi, tetapi ini adalah cara lain yang dapat kita periksa.
Malangnya, debugging melalui webserver seperti Apache tidak disokong. Walau bagaimanapun, kami boleh debug aplikasi kami menggunakan pelayan tertanam PHP:
<span>>>> $a = 'hello'; </span><span>=> "hello" </span><span>>>></span>
Pelayan pembangunan kini mendengar sambungan pada port 8080, jadi sebaik sahaja kami meminta fail penghias.php melalui pelayan web ini (https: // localhost: 8080/decorator.php), kita harus melihat perkara berikut:
>>> function say($a) { ... echo $a; ... } => null >>> say('hello'); hello => null >>>
kita boleh mula bermain dengan psysh sama seperti yang kita lakukan dengan cli
>>> class Foo ... { ... protected $a; ... ... public function setA($a) { ... $this->a = $a; ... } ... ... public function getA() { ... return $this->a; ... } ... } => null >>> $foo = new Foo(); => <Foo #000000001dce50dd000000002dda326e> {} >>> $foo->setA('hello'); => null >>> $foo->getA(); => "hello" >>>
Sebagai pemaju yang baik, anda harus menulis ujian unit untuk kod anda sebagai bukti bahawa ia berfungsi seperti yang diharapkan. Dalam fail projek, anda akan menemui folder ujian, dan jika anda memasang PHPUnit, anda boleh menjalankan ujian di dalamnya.
>>> ls $foo Class Methods: getA, setA >>>
Walaupun kod itu kelihatan berjalan dengan sempurna, ujian gagal. Kita boleh meneliti lebih lanjut dengan menjalankan hanya ujian yang gagal:
>>> ls -la $foo Class Properties: $a "hello" Class Methods: getA public function getA() setA public function setA($a)
Kami mempunyai ujian, fail dan garis di mana ralat dijana. Mari kita lihat di TitedWindowTest.php
{ "name": "example/psysh", "authors": [ { "name": "John Doe", "email": "john@doe.tst" } ], "require": { "psy/psysh": "~0.1" }, "autoload": { "psr-4": {"Acme\": "src/"} } }
Jika anda tidak dikenali dengan phpunit, jangan terlalu banyak memberi perhatian kepada kod tersebut. Singkatnya, saya menubuhkan segala -galanya untuk menguji kaedah TitledWindow :: addtitle (), dan mengharapkan untuk menerima nilai yang tidak kosong.
Jadi, bagaimana kita menggunakan psysh untuk memeriksa apa yang sedang berlaku? Hanya tambahkan kaedah shell :: debug () seperti yang kita lakukan sebelum ini.
<span><span><?php </span></span><span><span>chdir(dirname(__DIR__)); </span></span><span> </span><span><span>require_once('vendor/autoload.php'); </span></span><span> </span><span><span>use Acme<span>\Patterns\Decorator\SimpleWindow</span>; </span></span><span><span>use Acme<span>\Patterns\Decorator\DecoratedWindow</span>; </span></span><span><span>use Acme<span>\Patterns\Decorator\TitledWindow</span>; </span></span><span> </span><span><span>echo PHP_EOL . 'Simple Window' . PHP_EOL; </span></span><span> </span><span><span>$window = new SimpleWindow(); </span></span><span> </span><span><span>echo $window->render(); </span></span><span> </span><span><span>echo PHP_EOL . 'Decorated Simple Window' . PHP_EOL; </span></span><span> </span><span><span>$decoratedWindow = new DecoratedWindow($window); </span></span><span> </span><span><span>echo $decoratedWindow->render(); </span></span><span> </span><span><span>echo PHP_EOL . 'Titled Simple Window' . PHP_EOL; </span></span><span> </span><span><span>$titledWindow = new TitledWindow($window); </span></span><span> </span><span><span>echo $titledWindow->render();</span></span>
Kami sudah bersedia untuk batu!
php public/decorator.php Simple Window +-------------+ | | | | | | | | | | +-------------+ Decorated Simple Window +-------------+ | | | | | | | | | | +-------------+ Titled Simple Window +-------------+ |Title | +-------------+ | | | | | | | | | | +-------------+
Jadi dalam $ RS kita harus mempunyai rentetan; Mari kita lihat apa yang kita ada.
<span><span><?php </span></span><span><span>chdir(dirname(__DIR__)); </span></span><span> </span><span><span>require_once('vendor/autoload.php'); </span></span><span> </span><span><span>//... a lot of code here </span></span><span> </span><span><span>$titledWindow = new TitledWindow($window); </span></span><span> </span><span><span>echo $titledWindow->render(); </span></span><span> </span><span><span><span>\Psy\Shell</span>::debug(get_defined_vars()); //we want to debug our application here!</span></span>
nilai null, tidak hairanlah ujian gagal ... mari kita periksa kod sumber TitledWindow :: addtitle (). Jika kita melakukan arahan LS, kita dapat melihat bahawa kita mempunyai kaedah objek yang tersedia melalui objek $ berjudulWindow.
php -a Interactive shell php > $a = 'Hello world!'; php > echo $a; Hello world! php >
Terdapat pepijat. Kaedah ini menggema nilai dan bukannya mengembalikannya. Walaupun permohonan itu seolah -olah berfungsi dengan betul, melalui ujian unit dan psysh kami menemui kecacatan dan kini kami dapat memperbaikinya.
Artikel ini tidak dimaksudkan untuk menjadi lengkap dalam mempamerkan semua Psysh yang berpotensi. Terdapat ciri -ciri sejuk lain (seperti 'Doc') yang anda harus cuba. Psysh sahaja mungkin tidak begitu berguna, tetapi jika digabungkan dengan alat lain dan kuasa debugging anda yang bijak, ia dapat membuktikan menjadi aset yang berharga.
Ya, Psysh boleh sangat berguna untuk ujian unit dalam PHP. Anda boleh menggunakan PSYSH untuk mengamalkan ujian anda secara interaktif, memeriksa pembolehubah dan nyatakan pada bila -bila masa semasa pelaksanaan ujian. Ini amat berguna untuk memahami mengapa ujian gagal.
Psysh dilengkapi dengan banyak ciri canggih yang dapat membantu anda debug kod PHP anda dengan lebih berkesan. Ini termasuk pelaksanaan kod dengan runtime, penyisipan titik koma automatik, sokongan ruang nama, sokongan readline, pengendalian pengecualian, dan banyak lagi. Psysh juga menyokong penyempurnaan tab untuk pembolehubah, fungsi, kelas, dan juga kata kunci terbina dalam PHP. Apabila ralat atau pengecualian berlaku, Psysh akan memaparkan jejak timbunan terperinci, membantu anda memahami dengan tepat di mana dan mengapa ralat berlaku. Anda juga boleh menggunakan arahan WTF untuk memaparkan jejak tumpukan pengecualian terakhir pada bila -bila masa. termasuk Rangka Kerja Laravel, Symfony, dan Zend. Sesetengah rangka kerja, seperti Laravel, walaupun termasuk Psysh keluar dari kotak untuk perintah Tinker mereka. Anda boleh menyumbang kepada projek dengan melaporkan pepijat, mencadangkan ciri, atau mengemukakan permintaan tarik. Sebelum menyumbang, pastikan anda membaca garis panduan penyumbang projek. mengenai psysh. Mereka termasuk dokumentasi terperinci, contoh penggunaan, dan senarai arahan yang ada. Anda juga boleh mencari tutorial dan artikel di pelbagai blog PHP dan pemaju.
Atas ialah kandungan terperinci Debug PHP Interaktif dengan Psysh. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!