هذا ما تبدو عليه PHP الحديثة

العنوان هو حقًا طنانة ، أليس كذلك؟ أجل إنها كذلك. على الرغم من أنني أعمل مع PHP منذ سنوات ، كيف يمكنني تحديد أفضل الممارسات والأدوات للوظيفة؟ لم أستطع ، لكنني سأفعل ذلك.

أرى تغييرًا حقيقيًا في الطريقة التي يقوم بها المطورون بعملهم باستخدام PHP ، ليس فقط أن اللغة تتغير بشكل جذري لتصبح أكثر نضجًا وقوة مع الإصدارات والتحسينات الجديدة ، ولكن النظام البيئي بأكمله من حولها يتغير.

يتم إنشاء أدوات ومكتبات وأطر عمل ومقالات جديدة ، ويتم تحديد الأنماط لجعل التعليمات البرمجية أكثر أناقة وسهولة في الفهم. يفكر العديد من الأشخاص في طرق لجعل العمل (وحياتك كمطور) أكثر إنتاجية ونظافة ومتعة.

أنا لست من أوائل المتبنين للاتجاهات الجديدة ، في الواقع ، أنا فقط أعتمد أداة جديدة عندما أكون متأكدًا من وجود مجتمع وراءها وأعتقد حقًا أنها ستحسن عملي. ما أفعله دائمًا هو محاولة كتابة التعليمات البرمجية الخاصة بي باتباع أفضل الممارسات.

لهذا السبب ، استغرقت وقتًا لبدء استخدام أشياء مثل Composer و PHPUnit. منذ حوالي عام تقريبًا ، فتحت قلبي على كل تلك الأشياء الجديدة اللامعة.

جاء PSR أولاً ، ثم Composer و PHPUnit و Travis-ci والعديد من المكتبات الأخرى والأدوات الرائعة. أنا أستخدم IDE الآن (Vim FTW ، لكن PHPStorm مع تكامل XDebug أمر لا بد منه لسير عمل عاقل)!

ما هو الحديث؟

هناك الكثير من المقالات حول الويب حول مدى فظاعة لغة PHP ، وكيف ستكون حياتك رهيبة إذا كان عليك العمل باستخدام كود PHP ، وكيف أن اللغة قبيحة وأي شيء آخر يخطر ببالك!

إذا كنت ستعمل مع رمز قديم ، فربما لن تكون حياتك جيدة ، ولكن إذا كانت لديك الفرصة للعمل في مشروع جديد وكنت قادرًا على استخدام جميع الأدوات الجديدة ، فسترى PHP الجديد سأتحدث عنه.

لدي العديد من المشاكل في العمل مع PHP بشكل يومي ، ولكن لا يمكن للمرء أن يغض الطرف عن التغييرات التي تحدث في اللغة والمجتمع والنظام البيئي. أمامنا طريق طويل ، لكن الأمور تكبر في أرض PHP.

لقد بدأت في إنشاء SDK لواجهة برمجة تطبيقات داخلية في الشركة التي أعمل بها ، كمشروع حيوان أليف ، وقررت اتباع أفضل الممارسات. كنت أفعل معظمهم بالفعل ، لكنني أجريت بعض التغييرات في الطريقة التي أفعل بها بعض الأشياء. هذه التغييرات وما تعلمته في العام الماضي هي موضوع هذا المقال وما أسميه PHP الحديثة.

لنبدأ بسير العمل

كما قلت ، أنا وافد جديد على هذا الشيء IDE ، لكنه كان حبًا من النظرة الأولى. PHPStorm هو برنامج رائع. إنه IDE الأول والوحيد. لقد كانت محاولتي الأولى ولم أكن بحاجة إلى تجربة أي شيء آخر.

التكامل مع XDebug مثالي ، دقة مساحة اسم PHP ، تكامل الملحن ، تكامل git ، الإكمال التلقائي ، إنشاء الكود ، إعادة بناء الكود. يمكنني الاستمرار في ذلك.

