雖然現在提倡物件導向,但偶爾也會有一些特殊情況會重複性的呼叫一些 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));
}