04
مارس

الخواص الجديدة في الإصدار 5.4 والإصدار 5.5 من PHP (الجزء الأول)

مرحباً بزوار المدونة الأعزّاء.. :-)

الحقيقة لقد انشغلت كثيراً في الفترة الماضية إلا أنني سأحاول جاهداً كتابة بضعة مقالات أسبوعياً. علّني أوفّق إن شاء الله.

مقالتي هذه ستتطرّق إلى بعض (خفايا لغة البرمجة PHP) أو بعبارة أخرى (مزايات رائعة تمّ إضافتها في الإصدار PHP 5.4 والإصدار 5.5).

استخدام السيرفر المضمَّن (built-in web server)

السيرفر المضمَّن طريقة جديدة في PHP 5.4 تمكّننا من تشغيل ويب سيرفر (Web Server) من ضمن لغة PHP! العملية في غاية البساطة لكنها تتطلب الوصول إلى الـ CLI. ولمن لا يعرف CLI فهو الـ (Command Line) الخاص بلغة PHP.

إذا كنت تستطيع الوصول إلى الـ CLI يمكنك تنفيذ الأمر التالي:

cd ~/public_html
php -S localhost:8989

قمنا بتشغيل ويب سيرفر على بورت رقم ٨٩٨٩. نستطيع إذاً الوصول إلى الويب سيرفر كما يلي: http://localhost:8989/somePhpFile.php.

استخدام الـ High Precision Timer

طريقة بسيطة لمعرفة زمن تنفيذ السكربت:

echo $_SERVER['REQUEST_TIME'];

ستقوم العبارة أعلاه بإعادة قيمة Timestamp عند بدء السكربت.

يمكن الآن تنفيذ الدالة date على REQUEST_TIME.

إنشاء المصفوفات بطريقة “التدوين القصير” Short notation

يمكننا إنشاء المصفوفات بطريقة بسيطة جداً. بدلاً من استخدام الدالَّة array. هذه الطريقة تدعى (Short notation) أو “التدوين القصير”.

$anArray = [2,8,2,9];
print $anArray[3]; //9

استخدام الـ Dereferencing

في السابق كان علينا حجز متغيِّر لتخزين المصفوفة (إذا كانت المصفوفة قيمة معادة بواسطة الدالَّة). أمّا الآن فقد أصبح بإمكاننا الوصول إلى عناصر المصفوفة من الدالَّة مباشرة. وهذا ما يوضحه المثال أدناه:

1
2
3
4
5
function getArray()
{
     return ["Basra","Baghdad","Anbar"];
}
echo getArray()[0]; //Basra

ملاحظة: سابقاً كان علينا تخزين القيمة المُعادة كمصفوفة في متغيِّر، ثم الوصول إلى قيم المصفوفة في المتغيِّر.

تتيح لنا ميزة الـ dereferencing القدرة على استدعاء الطرق (Call Methods) والوصول إلى الخواص (Propoerties) للكائن (Object) المعرَّفة في مصفوفة:

1
2
3
4
5
6
7
8
9
10
class TestClass {
	public $prop = "some property value";
 
	public function getArray()
	{
		return array(new TestClass());
	}
}
$test = new TestClass();
echo $test->getArray()[0]->getArray()[0]->prop;

دعني أشرح طريقة عمل الشيفرة أعلاه كما يلي:

  1. قمنا بتعريف صنف باسم TestClass تلاه تعريف خاصية باسم prop.
  2. قمنا بإنشاء طريقة (Method) باسم getArray تعيد هذه الطريقة مصفوفة تحتوي على عنصر واحد فقط وهو تصريح عن الكائن TestClass (كما تشير الكلمة new).
  3. الآن لكي نصل إلى الخاصيَّة prop الموجودة في الصنف TestClass سنقوم بقراءة العنصر رقم ٠ (الوحيد) من المصفوفة getArray.  كي نحصل على تواجد (instance) للكائن TestClass.
  4. الآن بعد أن حصلنا على التواجد (instance) للكائن TestClass نقوم بقراءة الخاصية prop عن طريق استدعاء الطريقة getArray نفسها ثم قراءة الـ TestClass يليه اسم الخاصية prop.

أعتقد أن الطريقة واضحة لكنها تحتاج إلى تطبيق لكي تفهمها جيداً.

 استخدام الـ closures

الـ closures وتدعى أيضاً بالدوال المجهولة (Anonymous functions) هي: إمكانية إنشاء دوال (Functions) بدون تحديد اسم معيّن لها. وتعتبر الأكثر فائدة عند استخدامنا للباراميترات في الـ callbacks.

لكن ماذا تعني callbacks؟

الـ callbacks

لنأخذ التعريف التالي من موسوعة ويكيبديا:

In computer programming, a callback is a piece of executable code that is passed as an argument to other code.

الترجمة:  في (برمجة الكمبيوتر) الـ callback عبارة عن (قطعة) من (شيفرة تنفيذيَّة) تمرّر (passed) كوسيط (argument) إلى الشيفرة الأخرى.

هل التعريف غير واضح؟ لا بأس! دعنا نأخذ المثال التالي:

لنفترض أن لدينا (قيم لمتغيرات) تتم معالجتها طبقاً (لشروط محدّدة). مثلاً: لنأخذ القيمة 5 نريد أن تكون لدينا عدّة معالجات لهذه القيمة، كأن تكون “تقسيم الرقم إلى ٢” ومعالجة أخرى “ضرب الرقم” وهكذا…

بناءً على (عمليات المعالجة) نقوم بإنشاء ما يسمّى بالـ callbacks وهي عبارة عن دوال (Functions) مسؤوليتها معالجة القيمة المرّرة إليها كوسيط (argument).

مثال:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function someAction($x, $y, $someCallback) {
     return call_user_func($someCallback, $x, $y);
}
 
function calcProduct($x, $y) {
     return $x * $y;
}
 
function calcSum($x, $y) {
     return $x + $y;
}
 
// alerts 75, the product of 5 and 15
print(someAction(5, 15, "calcProduct")).'<br>';
 
// alerts 20, the sum of 5 and 15
print(someAction(5, 15, "calcSum"));

المثال أعلاه واضح جداً، لكن دعنا نشرحه بسكل مبسّط:

  1. لدينا دالّة باسم someAction تأخذ ٣ وسطاء، الأول x والثاني y والثالث وسيط باسم (someCallback). تمرّر هذه الدالة الوسطاء x, y, someCallback إلى الدالة call_user_func. مهمّة الدالة call_user_func هي استدعاء الـ callback طبقاً للـ someCallback.
  2. الدالة calcProduct مهمّتها ضرب العدد x في العدد y.
  3. الدالة calcSum مهما جمع العدد x والعدد y.
  4. الآن نريد أن نستخدم القيم 5 و 15 بطريقتين مختلفتين. إذاً قمنا بتمرير بيانات الـ x والـ y إلى الدوال المحدّدة.
  5. بعد إرسال الدالة المحدّدة تقوم الـ someAction وبناء على (الطلب) باستدعاء الـ callback المحدّد لمعالجة القيمة.

أعتقد أن الـ callback أصبحت واضحة جداً الآن :-)

 نرجع إلى موضوع الـ closures

الـ closures (وتعرف أيضاً بالدوال المجهولة) anonymous function. عبارة عن دوال (Functions) تم إنشاءها (بدون حجز اسم مخصّص لها) وتستخدم عادةً لتمرير الـ callback إلى الدوال الأُخرى.

غالباً ما تُستخدم الـ closures إذا كنت تريد أن يحصل شيء ما بعد حدث معيّن. على سبيل المثال لنفترض أن لديك (Web Service) تبعد حصولك على البيانات قد ترغب بمعالجتها بواسطة دالة أخرى. هذه تعتبر طريقة مُثلى لاستخدام الـ closure.

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

دعنا نأخذ الأمثلة التالية:

المثال الأول:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Event {
 
private $name = "Ahmad";
 
	public function getFunction ( )
	{
    return function () { return $this->name; };
	}
}
 
$event = new Event();
$func = $event->getFunction();
echo "Hello, ", $func();

هذا المثال يشرح كيفية استخدام الـ closures للوصول إلى الـ scope الخاص بالمتغيّر.

بما أن الخاصيَّة name تعتبر (Private) خاصّة. أي لا يمكننا الوصول إليها إلا من داخل الـ Event Class فقط. قمنا هنا بإنشاء دالة باسم getFunction وجعلنا القيمة المُعادة (Return Value) عبارة عن (closures function) تسترجع خاصية الاسم name.

المثال الثاني:

1
2
3
4
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// outputs helloWorld

لاحظ هنا أن الـ closures يُمكن استخدامها أيضاً كقيم متغيّرات هنا.

في هذا المثال البسيط للغاية: استخدمنا دالة مجهولة لتغيير الحرف w من صغير إلى كبير.

المثال الثالث:

1
2
3
4
5
6
7
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};
 
$greet('World');
$greet('PHP');

هذا المثال البسيط يشرح طريقة استخدام الـ closures كقيمة لمتغيّر.

الوصول إلى أعضاء الصنف (Member class) بواسطة تمثيل الكائن (instantiation)

كما نعرف يمكننا تمثيل الكائن بواسطة الكلمة المفتاحية (new). ما قبل الإصدار 5.4 من PHP لم يكن بإمكاننا الوصول إلى الطرق والخواص الخاصة بالكائن بدون تمثيل الكائن (عمل new  له).

لكن ما رأيك أننا الآن نستطيع الوصول إلى أعضاء الكائن (الطرق Method والخواص Propierties) من الكلمة المفتاحية (new) ذاتها، أي بدون عمل تمثيل (instantiation).

1
2
3
4
class myClass {
	public $name = "Ahmad";
}
echo (new myClass())->name;

إلى اللقاء مع الجزء الثاني من السلسلة :-)

تعليق واحد

تعليقك على الموضوع

خلاصات التعليقات RSS   التعقيبات

جميع الحقوق محفوظة لـ مدونة أحمد المياحي © 2017