في PHP ، هل هناك أي مزايا لاستخدام forward_static_call_array () بدلاً من call_user_func_array () عند استدعاء طريقة ثابتة بشكل ديناميكي؟

StackOverflow https://stackoverflow.com/questions/2343974

  •  23-09-2019
  •  | 
  •  

سؤال

على وجه التحديد ، هل أحدهما أكثر كفاءة من الآخر؟

هل كانت مفيدة؟

المحلول

يوجد في 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 لا.


حول سؤال الكفاءة الخاص بك: ليس لدي أي فكرة - يجب عليك القياس ؛ لكن هذا ليس هو النقطة: النقطة المهمة هي أن هاتين الوظيفتين لا تفعلان نفس الشيء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top