سؤال

أتساءل عما إذا كان بإمكاني استخدام متغير ثابت للتحسين:

public function Bar() {
    static $i = moderatelyExpensiveFunctionCall();
    if ($i) {
        return something();
    } else {
        return somethingElse();
    }
}

أعلم ذلك مرة واحدة $i تتم تهيئته ، ولن يتم تغييره بواسطة هذا السطر من الكود على المكالمات المتتالية إلى Bar(). أنا تولى القيام هذا يعني ذاك moderatelyExpensiveFunctionCall() لن يتم تقييمها في كل مرة أتصل فيها ، لكنني أود أن أعرف على وجه اليقين.

بمجرد أن يرى PHP متغيرًا ثابتًا تمت تهيئته ، هل يتخطى هذا السطر من الكود؟ بمعنى آخر ، هل سيؤدي ذلك إلى تحسين وقت التنفيذ الخاص بي إذا قمت بإجراء الكثير من المكالمات Bar(), أم أنا أضيع وقتي؟

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

المحلول

أجد أنه من الأسهل فعل شيء مثل الكود أدناه. وبهذه الطريقة يتم التخزين المؤقت على مستوى العالم بدلاً من تنفيذ الوظيفة.

function moderatelyExpensiveFunctionCall()
{
   static $output = NULL;
   if( is_null( $output ) ) {
     //set $output
   }
   return $output;
}

نصائح أخرى

static $i = blah() لن يتم تجميعها ، لأن PHP لا يسمح بالتعبيرات ومكالمات الوظائف في المهيئات الثابتة. أنت بحاجة إلى شيء مثل

function foo() {
   static $cache = null;

   if(is_null($cache)) $cache = expensive_func();

   do something with $cache
}

يجب أن يعمل هذا في حالتك (بسيطة جدًا):

function your_function() {
    static $output;

    if (!isset($output)) {
       $output = 'A very expensive operation';
    }

    return $output;
}

أما بالنسبة لآلية التخزين المؤقت العالمية ، يمكنك استخدام طريقة مشابهة لطريقة هذا.

هنا نهج أقصر تماما:

function stuff()
{
    static $smthg = []; // or null, or false, or something else
    if ($smthg) {
        return $smthg;
    }

    // filling $smthg goes here 
    // with a lot of 
    // code strings

    return $smthg;
}

ماذا عن:

if (!isset($i))
{
    static $i = moderatelyExpensiveFunctionCall();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top