بسـم الله الرحمــن الرحــيم.
يتناول هذا المقال ما يلي:
= ملحوظات قبل البدء.
= مقدمة.
= التعامل مع النصوص.
= قاعدة البيانات و الملفات والمقابس.
= المتغيرات والدوال.
= نصائح عامة.
= الكائنات ومحتوياتها.
= الخاتمة.
= ملحوظات قبل البدء:
* يفضل عمل -إن لم يكن موجودا- مجلد على الجهاز ونضع فيه المعلومات التي تلفت نظرنا حتى يكون مرجعا نبحث فيه قبل الرجوع إلى الويب.
* ما يلي هو جزء من كل ونقاط من بحر كلما تعمقت وقرأت فيه ستجد أنك تضيف إلى معلوماتك في كل مرة.. لذلك حاول القراءة و البحث أكثر.
= مقدمة:
تم إعداد هذه النصائح أو ال tips بهدف تصحيح بعض الأوضاع .. لكن تجب القراءة والتوسع أكثر
لأن هناك أخطاء كثيرة قد تحتوي عليها أكوادنا ونحن ربما لا نعرف بها .. أو حتى أننا نعتبرها مميزات للكود كما سنرى..
= التعامل مع النصوص:
1- عند طباعة النص ب echo استعمل البارامترات المتعددة عوضا عن لصق النص بالنقطة "." حيث أنها دالة تقبل عدة مدخلات من النصوص.
كود PHP:
$name = 'Mohamed';
// بدلا من
echo 'My name is '.$name;
// استخدم
echo 'My name is ',$name;
2- استخدام echo بدلا من print، حيث أن الأخيرة تتأخر لإرجاعها نتيجة هل تمت طباعة الكود أم لا.. وهذه النتيجة لا نحتاجها.
3- استخدام strpos و strbrk و strncasecmp بدلا من التعبيرات القياسية كلما أمكن.
كود PHP:
// بدلا من
if(preg_match('/something/',$text);
// استخدم
if(strpos($text,'something') !== false);
4- عند استبدال نص ولا تحتاج تعبيرات قياسية يكون استخدام strtr أسرع بأربع مرات من str_replace
5- إذا كنت تستخدم دالة لاستبدال النصوص مثل str_replace تقبل مدخلات عبارة عن مصفوفة أو نص عادي وكنت لا تريد البحث عن مدخلات كثيرة
فالأفضل تكرارها عدة مرات بعدد مدخلات البحث على أن تدخل لها مصفوفة.
6- استعمال علامة التنصيص المفردة ' بدلا من المزدوجة " وهذا عندما لا تحتاج لوضع متغيرات داخل هذا النص.
7- عند الحاجة للتحقق من طول النص استخدم isset بدلا من strlen
كود PHP:
if (strlen($var) < 3) { /*Do something */ }
// استبدلها ب
if (!isset($var{3})) { /*Do something */ }
8- دالة printf بطيئة جدا مقارنة ب echo و print حيث أنها تبحث داخل النص عن الرموز الخاصة بها وإذا وجدته تتعامل معه.
و غالبا انك في PHP لن تحتاج لما تقدمه هذه الدالة أيضا..
9- دائما استعمل gzip في ضغط المخرجات حيث انه يقلل حجمها بشكل يصل إلى 80%
10- حاول جعل ال HTML في صفحات مستقلة عن البرمجة PHP حيث أن تعامل الاباتشي مع صفحات ال PHP أبطأ ب 2-10 مرات من صفحات HTML
= قاعدة البيانات و الملفات والمقابس:
11- استعمال المسارات الكاملة للملفات full paths لمنع إهدار الوقت في ترجمتها من قبل النظام.
كود PHP:
// تعريف المسار الرئيسي للصفحات بوضع قيمته داخل متغير أو ثابت
define('ABSPATH',dirname(__FILE__).'/');
// ثم استخدامه عند الحاجة
include(ABSPATH.'path/to/file');
12- إغلاق المقابض المفتوحة لاتصالات قاعدة البيانات و الملفات وغيرها بعد الانتهاء من استخدامها مباشرة
13- حدد فقط الحقول التي تحتاجها عند عمل استعلام من قاعدة البيانات ولا تستعلم عن جميع الحقول.
كود PHP:
// بدلا من
$stmt = 'SELECT * FROM table';
// استعمل
$stmt = 'SELECT field1 FROM table';
14- استعمل التعليمات المجهزة مع الداتابيس prepared statements وهنا شرح لعمل ذلك باستعمال مكتبة PDO.
= المتغيرات والدوال:
15- دائما استخدم unset لحذف المتغيرات عند الانتهاء من استخدامها وخاصة مع المتغيرات و المصفوفات الكبيرة
16-
كود PHP:
$row['something']
// أسرع بسبع مرات من
$row[something];
17- زيادة متغير غير معرف أبطأ من 9 إلى 10 مرات من المتغير المعرف مسبقا.
كود PHP:
// لا تستعمل ما يلي مباشرة
$i++;
// بل يجب تعريفه أولا
$i = 0;
$i++;
18- تعريف دالة لها بارامتر واحد ولا توجد أوامر في جسمها تعادل وقت زيادة متغير عادي بسبع إلى ثماني مرات
كود PHP:
// تعريف دالة بأبسط أشكالها هكذا:
function foo($arg1);
// تساوي الوقت اللازم لزيادة متغير بالصورة التالية سبع مرات
$var++;
19- زيادة متغير global أبطأ بمرتين من زيادة متغير داخلي في الدالة مثلا.
كود PHP:
// زيادة متغير بهذه الصورة
function foo(){
global $var;
$var++;
}
// أبطأ بمرتين من هذه
function foo(){
//$var = 0;
$var++;
}
= نصائح عامة:
20- استخدام $_SERVER['REQUEST_TIME'] بدلا من time() إذا كنت تريد معرفة وقت بدء تنفيذ الصفحة و لأغراض الاستعلام وعرض التواريخ
حيث أن تاريخ تنفيذ الصفحة يكون معرف مسبقا.. أما time() هي دالة تكونه في كل مرة.
كود PHP:
$tstamp = $_SERVER['REQUEST_TIME'];
// أسرع من
$tstamp = time();
21- استخدام الدوال البادئة ب ctype_ للتحقق من نوع المدخلات .. بدلا من التعبيرات القياسية.
كود PHP:
// بدلا من
if(preg_match('/^[0-9]+$/',$_GET['id'])) /*Do something*/;
// استعمل
if(ctype_digit($_GET['id'])) /*Do something*/;
22- استخدام @ قبل الدالة بغرض إخفاء الخطأ الناتج عنها يبطئ عملها كثيرا.
23- إذا كنت تستعمل if و else if كثيرة فيمكنك التفكير في استعمال switch لأنها أسرع.
24- لا تستخدم دوال بداخل حلقة تكرار for و استخدمها خارجا .. مثل count
كود PHP:
// بدلا من
for($i=0;$i<count($var);$i++);
// استخدم
$count = count($var);
for($i=0;$i<$count;$i++);
25- استخدام foreach أسرع من for في اغلب الأحيان
26- استخدام أدوات اختبار الأداء profilers لمعرفة تفاصيل تدفق الكود و إحصائيات و أزمنة تنفيذ كل جزء منه.
27- هذا ينطبق على PHP فقط:
كود PHP:
++$i;
// أسرع من:
$i++;
= الكائنات ومحتوياتها
28- عندما يكون عندك مصفوفة أخرجها و استعملها كمصفوفة ولا تحولها ل object .
29- عدم المبالغة في شق ال methods في الكلاس وتعديدها .. ضم ما يمكن ضمه داخل دالة واحدة.
30- تعريف دالة method داخل صنف يساوي وقت عمل $var++ يتم تكرارها 15 مرة! -لاحظ أن هذا وجسم الدالة فارغ لا توجد به أوامر.
كود PHP:
// class A{
function foo($var);
// }
// تعادل تكرار العملية التالية ل 15 مرة
$var++;
31- زيادة متغير في كلاس أبطأ بثلاث مرات من زيادة متغير داخلي
كود PHP:
class A{
var $var = 0;
function foo(){
// هذه العملية
$this->var++;
// أبطا مما يلي بثلاث مرات
// $var = 0;
$var++;
}
}
32- طلب دالة static أسرع 4 مرات من طلبها داخل object.
كود PHP:
class A{
public static function $foo_static(){
// echo 'hello';
}
public function $foo_obj(){
// echo 'hello';
}
}
A::foo_static();
// أسرع باربع مرات من
// $obj = new A();
$obj->foo_obj();
33- تجنب الطرق السحرية magic methods قدر الإمكان
كود:
__construct
__destruct
__call
__callStatic
__get
__set
__isset
__unset
__sleep
__wakeup
__toString
__invoke
__set_state
__clone
34- لا يجب ان تجعل كل شيء OOP نظرا لضغطها وزيادة وقت تنفيذها -يعني كل شيء بقدر، ولا تسرف في الاستخدام
= الخاتمة:
بخصوص المقالات القادمة بإذن الله.. كنت انوي جعلها للوصول للمستوى المتوسط في السكيوريتي الخاص بأكوادPHP
لكن، ومع اصطدامي بالواقع الذي عليه بعض المبرمجين، من سطحية الادراك لأجزاء شائكة مثل اختصار الأكواد
فـ قد نعمل فيها دورة تصل بنا إلى ما قبل المستوى المتوسط .. لكي نكمل من حيث انتهى الآخرين..
هذا ما لدي الآن فإن أخطأت فمن نفسي ومن الشيطان .. وان أصبت فبتوفيق من الله.
أرحب بأي أسئلة أو استفسارات أو نقاشـات بناءة .. ولا تنسوا دعوة لأخيكم بظهر الغيب.