لا أعتقد أنه يجب عليك استخدام IDE ، في الواقع ، هذه النقطة شخصية تمامًا. يجب عليك استخدام كل ما يناسب احتياجاتك - Vim و Atom و Emacs و Bracket و NetBeans و PHPStorm و Eclipse وما إلى ذلك. نقطتان مهمتان هنا هما الإنتاجية وبيئة العمل. يجب أن يكون محرر IDE / النص الخاص بك موجودًا لمساعدتك.

ومع ذلك ، بالنسبة لي ، فإن النقطة المهمة هي تكامل المصحح. لكتابة رمز للمشاريع الكبيرة (في الواقع للمشاريع الصغيرة أيضًا) ، عليك استخدام مصحح أخطاء لائق. دعنا ننسى تلك var_dumps و print_rs. تحتاج إلى وضع هذه المتغيرات في وقت التشغيل ، وتحليل آثار المكدس ، وتعيين نقاط التوقف. هذه الأشياء ضرورية وتجعل التطوير وإعادة البناء أسهل.

لا أعرف حتى ما إذا كانت هناك خيارات أخرى هنا ، XDebug لديه كل ما تحتاجه. هل لديك بضع دقائق؟ إذا لم تكن قد قمت بذلك حتى الآن ، فخذ بعض الوقت لإعداد XDebug ودمجه في IDE أو محرر النصوص. ابدأ في تصحيح أخطاء التعليمات البرمجية الخاصة بك باستخدام الأدوات الصحيحة.

الأداة الأخرى التي أريد لفت انتباهك إليها هي GitHub. يمكن كتابة مقال كامل آخر حول مدى جودة Git و GitHub ولماذا يجب أن تبدأ في الاحتفاظ بالكود الخاص بك ضمن نظام إصدار. لكن أريد أن أوضح لك سببًا آخر.

التركيز هنا هو التكامل.

هناك العديد من الأدوات التي تتكامل مع GitHub ويجب أن تبدأ في استخدامها. يمكن لهذه الأدوات إنشاء مقاييس وتشغيل الاختبارات وتشغيل الوظائف نيابة عنك أثناء عملية التكامل المستمرة والقيام بجميع أنواع الأشياء في سير عملك. يعد الدمج سببًا جيدًا لبدء استخدام GitHub ، فكل الآخرين يخضعون للحظة أخرى.

إدارة التبعية

نقطة أخرى في نظام PHP البيئي الحديث هذا هي إدارة التبعية ، و Composer هو أداة الوظيفة.

الملحن يبلغ من العمر 5 سنوات ، لكن يبدو لي أن التبني الهائل حدث منذ عامين. ربما لأنني لست من أوائل المتبنين أو ربما لأن مطوري PHP يترددون في التغيير.

توفر هذه الأداة واجهة أمامية لـ Packagist ، وهو مستودع لحزم PHP يتكون من مكتبات PHP ومشاريع وأدوات ، يتم تخزين كود المصدر الخاص بها في Github (أو في أماكن أخرى مثل BitBucket).

يمكن إضافة جميع المكتبات التي أتحدث عنها في هذه المقالة ، وربما أحد مشاريعك المفضلة ، إلى مشروعك بكل بساطة

$ composer require package_vendor/package_name

إذا كنت لا تعرف بائع الحزمة ، يمكنك searchالعثور على الحزمة الصحيحة وتثبيتها.

$ composer search package_name

سيكون Composer أداة رائعة إذا قام بهذا العمل فقط ، وإدارة التبعيات ، ولكنه يفعل الكثير. خذ وقتك في تثبيت Composer وقراءة الوثائق.

واجهة سطر الأوامر تتم بشكل صحيح

