بسم الله الرحمن الرحيم
الحمدلله ، والصلاة والسلام على خير عباد الله ، محمد بن عبدالله ، وعلى آله وصحبه ومن والاه ، وبعد ؛
سنتحدث اليوم عن الإضافات التي يدرسها ويعمل عليها فريق PHP لتوفيرها في إصدار PHP الجديد ، PHP6 ..
هناك الكثير جداً من الإضافات والتخصيصات والتعديلات .. سنبدأ بذكرها واحدة تلو الأخرى ، وسأعمل جاهداً بإذن الله تعالى على تخصيص هذا الموضوع من حيث الردود بتزويده بأحدث المعلومات التي أصل إليها حول تلك الإضافات والتعديلات ..
ملاحظة: أتمنى أن يعلم الجميع الهدف من هذا الموضوع، فالهدف هو تمهيد برمجتنا نحو برمجة متناسبة مع الإصدارات الجديدة ، إذا توافقت برمجتنا من الآن مع PHP6 ، عندها لن نقلق من تعطّل سكربتاتنا في الإصدار الجديد. وكذلك كنظرة مستقبلية متفائلة نحو التطويرات القادمة
..
نبدأ بسم الله الرحمن الرحيم .. ![Smilie](images/smilies/smile.gif)
وداعاً Register Globals
كلنا نعلم مدى اعتماد الأحافير البي إتش باوية على خاصية Register Globals = On ، والتي يعود أصلها إلى PHP3 .. وكذلك نعلم مدى خطورة تفعيل خاصية Register Globals ..
Register Globals هي الخاصية التي تعمل على تسجيل المصفوفات الرئيسية :
كود:
$_GET
$_POST
$_FILES
$_COOKIE
$_REQUEST
$_SERVER
$_ENV
$_SESSION
حيث تستطيع الوصول إليها وكأنها متغيرات عادية ، أي كأنك قمت بتنفيذ الأمر extract على كل منها .. ![Smilie](images/smilies/smile.gif)
هذه الخاصية تم إلغاؤها في PHP6 ، حيث أنك لن تجدها حتى في خيارات PHP في ملف php.ini ولن تستطيع تفعيلها ..
والسبب هو الخطر الكبير الذي تؤدي إليه ، المصدر - المانيوال :
This feature has been DEPRECATED and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.
وداعاً للمتغيرات الكبيرة الطويلة HTTP_*_VARS
في PHP6 سوف لن تستطيع عزيزي المبرمج الوصول إلى المتغيرات الكبرى التي تحمل الأسماء HTTP_*_VARS ، عليك باستخدام الصيغ التي تم اعتمادها منذ زمن ، مثل COOKIE_$ و SESSION_$ و POST_$ و GET_$ ، القسم السابق يوضّح بعض المعلومات حول هذا الموضوع ..
وداعاً Magic Quotes
أيضاً نقطة لصالحنا ، خاصية Magic Quotes ستودعنا في PHP6 ، وهي الخاصية التي تعمل على تجاهل النصوص المرسلة في PHP .. أي أن عملها مطابق لدالة addslashes إلا أنها تعمل بشكل تلقائي على النصوص المرسلة عبر النماذج . وهذا قد يسبب الكثير من المشاكل للمبرمجين .
هذه الخاصية لن تجدها في ملف php.ini أيضاً ، ولن تتمكن من تفعيلها في PHP6 .. كذلك استناداً للمانيوال ( PHP: Magic Quotes - Manual ) :
This feature has been DEPRECATED and REMOVED as of PHP 6.0.0. Relying on this feature is highly discouraged.
هذا سيؤثر في الخيارات : magic_quotes ، magic_quotes_sybase ، و magic_quotes_gpc .
وداعاً للوضع الآمن Safe Mode
هاا ؟! السيف مود سيختفي أيضاً ؟؟؟
نعم سيختفي من PHP6 طبقاً لما ورد في المانيوال :
Safe Mode was removed in PHP 6.0.0.
لن يعد بإمكانك تشغيل الوضع الآمن في سيرفرك عند استخدامك للإصدار PHP6 .. ولن تجد الخيار أيضاً في php.ini ..
يا للمصيبة ! لغة PHP بدأت بالتدهور أمنياً .. !!
هذا ما قد تظنه للوهلة الاولى ، لكن مطوري لغة PHP يعلمون تماماً ما يفعلون ، فقد أوضحوا أن safe_mode لم يكن يعمل بالشكل المرغوب للحماية الكاملة ، فهو أصلح للمبتدئين لحماية سيرفراتهم .. أما الآن ، فلا داعٍ له ، يمكن للجميع استخدام open_basedir للحد من المجلدات التي يصل لها مبرمج السكربت .. وكذلك منع الدوال التي يرغب بمنعها .. لا تزال الحرية متاحة كالسابق في المنع والحماية .
وداعاً مكتبة Freetype 1 و GD 1
لا داعي للكلام الكثير هنا ، مكتبة Freetype 1 و GD 1 ، مكتبتان قديمتان جداً جداً وسيتم استئصالها من نسخة PHP ..
دالة ifsetor
دالة ifsetor الجديدة تفيد المبرمجين في تحديد قيم افتراضية للمتغيرات ، في السابق كنا نستخدم:
كود PHP:
$var = (isset($var) ? $var : 'default');
في نقاش PHP6 ، تم اقتراح دالة ifsetor التي ستريحنا في طريقة الكتابة ، فالكود السابق سيصبح:
كود PHP:
$var = ifsetor($var, 'default');
ومعناه : إذا لم يكن المتغير var$ يحمل قيمة ، اجعل قيمته default .
من الجدير بالذكر ، أن الاجتماع أفضى إلى عدم اعتماد هذه الخاصية ، على أغلب الأحوال لن ترى ifsetor في PHP6 ..
إذاً ، لماذا خصصت لها قسم من الموضوع ؟
اعتمد مطورو PHP أسلوب آخر لهذه العملية ،
كود PHP:
$var = (isset($var) ? $var : 'default');
في هذه الصيغة ، تم إسقاط " ضرورية " الباراميتر الأوسط ، فليس من المهم بعد اليوم أن تضع النتيجة في المنتصف، وذلك عن طريق معامل ?: ..
هذه الصيغة تتيح مجالاً أكبر من العمليات ، دون محدودية التحكم في ifsetor ..
المثال بعد التطوير:
كود PHP:
$var = (isset($var) ?: 'default');
عندما يكون المنتصف فارغاً ، لن يحدث شيئاً إذا كان المتغير يحمل قيمة في الأصل .. ![Smilie](images/smilies/smile.gif)
ربما نرى كمبرمجين أن صيغة ifsetor أسهل ، لكن الطريقة هذه معتمدة من قبل وأوسع وأشمل ..
إذا كنت ترغب باعتماد ifsetor خاصتك ، يمكنك صنع دالتك الخاصة:
كود PHP:
function ifsetor(&$var, $or) {
return (isset($var) ? $var : $or);
}
Goto وإضافتها إلى اللغة
كثيراً ما يحتاج مبرمجو لغات الويب أو الديكستوب إلى القفز إلى سطر معين في برنامجهم ، وفي ظل هذه الاحتياجات ، توفرت هذه الكلمات المحجوزة في بعض لغات البرمجة، فمثلاً :
كود:
print 'hello';
goto myLine;
print 'welcome';
myLine:
print 'This is my line';
عندما يصل معالج اللغة إلى goto سينتقل إلى السطر المحدد وهو هنا myLine مباشرة دون تنفيذ الكود الذي يتخللهما ..
هذه الصيغة لن تكون مدعومة في PHP6 ، نظراً لارتباطها بأمور سيئة مع لغات برمجة أخرى !
وحيث أن عملها مختلف في هذه اللغة الواسعة ، تم توسيع كلمة break لتتمكن من الانتقال إلى أسطر معينة كذلك ... وهنا مثال لاستخدام break الموسعة في PHP6 :
كود PHP:
<?php
for ($i = 0; $i < 9; $i++)
{
if (true) {
break blah;
}
echo "not shown";
blah:
echo "iteration $i\n";
}
?>
قد تكون هذه الخاصية مفيدة للمبرمجين إلا أني أرى أنها تحدث " حالة فوضى " في الكود البرمجي ، فقد تعودنا على الكود دونها ، فلا أرى لزوم استخدامها في سكربتاتنا .. من يدري ، قد أكون أول من يحتاجها
..
foreach الآن تتعامل مع المصفوفات متعددة الأبعاد
في السابق كنا نقوم بالآتي:
كود PHP:
$array = array(array('a', 'b'), array('c', 'd'));
foreach ($array as $val) {
list ($val1, $val2) = $val;
}
وبذلك نحصل على قيم المصفوفتين الداخليتين ، هذه المصفوفة ذات الأبعاد المتعددة ، سيمكنك التعامل معها بطرق أبسط وأسهل في PHP6 .
ما رأيك بهذا:
كود PHP:
$array = array(array('a', 'b'), array('c', 'd'));
foreach ($array as list($val1, $val2)) {
}
ستحصل على نفس القيم بهذه الطريقة ، يا إلهي ، هذه الطريقة ذات تأثير كبير جداً على مستقبل البرمجة . خطوة موفقة من فريق PHP . ![Smilie](images/smilies/smile.gif)
وداعاً {} ، و [] تتقدم !
أنعم النظر في المثال الآتي:
كود PHP:
$str = 'abcd';
echo $str{1};
الكود السابق سيطبع b ، لأن {} هي محددات تحدد المفتاح Index في المتغير النصي للتعامل معه .
نستخدم [] لنفس الغرض كذلك ،
فريق PHP قام بتجاهل {} في PHP5.1.0 وسيتم إزالة هذه المحددات بشكل كامل من PHP6 . عندها ، لن تستطيع التعامل معها أبداً .
في الوقت ذاته ، يطوّر فريق PHP المحددات [] لتعمل بشكل رهيب ، الخطوة هذه غير مسبوقة وستسهّل علينا الكثير الكثير ، وأنا أعني ما أقول .
الآن هذا المحدد سيعمل عمل دالتي array_slice, substr ، هذا يعني أنه يمكنك تناول جزءاً من متغير نصي أو مصفوفة دون التطرق إلى الدوال السابقة .. كيف ؟
كود PHP:
$str = 'this is my text';
echo $str[2,];
هذا سيأخذ من الحرف ( أو عنصر المصفوفة ) الثاني إلى النهاية ..
يمكن التحديد برقمين 1,2 مثلاً ، يمكن كذلك وضع أرقام سالبة ، ستعمل تماماً كعمل array_slice إن كانت مصفوفة ، و substr إن كان نصاً ، وإن لم تحدد نقطة البداية ، سيبدأ من 0 .
بهذه الشروط ، سيسلك المتغير النصي بالشكل التالي مسلكاً جديداً :
كود PHP:
$str = 'tex';
$str[] = 't';
عندها سيحوي المتغير القيمة text ، هذا يعني أن [] ستعمل كعمل المعامل .= على النصوص .. عملها أصبح شبيهاً بعملها مع المصفوفات ..
تعديل سلوك Microtime الافتراضي
إذا كنت من مستخدمي دالة microtime في لغة PHP على المدى السابق ، ستدرك فوراً الفرق بين microtime في الإصدارات السابقة وهذا الإصدار .
منذ أ، وجدت دالة microtime كانت تعيد نتيجة نصية String تحوي أجزاء الثانية متبوعة بمسافة ، ثم الوقت بنسق Unix Timestamp ، مثال:
كود:
0.75000200 1211460710
كنا في السابق للحصول على الوقت الحالي بالثواني وأجزائها ، نقول بتجزئة النتيجة ونجمعها ..
كود PHP:
$micro = explode(' ', microtime());
$microtime = $micro[0] + $micro[1];
لكن ، في PHP5 ، تمت إضافة باراميتر جديدة لهذه الدالة ، والباراميتر الوحيد لها .. حيث أنه إذا أخذ القيمة true سيعيد الناتج على شكل Float ( بالشكل الذي حصلنا عليه في المثال الأخير ) ..
فالمثال التالي في PHP5 مشابه للمثال السابق :
كود PHP:
$microtime = microtime(true);
أما في PHP6 ، ففريق PHP قام بجعل القيمة الافتراضية لهذا الباراميتر هي true ، أي أن :
كود:
microtime() = microtime(true)
هذا في PHP6 ، طبعاً السابق ليس كود PHP ، فقط توضيح ..
( طيب واللي استخدم طريقة explode وجمع الجزئين ؟!!! يعني كل السكربتات اللي تستخدمه رح تخرب ؟!!! )
دعونا ننفذ الكود نفسه في PHP6 :
كود PHP:
$micro = explode(' ', microtime());
$microtime = $micro[0] + $micro[1];
السطر الأول سيعيد لنا مصفوفة تحتوي عنصراً واحداً ، حيث أن النتيجة ستكون مثلاً :
وهي لا تحوي أي مسافة كي يتم التقسيم من عندها .. إذاً العنصر 0 سيتم جمعه مع العنصر 1 ، العنصر 1 غير موجود ، فالنتيجة هي العنصر 0 ..
لكن عند الجمع مع العنصر 1 ستظهر رسالة خطأ من نوع Notice ، لأن العنصر الثاني غير موجود ..
هذه الرسالة لن تؤثر في عمل السكربت ، عموماً يجب علينا تغيير طريقتنا في التعامل مع هذه الدالة من الآن بتفعيل الباراميتر بالقيمة true حتى تعمل بكفاء في PHP5 و PHP6 .. ووداعاً PHP4 ..
وداعاً <%
من منا لم يستخدم <% في سكربتاتنا ؟ << كلنا
..!
كلنا درسنا في بداية مسيرتنا البرمجية أن <% و %> تعملان عمل <?php و ?> .. هذا إن كانت مفعلة في خيارات php.ini ..
لكني شخصياً لم أحتجها يوماً من الأيام ، هذه الصيغة تم إسقاطها من لغة PHP .. مع الاحتفاظ بـ <? وبقية الوسوم .. ![Smilie](images/smilies/smile.gif)
النتيجة: صيغة وسوم ASP لم تعد متاحة لكتابة سكربتات PHP ..
إضافة APC إلى النسخة الرسمية
حسب رغبات مستخدمي لغة PHP ، قام فريق PHP بتضمين نظام الكاش المعروف APC في ملفات النسخة الرسمية من الإصدار الجديد PHP6 . هذه المكتبة ستكون معطلة افتراضياً ، لكنها ستتوافر ضمنياً .
قارئ/كاتب XML في النسخة الرسمية
وتدخل مكتبة XMLReader و XMLWriter في توزيعة PHP الجديدة رسمياً ، وستكون مفعلة في الوضع الافتراضي في PHP6 .
ستسهّل هاتان المكتبتان الكثير من التعاملات مع ملفات XML من كتابة وقراءة .. ![Smilie](images/smilies/smile.gif)
Ereg ستخرج إلى PECL
قام فريق PHP بتحويل ereg إلى امتداد Extension ، وبوجود مكتبة PCRE والتي سوف لن تكون قابلة للتعطيل ، يمكن الاستغناء عن امتداد ereg ونقله إلى مكتبة PECL للامتدادات .. ![Smilie](images/smilies/smile.gif)
عليك عزيزي المبرمج الانتقال فوراً للبرمجة باستخدام مكتبة PCRE بدوال preg .. فهي التي نثق بوجودها مستقبلاً في إصدارات PHP .
ويتّضح أن هناك امتداد جديد للتعامل مع التعابير القياسية ، غير PCRE و ereg ، بالاعتماد على ICU .. لكني لا أعلم عنه شيئاً حتى الآن .
الخاتمة Conclusion
لست بصدد إنهاء الموضوع بشكل كلي ، فالتطويرات والتغييرات في PHP6 ليست مقتصرة على ما ذكرت هنا، وإنما هي تغييرات كثيرة هذا ما استطعت نقله منها حتى الآن ، وحتى أضمن قراءة الأعضاء لمعظم هذه الميزات الجديدة والتعديلات ، لم أرغب بالتأخر في طرح الموضوع ..
لم أذكر التغييرات في OO مع أنها ليست بالقليلة ، ولم أتطرق للـ Unicode ولا Namespace لأن الأخ عبدالله عيد تحدّث عنها في إحدى المواضيع ، فلم أرغب بتكرارها ..
من يجد لديه بعض المعلومات غير المذكورة ، ومن يرى أنه لم يفهم إحدى الخصائص والتغييرات فليبادر بالرد بالاستفسار أو الإضافة مشكوراً .. ![Smilie](images/smilies/smile.gif)
الموضوع سيتجدد كلما توفر الوقت بإذن الله تعالى .. وسيبقى مفتوحاً للحديث والنقاش ..
أطيب التحيات، أشرف السمهوري