PHP Best Practices بالعربي

Standard

مقدمة بسيطة كده

PHP واحدة من اللغات اللي تتطوت على مدار السنين وكل تحديث او نسخة جديدة تنزل بيبقة فيها جديد وتطوير. المشكلة لانها لغة سهلة ومن نوع Weakly-typed مش Strongly-typed زي JAVA او C# مثلا … فا دا بيأدي لنوع من البرمجة الرقيقة او اللي فيها “عك” شوية بمعنى اصح … الموضوع ده موجود في كل اللغات مش في ال PHP فقط … بس اللغات اللي زيها بيبقة الموضوع رخم حبتين خصوصا في الأول وبتبان قوي لو واحد لسة بيتعلم برمجة وبيطبق على لغة زي PHP او Python.

وعشان الموضوع يبقة مفهوم اكتر اللغات اللي زي PHP و Python و Scala معملوه بمفهوم انها متجبرش اللي يشغل بيها على حاجة يعني خليه برحته يا برنس ومتخنقش عليه. بس ده على اساس انه فاهم Programming Concept كويس على الاقل.

في الاول والاخر لغة البرمجة دي بتبقة عبارة عن أداة بيستخدمها المبرمح عشان يعمل بيها الحاجة اللي عاوزها. فمينفعش تقول اللغة الفلانية احسن من اللغة العلانية لمجرد انك شوفت حاجة معمولة باللغة العلانية دي وكانت بايظه او بطيئة.

عشان كده لازم يبقة في زي قواعد او اساسيات الناس تتفق عليها عشان يبقة جودة الحاجة اللي بتتعمل كويسة من كل النواحي. القواعد دي الـ community هو اللي حطها ودي ميزة مهمة جدا جدا لانها بتبقة نتيجة خبرة ناس داست جامد في الشغل باللغة وكمان انت مش ملزم تلتزم بيها خالص وتعرف تلعب برحتك … بس اعمل حسابك ان في احتمال كبير جدا انك مش الوحدي اللي هتشتغل على ال project وغير كده كمان انت ممكن تعمل حاجة وتيجي تبص عليها بعد شهر واحد متفهمش حاجة وتحس ان في حد جه من المريخ سيطر على دماغك 😀 … عشان كده برده موضوع ان الواحد يمشي على قواعد واساسيات معينة كويس وفي نفس الوقت ممكن تغير فيها بشكل يناسبك ويناسب غيرك.


PHP version اللي بتستخدمها ايه ؟؟؟

حسب اخر احصائيات للنسخ اللي منتشرة والمستخدمة على ال Servers دلوقتي (حسب وقت كتابة المقال) إن 5.3 هو الأكثر انتشاراً بنسبة 48.9% … فا ده معناه انك لازم في شغلك تبقة عمال حساب كده لان زي ما قولنا كل نسخة جديدة فيها حاجات جديدة وحاجات اتعمل Deprecate وغيره … هو المفضل دائما انك تشتغل بأخر حاجة نازلة Stable وهو دلوقتي 5.6.0 … بس زي ما شايفين في الاحصائية ان استخدام اخر نسخة اقل من 1% ودا راجع لأنها لسة نازلة في شهر 8 / 2014 غير ان في Shared hosting كتير بيتأخروا في عمل update لل packages بتاعهتا.

عشان كده بينصح انك تشتغل بنسحة متكونش متأخر عن اخر حاجة نازلة كتير … يعني اشتغل بنسخة 5.4.x أو 5.5.x وتبقة ال Development Environment اللي شغال عليها قريبة على قد ما تقدر من ال Production عشان تعرف تعمل محاكلة لكل حاجة … بمعنى أخر حاول تجرب حاجاتك على Linux Server عشان تقريبا 67.7% من ال Servers اللي هيشتغل علها ال App بتاعك هيبة شغال Linux Ubuntu او Linux CentOS مثلا … عشان كده حاول على قد ما تقدر تعمل محاكاه وممكن حتى بـ Virtual Machine وفي منها كتير زي VMware او VirtualBox


Password hashing … اوعا تسجل ال Passwords زي ما هي كده .. هدبحك !!!

لازم لازم لازم ولازم كمان مرة تعمل Hashing لل Passwords قبل ما تسجلها في ال Database لأنها مسؤلية كبيرة جدا وانت المسؤل عن حماية بيانات الـ User … في طرق كتيرة عشان تعمل Hashing اقدمهم حاجات زي md5 و sha1 ودول عفى عليهم الزمن خلاص معدوش أمنين باي حاجة من الاحوال … PHP من اول 5.5 فيها built-in hashing بإستخدام bcrypt algorithm وتعتبر دي دلوقتي الطريقة المتبعة والمفضلة … لو عندك انت Algorithm تانية احسن تبقة معلم 😀


بتعمل Connect على ال MySQL Database ازاي ؟؟؟ ازعل منك لو قولتلي mysql driver 🙁

في 3 انواع لل database drivers موجودين built-in في ال PHP هما mysql و mysqli و PDO اقدمهم هي ال mysql اللي كان عملها الفريق اللي عمال MySQL اساسا بس التطوير فيها وقف من زمان ومعدش بيحصل فيهل اي تحديث وكده معناها انها ماتت ولازم تستخدم بديل اللي هما mysqli أو PDO وخصوصا تستخدم ال Prepare Statements بتاعتهم والحتة دي مهمة جدا جدا … الاتنين جامدين وحلوين الفرق بنهم إن ال PDO بتدعم انواع تانية من ال Databases غير MySQL عكس mysqli اللي بتشتغل مع MySQL بس … هتستخدم انهي فيهم بقة دي حاجة ترجعلك وترجع لاحتياجك واحتياج ال App اللي شغال عليه.


PHP tags … الاختصارات No

دائما استخدم Full tags … يعني بلاش تستخدم الاختصارات او ال ASP style tags … دائما استخدم <?php ?> بلاش الحاجات التانية زي <?= ?> … وكمان بلاش تقفل PHP tag في اخر الصفحة عشان ميبقال اي حاجة تتبعت في ال Header بتاع ال صفحة بالغلط زي newline character او space … الحاجات دي ممكن تلخبطك وتعمل ازمة لو بتعمل URL redirect يطلعلك header already sent error


Autoloading Classes … ريح نفسك وريح غيرك

تقدر تعمل Autoload للـ Classes files في ال PHP بكذا طريقة. اقدم طريقة هي استخدام الـ Magic Function اللي إسمها __autoload ومشكلتها انها بتسمحش انك تعمل كذا Autoload في نفس الوقت ودي مشكلة لما الكود بتاعك يشتغل مع كود حد تاني وبيحصل Conflict. عشان كده استخدم spl_autoload_register اللي بتخليك تقدر تعمل كذا autoload من غير مشكلة وبـ unique name عشان المشكلة دي متحصلش معاك.


Single vs Double quotes performance … مش فارقة قوي معظم الاحيان

الموضوع ده يرجع للفرق في طريقة الشغل بين Single quotes و ال Double quotes … الـ String بين الـ Double Quotes هيتعمله parsing ولو حاطت فيه $variable هيعتعمله evaluation ودا طبعا معناه process زيادة … الفكرة ان ال process دي مش بتاخد resources كتير … هتفرق معاك في الـ Large Scale Apps … الـ Benchmark اللي معمول ده بيوضح الفرق في لما الحجم ال Data بيكبر … مش هتخسر حاجة لو استخدمت Single quotes على قد ما تقدر مدام مش هتأثر على ال App Logic … كل ما كان ال App بيستخدم resources أقل كل ما كان احسن في كل الأحوال.


define() Vs const … في expressions اديله define() مفيش expressions اديله const

برده الموضوع ده يرجع للفرق في طريقة الشغل الاتنين … define بتعرف الـ constant في الـ runtime انما const بتعرف الـ constant في الـ compile ودا طبعا بيدي افضلية للـ const بس المشكلة في const انك متعرفش تستخدم اي expression ولازم تديله Fixed Value من غير ما تعمل عيلها حاجة ( من أول PHP 5.6 اتضاف انك تستخدم expression مع const ) إنما define تقدر تعمل اللي انت عاوزه … عشان كده define مرنة اكتر … بس برده في مشكلة تانية انك متعرفش تعرف constant خاص ب namespace معين بـ define … لازم تستخدم const … وعشان كده انت تستخدم انهي هترجعلك وهترجع لاحتياجك في الـ App عامل ازاي.


Regular Expression … متعملش كل حاجة بيها وخلاص

بالنسبة لموضوع ال regex دي حاجة اساسية بس خد بالك انه engine لوحدة جوه ال engine بتاع ال PHP يعني لما تستخدم regex حاول على قد ما تقدر تستخدمها بعقل كده وتركيز ولو تعرف تعمل نفس الحاجة من غير ما تستخدمها يبقة احسن … ومتنساش تستخدم ال functions اللي بتبتدي ب preg_ بس لان الباقي بقة Deprecated من اول version 5.3

 


بتعمل Serving PHP من على الـ Web Server ازاي ؟ لو mod_php “اجري يا ماجدي”

