PHP create_function() مقابل استخدام eval() فقط
-
03-07-2019 - |
سؤال
في PHP لديك الدالة create_function() التي تنشئ دالة لامدا مسماة فريدة مثل هذا:
$myFunction = create_function('$foo', 'return $foo;');
$myFunction('bar'); //Returns bar
هل هذا في الواقع أفضل (بصرف النظر عن كونه أكثر سهولة) ثم القيام بما يلي:
do{
$myFunction = 'createdFunction_'.rand();
}
while(function_exists($myFunction));
eval("function $myFunction(\$foo) { return \$foo; }");
$myFunction('bar'); //Returns bar
هل create_function أفضل حقًا؟(بغض النظر عن حقيقة أنه أكثر سهولة)
المحلول
في فهمي للمستندات ذات الصلة، [1] وكلاهما تفعل الشيء نفسه، create_function () ويأتي للتو مع اسم وظيفة فريدة من نوعها بالنسبة لك.
لمعالجة بعض تعليقات أخرى على هذا السؤال:
<اقتباس فقرة>ويمكن تعيين create_function إلى متغير جعل وظيفة الوصول إلى أجزاء أخرى من التعليمات البرمجية الخاصة بك، في حين أن وحدة التقييم مفيد فقط لنطاق معين.
اقتباس فقرة>قد يكون جيدا أن وحدة التقييم () يعمل في النطاق الحالي، ولكن التعاريف وظيفة يحصل ملقاة في مساحة الاسم العالمي على أية حال. [2] لذلك كلما قمت بتعريف وظيفة، وسوف تكون متاحة في أي مكان آخر في البرنامج.
<اقتباس فقرة>وعن طريق وحدة التقييم () سوف فوضى القائمة وظيفة العالمية، create_function () سوف لا
اقتباس فقرة>وcreate_function () إرجاع فقط سلسلة مع اسم وظيفة جديدة، [3] وليس بعض خاص نوع الاستدعاء. لذا، فإن كلا تقنيات تلوث مساحة العمومي.
وحتى لا، وبصرف النظر عن create_function () كونه أسهل، فإنه لا يبدو أن هناك أي أفضل من وحدة التقييم ().
والحواشي:
[1] http://au2.php.net/manual /en/functions.user-defined.php . http://au.php.net/create_function . http://au.php.net/eval
[2] http://au2.php.net/manual /en/functions.user-defined.php
نصائح أخرى
سيؤدي استخدام eval() إلى حدوث فوضى في قائمة الوظائف العامة، بينما لن يؤدي استخدام create_function() إلى حدوث فوضى، وبصرف النظر عن ذلك لا يوجد فرق كبير. لكن, ، تتطلب كلتا الطريقتين كتابة نص الوظيفة داخل سلسلة PHP المعرضة للخطأ، وإذا كنت تعمل في مشروعي، فسأطلب منك فقط الإعلان عن وظيفة مساعدة باستخدام بناء الجملة العادي.
يتم تنفيذ الوظائف المجهولة في PHP بشكل سيء للغاية مما يجعل الكود الخاص بك أفضل حالًا بالفعل لا استخدمهم.(ولحسن الحظ سيتم إصلاح هذا في PHP 5.3).
وشخصيا، لقد وجدت أن create_function () غير مفيد للغاية عندما يكون الترتيب المصفوفات.
في الواقع، أنا فقط بحثت على شبكة الإنترنت، ويبدو أن الوثائق PHP لديها خير مثال على ذلك.
http://us.php.net/create_function
وانتقل لأسفل إلى <م> مثال رقم 3 وظائف عن طريق مجهول وظائف رد م>.
ويمكن تعيين create_function
إلى متغير جعل وظيفة الوصول إلى أجزاء أخرى من التعليمات البرمجية الخاصة بك، في حين eval
هو مفيد فقط لنطاق معين.
(وبصرف النظر عن حقيقة أنها هي أكثر سهولة)
وأنا لا أفهم كيف يمكن استبعاد هذا بهذه السهولة. نظرا لديك مثالين، وهو أسهل للفهم في لمحة؟ Create_function يقول لك ما كنت تنوي تحقيقه. وحدة التقييم لا.