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