في PHP ، هل هناك أي مزايا لاستخدام forward_static_call_array () بدلاً من call_user_func_array () عند استدعاء طريقة ثابتة بشكل ديناميكي؟
سؤال
على وجه التحديد ، هل أحدهما أكثر كفاءة من الآخر؟
المحلول
يوجد في Leat اختلافين بين forward_static_call_array
و call_user_func_array
:
- الأول موجود فقط منذ 5.3 PHP
- يجب استدعاء أول واحد من داخل الفصل
بعد ذلك ، أفترض أن هناك بعض الاختلافات المتعلقة بالربط الثابت المتأخر ، تم تقديمه باستخدام PHP 5.3.
في الواقع ، إذا ألقيت نظرة فاحصة على المثال المحدد ، فيبدو أنه بالضبط: "سياق" الفصل الذي تستخدمه forward_static_call_array
هو "الاحتفاظ" ، في الطريقة المدعوة.
النظر في هذا الجزء من التعليمات البرمجية ، هذا مشتق من المثال المحدد:
class A {
const NAME = 'A';
public static function test() {
$args = func_get_args();
echo static::NAME, " ".join(',', $args)." \n"; // Will echo B
}
}
class B extends A {
const NAME = 'B';
public static function test() {
echo self::NAME, "\n"; // B
forward_static_call_array(array('A', 'test'), array('more', 'args'));
}
}
B::test('foo');
ستحصل على هذا الإخراج:
B
B more,args
أي من الطريقة في الفئة أ ، أنت "تعرف" ، عبر static::
الكلمة الرئيسية ، أنك "قادمة من B".
الآن ، إذا حاولت أن تفعل الشيء نفسه مع call_user_func
:
class B extends A {
const NAME = 'B';
public static function test() {
echo self::NAME, "\n"; // B
call_user_func_array(array('A', 'test'), array('more', 'args'));
}
}
(لا يتغير بقية الكود)
ستحصل على هذا الإخراج:
B
A more,args
لاحظ ال أ على السطر الثاني! مع forward_static_call_array
, ، لم تحصل على أ, ، لكن أ ب.
هذا هو الفرق : forward_static_call_array
إعادة توجيه السياق الثابت إلى الطريقة التي تسمى ، بينما call_user_func_array
لا.
حول سؤال الكفاءة الخاص بك: ليس لدي أي فكرة - يجب عليك القياس ؛ لكن هذا ليس هو النقطة: النقطة المهمة هي أن هاتين الوظيفتين لا تفعلان نفس الشيء.