البنية eval()‎ في PHP

من موسوعة حسوب
< PHP
اذهب إلى التنقل اذهب إلى البحث

(PHP 4, PHP 5, PHP 7)

تُقدِّر البنيةُ eval()‎ قيمة شيفرة PHP المُمثَّلة في سلسلةٍ نصيةٍ

الوصف

mixed eval ( string $code )

تُقدِّر البنيةُ eval()‎ قيمة شيفرة PHP المُمثَّلة في سلسلةٍ نصيةٍ.

تحذير: إن البنية eval()‎ خطيرة للغاية لأنها تسمح بتنفيذ أي شيفرة مكتوبة بلغة PHP اعتباطيًا. وبالتالي لا يُنصَح باستعمالها. إذا كنت قد تحققت من عدم وجود خيار آخر سوى استخدام هذه البِنْيَة، فَأَوْلِ اهتمامًا خاصًا لعدم تمرير أي بيانات مقدمة من المستخدم إليها دون التحقق من صحتها مسبقًا.

العوامل

code

شيفرة PHP صحيحة بنويًا لكي تُقدَّر قيمتها.

يجب ألا توضع الشيفرة بين وسمَي البداية والنهاية الخاصين بلغة PHP، فمثلا يجب تمرير 'echo "Hi!";‎' بدلاً من ‏‎'<?php echo "Hi!"; ?>'‎. من الممكن الخروج من وضع PHP و الدخول في وضع HTML كما هو الحال في الشيفرات العادية، على سبيل المثال، 'echo "In PHP mode!"; ?>In mode!<?php echo "Back in PHP mode!";‎'.

يجب أن تكون الشيفرة المُمَرَّرة شيفرة PHP صالحة. وهذا يعني ضرورة إنهاء جميع العبارات بشكل صحيح باستخدام فاصلة منقوطة. ستسبب العبارة 'echo "Hi!"‎' على سبيل المثال خطأ parse error، في حين أنَّ العبارة 'echo "Hi!";‎' ستعمل.

ستُنهي عبارةُ return فوراً تَقديرَ الشيفرة البرمجية.

ستُنفَّذ الشيفرة في نفس مجال الشيفرة التي استدعت البنية eval()‎. وبالتالي فإن أي متغيرات عُرِّفَت أو غُيّرَتْ عند استدعاء البنية eval()‎ ستبقى مرئيةً بعد أن ينتهي تنفيذها.

القيم المعادة

تعيد البنية eval()‎ القيمة NULL ما لم تستدعَ return في الشيفرة التي ستُقدَّر قيمتها، وإلا فهي ستعيد القيمة المُمَرَّرَة لعبارة return.

بدءًا من PHP 7، إذا كان هناك خطأ في تحليل الشيفرة المُمرَّرة إلى البنية eval()‎، فإن البنية eval()‎ ستُطلِق الاستثناء ParseError. أما قبل الإصدار PHP 7، فكانت ستعيد البنية اللغوية eval()‎ القيمة FALSE ويستمر تنفيذ ما يليها من شيفرات طبيعيًا. ليس من الممكن التقاط خطأ parse error في eval()‎ باستخدام set_error_handler().

أمثلة

المثال 1: مثال على استخدام eval()‎ لدمج نص بسيط

<?php
$string = 'cup';
$name = 'coffee';
$str = 'This is a $string with my $name in it.';
echo $str. "\n";
eval("\$str = \"$str\";");
echo $str. "\n";                            
?>

ناتج المثال السابق:

This is a $string with my $name in it.
This is a cup with my coffee in it.

ملاحظات

ملاحظة: نظرًا لأن eval بنية من بنى اللغة (language construct) وليست دالةً، فلا يمكن استدعاؤها باستخدام الدوال المتغيرة.

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

ملاحظة: في حالة حدوث خطأ فادح (fatal error) في الشيفرة التي ستُقدَّر قيمتها، فسينتهي تنفيذ البرنامج بالكامل.

انظر أيضًا

  • الدالة call_user_func()‎: استدعاء دالةَ رد النداء callback المُمرَّرة في المعامل الأول.

مصادر