2018/06/19

靜態變數

雖然現在提倡物件導向,但偶爾也會有一些特殊情況會重複性的呼叫一些 function,如果在一個數量為 10 的迴圈裡面呼叫一個 function,那該 function 就會被 call 十次,假設該 function 的某些結果,例如說撈取資料是同一件事的話,其實沒必要也呼叫十次,PHP 的 static 可以很有效率的解決這件事情

PHP
<?php

function getData($number)
{
    static $dataFromDatabase;

    if (!isset($dataFromDatabase)) {
        echo 'init', PHP_EOL;
        $dataFromDatabase = 'This is data';
    }

    return sprintf(
        '%s %s',
        $dataFromDatabase,
        $number
    );
}

for ($i = 0; $i < 10; $i++) {
    echo getData($i), PHP_EOL;
}

執行結果

init
This is data 0
This is data 1
This is data 2
This is data 3
This is data 4
This is data 5
This is data 6
This is data 7
This is data 8
This is data 9

假如把 static $dataFromDatabase; 拿掉就會看到十次 init,對固定資料來講的話就是很沒必要的資源浪費,python 以及 node.js 沒有這樣的宣告方式,但有轉彎的作法

python
# -*- coding: utf-8 -*-

def get_data(number):
    if not hasattr(get_data, 'data_from_database'):
        print('init')
        get_data.data_from_database = 'This is data'

    return '%s %s' % (get_data.data_from_database, number)

for i in range(10):
    print(get_data(i))
node.js
function getData(number) {
    if (getData.dataFromDatabase === undefined) {
        console.log('init');
        getData.dataFromDatabase = 'This is data';
    }

    return `${getData.dataFromDatabase} ${number}`;
}

for (let i = 0; i < 10; i++) {
    console.log(getData(i));
}

沒有留言: