Inilah rupa PHP moden

Tajuknya sungguh megah, bukan? Ya, betul. Walaupun saya telah bekerja dengan PHP selama bertahun-tahun, bagaimana saya dapat menyatakan apakah amalan dan alat terbaik untuk pekerjaan itu? Saya tidak dapat, tetapi saya akan melakukannya.

Saya melihat perubahan nyata dalam cara pemaju menjalankan tugas mereka dengan PHP, bukan hanya bahasa berubah secara drastik menjadi lebih matang dan mantap dengan versi dan penambahbaikan baru, tetapi seluruh ekosistem di sekitarnya juga berubah.

Alat, perpustakaan, kerangka kerja dan artikel baru sedang dibuat, corak ditakrifkan untuk menjadikan kod lebih elegan dan mudah difahami. Beberapa orang memikirkan cara untuk menjadikan karya (dan kehidupan anda sebagai pembangun) lebih produktif, bersih dan menyeronokkan.

Saya bukan pengguna awal tren baru, sebenarnya, saya hanya menggunakan alat baru apabila saya yakin ada komuniti di belakangnya dan saya benar-benar fikir ia akan meningkatkan kerja saya. Yang selalu saya lakukan ialah mencuba menulis kod saya mengikut amalan terbaik.

Oleh kerana itu, saya memerlukan masa untuk mula menggunakan perkara seperti Composer dan PHPUnit. Kira-kira setahun yang lalu, lebih kurang, saya telah membuka hati saya untuk semua perkara baru yang berkilat itu.

PSR mendahului, kemudian Komposer, PHPUnit, Travis-ci dan beberapa perpustakaan lain dan alat yang menakjubkan. Saya bahkan menggunakan IDE sekarang (Vim FTW, tetapi PHPStorm dengan integrasi XDebug adalah suatu keharusan untuk aliran kerja yang waras)!

Apa itu moden?

Terdapat banyak artikel di seluruh web tentang betapa mengerikannya PHP, bagaimana kehidupan anda akan mengerikan sekiranya anda terpaksa menggunakan kod PHP, bagaimana bahasanya jelek dan apa sahaja yang anda fikirkan!

Sekiranya anda akan bekerja dengan kod warisan, mungkin hidup anda tidak akan begitu baik, tetapi jika anda berpeluang mengerjakan projek baru dan dapat menggunakan semua alat baru, anda akan melihat PHP baru ini Saya akan bercakap tentang.

Saya mempunyai beberapa masalah bekerja dengan PHP setiap hari, tetapi seseorang tidak dapat menutup mata terhadap perubahan yang berlaku dalam bahasa, masyarakat dan ekosistem. Terdapat jalan panjang di hadapan, tetapi keadaan semakin matang di tanah PHP.

Saya mula membuat SDK untuk API dalaman di syarikat tempat saya bekerja, sama seperti projek haiwan kesayangan, dan memutuskan untuk mengikuti amalan terbaik. Sebahagian besar dari mereka sudah saya lakukan, tetapi saya telah membuat sedikit perubahan dalam cara saya melakukan beberapa perkara. Perubahan dan apa yang saya pelajari pada tahun lalu adalah tajuk artikel ini dan apa yang saya panggil PHP Moden.

Mari mulakan dengan aliran kerja

Seperti yang saya katakan, saya adalah pendatang baru dalam hal IDE ini, tetapi cinta pada pandangan pertama. PHPStorm adalah perisian yang hebat. Ini adalah IDE pertama dan satu-satunya saya. Itu adalah percubaan saya dan saya tidak perlu mencuba yang lain.

Integrasi dengan XDebug sempurna, resolusi ruang nama PHP, integrasi komposer, integrasi git, auto-lengkap, penjanaan kod, pemfaktoran semula kod. Saya boleh terus berjalan dan terus.

Saya tidak fikir anda mesti menggunakan IDE, sebenarnya, perkara ini benar-benar peribadi. Anda harus menggunakan apa sahaja yang sesuai dengan keperluan anda - Vim, Atom, Emacs, Bracket, NetBeans, PHPStorm, Eclipse, apa sahaja. Dua perkara penting di sini ialah produktiviti dan ergonomi. Editor IDE / teks anda mesti ada untuk menolong anda.

Walau bagaimanapun, bagi saya, perkara yang baik adalah integrasi debugger. Untuk menulis kod untuk projek besar (sebenarnya untuk yang kecil) anda harus menggunakan debugger yang baik. Mari lupakan var_dumps dan print_rs tersebut. Anda perlu mencungkil pemboleh ubah tersebut semasa menjalankan, menganalisis jejak timbunan, menetapkan titik putus. Perkara-perkara ini penting dan menjadikan pembangunan dan pemfaktoran semula lebih mudah.

Saya tidak tahu sama ada terdapat pilihan lain di sini, XDebug mempunyai semua yang anda perlukan. Adakah anda mempunyai beberapa minit? Sekiranya anda belum melakukannya, luangkan masa untuk menyiapkan XDebug dan satukannya ke IDE atau editor teks anda. Mula nyahpepijat kod anda menggunakan alat yang betul.

Alat lain yang saya ingin menarik perhatian anda ialah GitHub. Seluruh artikel lain boleh ditulis mengenai seberapa baik Git dan GitHub dan mengapa anda mesti mula menyimpan kod anda di bawah sistem versi. Tetapi saya ingin menunjukkan alasan lain kepada anda.

Fokus di sini adalah integrasi.

Terdapat beberapa alat yang bergabung dengan GitHub dan anda harus mula menggunakannya. Alat tersebut dapat menghasilkan metrik, menjalankan ujian, menjalankan tugas untuk anda semasa proses integrasi berterusan dan melakukan pelbagai perkara dalam aliran kerja anda. Integrasi adalah alasan yang baik untuk anda mula menggunakan GitHub, semua yang lain tunduk pada saat yang lain.

Pengurusan ketergantungan

Titik lain dalam ekosistem PHP moden ini adalah pengurusan kebergantungan, dan Komposer adalah alat untuk pekerjaan itu.

Komposer berusia 5 tahun, tetapi menurut saya pengangkatan secara besar-besaran berlaku beberapa tahun yang lalu. Mungkin kerana saya bukan pengguna awal atau mungkin kerana pemaju PHP enggan berubah.

Alat ini menyediakan bahagian depan untuk Packagist, yang merupakan repositori pakej PHP yang terdiri daripada perpustakaan, projek dan alat PHP, yang kod sumbernya disimpan di Github (atau tempat lain seperti BitBucket).

Semua perpustakaan yang saya bicarakan dalam artikel ini, dan mungkin salah satu projek haiwan kesayangan anda, boleh ditambahkan ke projek anda dengan mudah

$ composer require package_vendor/package_name

Sekiranya anda tidak mengetahui vendor pakej, anda boleh searchmendapatkan pakej untuk mencari dan memasang yang betul.

$ composer search package_name

Komposer akan menjadi alat yang hebat jika ia hanya berfungsi, menguruskan kebergantungan, tetapi lebih banyak lagi. Luangkan masa untuk memasang Composer dan baca dokumentasinya.

Antara muka baris arahan dilakukan dengan betul

Saya sangat suka mencuba idea dengan cepat menggunakan antara muka CLI. Bagi saya, salah satu alat REPL yang paling hebat adalah IPython. Ini membantu anda melengkapkan kod anda secara automatik, membiarkan anda menentukan fungsi dengan mudah, memudahkan akses ke dokumentasi dan beberapa ciri lain yang menakjubkan. Kelemahan bagi kami, alat ini adalah untuk Python, bukan PHP.

Di dunia PHP kita memiliki sesuatu yang disebut "mod interaktif" yang dapat diakses melalui terminal, hanya dengan menaip

$ php -aInteractive mode enabled
php >

Pada ketika ini, anda berada dalam mod interaktif dan boleh mula menguji sesuatu. Ia berfungsi, tetapi alat ini terlalu tidak disengajakan. Saya telah mencubanya beberapa kali tetapi, kerana saya tahu apa yang dapat dilakukan oleh IPython, saya tidak dapat terus menggunakannya.

Nasib baik kami, ada CLI baru (antara muka baris arahan) yang hebat di blok itu dan namanya Psysh. Psysh adalah alat yang luar biasa, penuh dengan ciri menarik dan boleh dipasang di seluruh dunia atau setiap projek menggunakan komposer.

The nicest Psysh feature for me is inline documentation. Accessing the doc for a PHP function without heading over to Php.net is great. The downside is that you need to do few things before it is fully functional.

After installing it, type the following commands (I’m using Debian here, this may not work for everyone) in order to get it working properly

$ apt-get install php7.1-sqlite3$ mkdir /usr/local/share/psysh$ wget //psysh.org/manual/en/php_manual.sqlite -o /usr/local/share/psysh/php_manual.sqlite

The first command is not mandatory and if you have the Sqlite already installed you can skip this step. The second command creates the directory to store the documentation and the third line downloads and save the doc into the previously created directory. Remember, all these commands must run as root.

Now you have this

Head to Psysh and learn more about this awesome tool.

You should start testing

Ini adalah mantera yang saya katakan pada diri saya setiap hari. Seperti banyak orang, saya tidak menguji kod saya seperti yang dicadangkan oleh TDD. Saya sedang menjalani ujian sekarang dan telah melakukannya sejak setengah tahun yang lalu, dan masih ada jalan yang panjang di hadapan.

Saya memutuskan untuk belajar mengenai ujian ketika bekerja dengan projek warisan yang kompleks. Kodnya sangat rapuh dan kaku sehingga bila-bila masa kita menambahkan beberapa kod ia akan merosakkan sesuatu. Ciri baru? Laksanakan dan hancurkan sesuatu! Memperbaiki pepijat? Buat yang lain.

Itu adalah masalah besar, yang saya bincangkan dalam artikel lain, dan membuat saya mula memberi peluang ujian.

Alat pertama yang saya paparkan ialah PHPUnit. Seperti yang dinyatakan di laman web rasmi

PHPUnit adalah kerangka ujian berorientasikan pengaturcara untuk PHP.

Ini adalah contoh seni bina xUnit untuk kerangka pengujian unit.

So, PHPUnit is a framework for helping you create tests for your projects, unitary tests. It gives you several functions to test the outcome of your code and generate a nice output with the result from those tests.

Since I started thinking about tests, reading and talking to people about it, I’ve discovered another great tool, which complements the work you’ve put in those unitary tests, it is calle Behat, which is a BDD framework for PHP.

BDD (Behavior-Driven Development) is a development process which came from TDD (Test-Driven Development). Those acronyms are not important now, what is important is that you can specify your tests using a more natural language, a language that non-technical folks can understand.

This language is called Gherkin and is used to describe the expected behavior being tested. A test description, using Gherkin, looks like this

Behind those lines there is PHP code that is called whenever there is a match between a line and a regex pattern specified in the PhpDoc of the method. This code implements those steps and what a real user would do, using your SDK, application or web system.

The workflow with Behat is so smooth. After everything properly configured, you start writing all possible scenarios for testing a feature. The first time you run Behat, it gives you all the method templates you should add to your PHP Context class in order to implement each step in a scenario.

After that, you start writing the actual code for each step and keep repeating this cycle.

  • Implement PHP code for a step
  • Run tests
  • If everything is fine, write PHP code for another step
  • If something is broken, fix it

After half an hour of configuring and reading documentation, you are prepared to use Behat, you’ll see that in the end it is all PHP code and you already know how to program with it.

Continuous Integration

Continuous integration (CI) is a process - a way to do something, and this thing, for us software engineers, is creating software.

In plain English, it is the act of incorporating small chunks of code constantly (maybe several times a day) into your code base. Code which has been tested and did not break anything. CI helps you automate the building, testing and deployment of your applications.

With a few clicks you can integrate your GitHub project with Travis CI and every push to your repository will run those tests you created with PHPUnit and Behat, telling you whether the the last feature you’ve implemented is ready, or not, to be merged. Besides that, you can use Travis CI to deploy your code to production and staging.

