الفرق بين المراجعتين لصفحة: «PHP/eval»

من موسوعة حسوب
< PHP
المساهمة في ترجمة الصفحة
 
تعديلات طفيفة على التنسيق
 
(4 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة)
سطر 1: سطر 1:
= البنية eval()‎ في PHP =
<noinclude>{{DISPLAYTITLE:البنية <code>eval()</code>‎ في PHP}}</noinclude>
(PHP 4, PHP 5, PHP 7)
(PHP 4, PHP 5, PHP 7)


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


== الوصف ==
== الوصف ==
سطر 8: سطر 8:
mixed eval ( string $code )
mixed eval ( string $code )


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


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


== العوامل ==
== العوامل ==


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


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


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


ستُنهي عبارةُ return فوراً تَقديرَ الشيفرة البرمجية.
ستُنهي عبارةُ <code>[[PHP/return|return]]</code> فوراً تَقديرَ الشيفرة البرمجية.


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


== القيم المعادة ==
== القيم المعادة ==
تعيد البنية eval()‎ القيمة NULL ما لم تستدعَ return في الشيفرة التي ستُقدَّر قيمتها، وإلا فهي ستعيد القيمة المُمَرَّرَة لعبارة return.
تعيد البنية <code>eval()‎</code> القيمة <code>[[PHP/null|NULL]]</code> ما لم تستدعَ <code>[[PHP/return|return]]</code> في الشيفرة التي ستُقدَّر قيمتها، وإلا فهي ستعيد القيمة المُمَرَّرَة لعبارة <code>[[PHP/return|return]]</code>.


بدءًا من PHP 7، إذا كان هناك خطأ في تحليل الشيفرة المُمرَّرة إلى البنية eval()‎، فإن البنية eval()‎ ستُطلِق الاستثناء ParseError. أما قبل الإصدار PHP 7، فكانت ستعيد البنية اللغوية eval()‎ القيمة FALSE ويستمر تنفيذ ما يليها من شيفرات طبيعيًا. ليس من الممكن التقاط خطأ parse error في eval()‎ باستخدام set_error_handler()‎.
بدءًا من 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: مثال على استخدام eval()‎ لدمج نص بسيط<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="php">
</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>


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


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


== انظر أيضًا ==
== انظر أيضًا ==
* الدالة call_user_func()‎: استدعاء دالةَ رد النداء callback المُمرَّرة في المعامل الأول.
* الدالة <code>[[PHP/call user func|call_user_func()‎]]</code>: استدعاء دالةَ رد النداء callback المُمرَّرة في المعامل الأول.


== مصادر ==
== مصادر ==
* [http://php.net/manual/en/function.eval.php صفحة البنية eval في توثيق PHP الرسمي.]
* [http://php.net/manual/en/function.eval.php صفحة البنية eval في توثيق PHP الرسمي.]
[[تصنيف:PHP]]
[[تصنيف:PHP Function]]
[[تصنيف:PHP Miscellaneous]]

المراجعة الحالية بتاريخ 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 المُمرَّرة في المعامل الأول.

مصادر