النقطة دي خاصة اكتر بـ Server Administrators فا لو مفهمتاش قوي قول للـ tech support بتوع الServer وهم هيظبطوها … المهم … في كذا طريقة عشان الـ Web server زي Apache يشغل الـ PHP code بتاعك mod_php و mod_fastcgi و mod_fcgid … اقدمهم mod_php وهي ابطئهم لنها بتخلي الـ Apache هو اللي يتحكم في PHP process ودا مش كويس لأنه مبيعرفش يظبط الـ Memory Handling كويس مع الـ PHP لما الـ traffic يعلى … عشان كده استخدم اي طريقة من التنين وفي طريقة احسن كمان منهم بس معقدة شوية بس نتيجتها حلوة جدا جدا وهي PHP-FPM ودي اساساً مبنية على mod_fastcgi وميزتها انها بتتحكم في عدد ال PHP process اللي شغالة وبيحرجمها حسب الاحتباج وبيبعدها عن ال Web server خالص وبيخلي ال Apache ينده عليه عن طريق socket server … ودي ميزة تانية مهمة كمان عشان تقدر تتحكم في ال PHP Process زي منتا عاوز بعيد عن الـ Web Server


بتبعت اميلات ازاي ؟؟؟ هتقولي mail() هزعل منك قوي

لازم نعترف ان PHP مش لغة كاملة وفيها شوية حاجات غبية حبتين ومنهم انك تستخدم mail() built-in function عشان تبعت email … مشكلتها انها بستتخدم resources كتير وممتعرفش تحكم بشكل كامل عليها … عشام كده استخدم حاجة زي PHPMailer كويسة جدا وكتير جدا معتمدين عليها لأنها library فيها options كتير غير انها شغالة OOP Interface وتقدر من خلالها تبعت mails بكميات كبيرة ومن على mail servers تانية وتعمل connection عن طريق SMTP Protocol over SSL or TLS.


Email Address Sanitizing and validation … على طول كده filter_var()

اكيد عادى عليك وهيعدي عليه انك تعمل validate لـ Email address واكيد دورت كتير وهتلاقي Regex طويلة عريضة كده تخدها copy & paste عشان تعمل بيها validate … طيب بدل ما تدور وتلف ما في الـ PHP طريقة مضمونة عشان تعمل بيها Data filtering ومنها filter_var().


Sanitizing HTML input and output … اوعى من XSS Attack

عشان تريح نفسك من وجع دماغ ال XSS ولان الـ User دائما على خطأ عشان كده اي input من ال User مشكوك فيه والـ output كمان. فا على طول تستخدم htmlentities() لو هتعمل simple sanitizing بس لو هتحتاج حاجة معقدة شوية اكتر ممكن تستخدم اي library حد عملها اشهرهم في النقطة دي هي HTML Purifier


UTF-8 Encoding … أه منك انت أه

جينا للرخامة بعينها في ال PHP … لغاية دقوتي اللغة مفيهاش Low level support for Unicode دي مشكلة رخمة جدا جدا … بس حلها سهل او بمعنى اخر بقى سهل 😀 … المشكلة انها على كذا مرحلة او Level … الـ Browser و MySQL و PHP … المشكلة دي دايما بتظهر مع اللغات الشرقية واللغات اللي مش مبنية على اللاتيني Non-latin based languages

بالنسبة لل PHP حاول على قدر الامكان تستخم Multibyte String operations هي هتتطلب تعديل شوية في الكود بس حاجات بسيطة وهي built-in وخلي ملف ال PHP نفسه اللي بتكتب فيه ال charset بتاعه UTF-8

بالنسبة للـ MySQL خلي دايما charset بتاع الـ database connection بـ utf8mb4 والـ database نفسها UTF-8

بالنسبة لل Browser اتأكد ان في meta tag بالـ character encoding بيساوي UTF-8 وفي نفس الوقت اللي هتبعته للـ browser كـ HTML من الـ PHP اعمل قبل ما تبعته mb_http_output عشان تقول لل browser ان الـ response content character encoding بـ UTF-8


التعامل مع التوقيت والتاريخ … كانت ايام فيها Twist

كان قبل كده عشان تتعامل مع التوريخ والتوقيت في الـ PHP كانت لبخة شوية وكنت تطر تستخدم function كتير مع بعض dategmdate, date_timezone_set, strtotime وغرهم … بس دلوقتي فيه built-in Class بتسهل الموضوه كتير جدا وسهل في الاستخدام DateTime class هي من جواها اساسا بتستعمل ال functions القديمة لنها فعالة جدا وسريعة وزيادة عليهم حاجات تانية … ونصيحة حاول تتعامل مع الحاجات القديمة للفهم مش اكتر عشان هي low level شوية.


“==” vs “===” مع Null و Boolean … هتشد في شعرك او استخدمت “==”

من ضمن الحاجات الغريبة في اللغات ال Weakly Typed انها بتساوي حاجات ببعضها مش منطقية خالص زي مثلا لو قارنت بين empty string و NULL هيديك true !!!! ازاي معرفش …. عشان كده لو المقارنات فيها null او Boolean او الـ Data type هتفرق معاك يقة لازم تستخدم “===” strict equivalence operators و “!==

A contribution for PHPBestPractices.org

2 thoughts on “PHP Best Practices بالعربي

Leave a Reply

Your email address will not be published. Required fields are marked *