Having a nice pipeline of work with a well defined process is great and Travis CI can help you with this job. Follow this nice Getting started and discover how interesting it is to think about the process of software development, not just the code itself.

Adhere to PSR-1 and PSR-2

If you don’t know what PSR is, you should. Actually, PSR stands for PHP Standard Recommendations and is proposed by PHP-FIG (PHP Framework Interop Group), a consortium formed by members from the biggest PHP projects, frameworks and CMSs, which are thinking about the future of the language, ecosystem and discussing standards to be followed.

For a long time, PHP had no coding style. I’m not that old, but every time I looked into someone’s project or library, it was following a different style. Sometimes the bracket was left in one position, sometimes it was put in the next line, different approaches were used to deal with long lines and every other combination of style and preference you could think of. It was a mess.

PHP-FIG does many other jobs, but by proposing a single unity of code, they are saying “Let’s stop worrying about code style, let’s everyone follow a standard and start thinking about creating great software”. Now, whenever you take a look at someone’s code you just worry about understanding how it works, not blaming the format, the structure.

There are, until the end of this article, 9 accepted PSRs proposing common solutions for common problems. But if you don’t know anything about those standards, start with the PSR-1 and PSR-2.

These standards propose the modern PHP coding style. Make sure you read them before start using them. Don’t think you’ll remember all of them when coding, it is a process, but to make you sure, there are tools to help you with it.

PHP CodeSniffer is a tool you can find on Packagist that you can install with Composer. I don’t think the repository name was the best choice, because it ships two different tools, phpcs and phpcbf.

Phpcs is the code sniffer, it will scan your entire code, looking for parts that are not following the configured coding standard.

You can use several coding standards with phpcs and you can even create your own. At the end of the code scan, phpcs shows you a list of the pieces of code not following the standard. It is great.

Now, how to change everything which is wrong? You could open every file, change the code, run phpcs again, see the error not being shown, and repeat the process. It’ll be extra boring.

To solve this problem, PHP CodeSniffer came with another tool, called phpcbf, or PHP Code Beautifier. You run phpcbf, following the same rule set and, voilá, it fixes everything for you, or it tries to do its best without breaking your code.

Try to create the habit of running phpcs and phpcbf before pushing any changes in your code to the repository, this will ensure that all of your code adhere to the standards and if someone likes your tool/project and wants to contribute, they will have no problem reading it.

Frameworks

I’m not going to dedicate too much time discussing frameworks. There are several good ones out there, each one with its ups and downs. Personally, I prefer not to use those big frameworks, with everything inside. I like the idea that you must use just what you need.

If you need a HTTP client, use Guzzle. If you need a template engine, use Twig. If you need a router, find a good component which suits your needs and use it. Glue these components together and create your application.

Symfony is doing a great job towards this concept. You can use the entire framework for a project, or you can just take whatever you want and use it. Simple as that.

However, whenever I need a framework to write an application, I chose one of the so called microframeworks. They are really small, offer just the basics and are easy to customize and easier to make them follow your project structure.

My microframework of choice is Slimframework and I think you should read about it. It is simple for doing small projects, but it gets a bit more complex for bigger ones.

By the way, and this is for those who are starting with programming, I really think that before adopting a framework and dying for it, you should try to create your own. This will give you the understanding of the whole mechanism and ease the adoption of a big one.

The Modern PHP Toolset

Let’s finish this article with a list of links. To me, these components, tools and libraries represent a great deal of what Modern PHP is:

  • Slimframework: a nice and cool microframework
  • Symfony: a bigger framework which is filled with great and reusable components
  • Guzzle: a simple and easy to use HTTP client
  • PHPUnit: a framework for unitary testing
  • Behat: a framework for Behavior-Driven Development
  • PHPCS/CBF: code sniffer and code beautifier
  • Faker: fake data generator
  • Psysh: a runtime developer console (CLI) full of amazing features
  • Composer: dependency management and other useful features
  • Packagist: package repository
  • Twig: template engine

The title was really pretentious, I know. What I really wanted to show here is that PHP is evolving and the ecosystem is evolving at the same (maybe faster) pace.