الفرق بين المراجعتين لصفحة: «PHP/eval»
رؤيا-بنعطية (نقاش | مساهمات) لا ملخص تعديل |
رؤيا-بنعطية (نقاش | مساهمات) تعديلات طفيفة على التنسيق |
||
(1 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 14: | سطر 14: | ||
== العوامل == | == العوامل == | ||
=== code === | === <code>code</code> === | ||
شيفرة PHP صحيحة بنويًا لكي تُقدَّر قيمتها. | شيفرة PHP صحيحة بنويًا لكي تُقدَّر قيمتها. | ||
سطر 21: | سطر 21: | ||
يجب أن تكون الشيفرة المُمَرَّرة شيفرة PHP صالحة. وهذا يعني ضرورة إنهاء جميع العبارات بشكل صحيح باستخدام فاصلة منقوطة. ستسبب العبارة <code>'echo "Hi!"'</code> على سبيل المثال خطأ <code>parse error</code>، في حين أنَّ العبارة <code>'echo "Hi!";'</code> ستعمل. | يجب أن تكون الشيفرة المُمَرَّرة شيفرة PHP صالحة. وهذا يعني ضرورة إنهاء جميع العبارات بشكل صحيح باستخدام فاصلة منقوطة. ستسبب العبارة <code>'echo "Hi!"'</code> على سبيل المثال خطأ <code>parse error</code>، في حين أنَّ العبارة <code>'echo "Hi!";'</code> ستعمل. | ||
ستُنهي عبارةُ <code>return</code> فوراً تَقديرَ الشيفرة البرمجية. | ستُنهي عبارةُ <code>[[PHP/return|return]]</code> فوراً تَقديرَ الشيفرة البرمجية. | ||
ستُنفَّذ الشيفرة في نفس مجال الشيفرة التي استدعت البنية <code>eval()</code>. وبالتالي فإن أي متغيرات عُرِّفَت أو غُيّرَتْ عند استدعاء البنية <code>eval()</code> ستبقى مرئيةً بعد أن ينتهي تنفيذها. | ستُنفَّذ الشيفرة في نفس مجال الشيفرة التي استدعت البنية <code>eval()</code>. وبالتالي فإن أي متغيرات عُرِّفَت أو غُيّرَتْ عند استدعاء البنية <code>eval()</code> ستبقى مرئيةً بعد أن ينتهي تنفيذها. | ||
== القيم المعادة == | == القيم المعادة == | ||
تعيد البنية <code>eval()</code> القيمة <code>NULL</code> ما لم تستدعَ <code>return</code> في الشيفرة التي ستُقدَّر قيمتها، وإلا فهي ستعيد القيمة المُمَرَّرَة لعبارة <code>return</code>. | تعيد البنية <code>eval()</code> القيمة <code>[[PHP/null|NULL]]</code> ما لم تستدعَ <code>[[PHP/return|return]]</code> في الشيفرة التي ستُقدَّر قيمتها، وإلا فهي ستعيد القيمة المُمَرَّرَة لعبارة <code>[[PHP/return|return]]</code>. | ||
بدءًا من PHP 7، إذا كان هناك خطأ في تحليل الشيفرة المُمرَّرة إلى البنية <code>eval()</code>، فإن البنية <code>eval()</code> ستُطلِق الاستثناء <code>ParseError</code>. أما قبل الإصدار PHP 7، فكانت ستعيد البنية اللغوية <code>eval()</code> القيمة <code>FALSE</code> ويستمر تنفيذ ما يليها من شيفرات طبيعيًا. ليس من الممكن التقاط خطأ <code>parse error</code> في <code>eval()</code> باستخدام <code>set_error_handler()</code>. | بدءًا من PHP 7، إذا كان هناك خطأ في تحليل الشيفرة المُمرَّرة إلى البنية <code>eval()</code>، فإن البنية <code>eval()</code> ستُطلِق الاستثناء <code>ParseError</code>. أما قبل الإصدار PHP 7، فكانت ستعيد البنية اللغوية <code>eval()</code> القيمة <code>FALSE</code> ويستمر تنفيذ ما يليها من شيفرات طبيعيًا. ليس من الممكن التقاط خطأ <code>parse error</code> في <code>eval()</code> باستخدام <code>[[PHP/set error handler|set_error_handler()]]</code>. | ||
== أمثلة == | == أمثلة == | ||
المثال 1: مثال على استخدام <code>eval()</code> لدمج نص بسيط<syntaxhighlight lang="php"> | المثال 1: مثال على استخدام <code>eval()</code> لدمج نص بسيط<syntaxhighlight lang="php"> | ||
<?php | <?php | ||
$string = 'cup'; | $string = 'cup'; | ||
$name = 'coffee'; | $name = 'coffee'; | ||
$str = 'This is a $string with my $name in it.'; | $str = 'This is a $string with my $name in it.'; | ||
echo $str. "\n"; | echo $str. "\n"; | ||
eval("\$str = \"$str\";"); | eval("\$str = \"$str\";"); | ||
echo $str. "\n"; | echo $str. "\n"; | ||
?> | ?> | ||
</syntaxhighlight>ناتج المثال السابق:<syntaxhighlight lang=" | </syntaxhighlight>ناتج المثال السابق:<syntaxhighlight lang="text"> | ||
This is a $string with my $name in it. | This is a $string with my $name in it. | ||
This is a cup with my coffee in it. | This is a cup with my coffee in it. | ||
</syntaxhighlight> | </syntaxhighlight> |
المراجعة الحالية بتاريخ 14:06، 29 مايو 2018
(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 المُمرَّرة في المعامل الأول.