أحب حقًا تجربة الأفكار بسرعة باستخدام واجهات CLI. بالنسبة لي ، واحدة من أعظم أدوات REPL هي IPython. يساعدك على الإكمال التلقائي للرمز الخاص بك ، ويتيح لك تحديد الوظائف بسهولة ، ويسهل الوصول إلى الوثائق والعديد من الميزات الرائعة الأخرى. الجانب السلبي بالنسبة لنا ، الأداة خاصة ببايثون وليس PHP.

في عالم PHP ، لدينا ما يسمى "الوضع التفاعلي" والذي يمكن الوصول إليه عن طريق Terminal ، فقط من خلال الكتابة

$ php -aInteractive mode enabled
php >

في هذه المرحلة ، أنت في الوضع التفاعلي ويمكنك البدء في اختبار شيء ما. إنها تعمل ، لكن الأداة غير بديهية للغاية. لقد جربته عدة مرات ، لكن بما أنني كنت أعرف ما الذي كان بإمكان IPython فعله ، لم أستطع الاستمرار في استخدامه.

لحسن الحظ ، هناك CLI (واجهة سطر أوامر) جديدة رائعة على الكتلة واسمها Psysh. Psysh هي أداة رائعة ، مليئة بالميزات المثيرة للاهتمام ويمكن تثبيتها عالميًا أو لكل مشروع باستخدام الملحن.

أفضل ميزة Psysh بالنسبة لي هي التوثيق المضمّن. يعد الوصول إلى المستند الخاص بوظيفة PHP دون التوجه إلى Php.net أمرًا رائعًا. الجانب السلبي هو أنك تحتاج إلى القيام ببعض الأشياء قبل أن تعمل بشكل كامل.

بعد تثبيته ، اكتب الأوامر التالية (أنا أستخدم دبيان هنا ، قد لا يعمل هذا مع الجميع) حتى يعمل بشكل صحيح

$ 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

الأمر الأول ليس إلزاميًا وإذا كان لديك Sqlite مثبتًا بالفعل يمكنك تخطي هذه الخطوة. يقوم الأمر الثاني بإنشاء الدليل لتخزين الوثائق وتنزيل السطر الثالث وحفظ المستند في الدليل الذي تم إنشاؤه مسبقًا. تذكر أن كل هذه الأوامر يجب أن تعمل كجذر.

الآن لديك هذا

توجه إلى Psysh وتعلم المزيد عن هذه الأداة الرائعة.

يجب أن تبدأ الاختبار

هذه تعويذة أقولها لنفسي كل يوم. مثل الكثير من الأشخاص ، لا أختبر الكود الخاص بي بقدر ما تقترحه TDD. أقوم بإجراء الاختبار الآن وقد كنت أقوم بذلك منذ نصف عام ، وهناك طريق طويل في المستقبل.

قررت التعرف على الاختبارات عند العمل في مشروع قديم معقد. كان الرمز هشًا وصلبًا لدرجة أنه في أي وقت نضيف فيه بعض التعليمات البرمجية ، فإنه يكسر شيئًا ما. ميزة جديدة؟ تنفيذ وكسر شيء! إصلاح الخلل؟ قم بإنشاء واحدة أخرى.

كانت تلك مشكلة كبيرة ، والتي ناقشتها في مقال آخر ، وجعلتني أبدأ في إعطاء فرصة للاختبارات.

أول أداة تم تقديمها إلي هي PHPUnit. كما جاء في الموقع الرسمي

PHPUnit هو إطار عمل اختبار موجه للمبرمجين لـ PHP.

إنه مثال على بنية xUnit لأطر اختبار الوحدة.

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
  • المؤلف: إدارة التبعية وغيرها من الميزات المفيدة
  • Packagist: مستودع الحزم
  • غصين: محرك القالب

العنوان كان طنانًا حقًا ، أعرف. ما أردت حقًا إظهاره هنا هو أن PHP تتطور وأن النظام البيئي يتطور بنفس الوتيرة (ربما أسرع).