get_called_class اختراق لا يعمل مع eval-code
-
27-09-2019 - |
سؤال
أنا أستخدم أ ge_called_class
اختراق للسماح بالربط الثابت المتأخر في الإصدار 5.2 PHP (تم العثور عليه هنا).
لدي ما يلي في الكود الخاص بي:
# db_record.php
$ac = "ForumThread";
$objects = $ac::find("all");
هذا لن يعمل في PHP 5.2 لسبب ما ، لذلك فعلت هذا:
# db_record.php
$ac = "ForumThread";
eval("\$objects = {$ac}::find('all');");
هذا من ناحية أخرى لن يعمل مع get_called_class
وظيفة. أحصل على خطأ في أن file
لا يمكن أن تقرأ الوظيفة القسم الذي تم تقييمه من التعليمات البرمجية.
المحلول
إذا كنت تستخدم Eval ، فإن الحل الخاص بك خاطئ.
لماذا لا يعمل نسختك غير eval؟ ما هو الخطأ؟ ما هي رسالة الخطأ الكاملة والكاملة؟
نسخة من المستخدمين من get_called_class
يقوم بإجراء الخلفية ويحاول فتح ملف المتصل لتحديد اسم الفصل. السبب في فشل EVAL هو أن REATH BACKTRACE لا يوفر اسم ملف.
(تحرير: أيضا ، ذلك get_called_class
الاختراق هو الاختراق إلى حد كبير. هل هناك سبب لا يمكنك استخدام 5.3؟)
هل حاولت استخدام call_user_func? call_user_func(array($ac, 'find'), 'all')
ينبغي استدعاء الطريقة الثابتة find
لاسم الفصل الوارد في $ac
مع الباراماتير 'all'
. انظر أيضا من النوع الزائف من النوع ، ومثال "النوع 2" في محددة