Переменная является просто местоположением на стеке. Попытайтесь сохранить свои переменные с максимально небольшим объемом и попытаться сделать их окончательными. Однако объемом и финалом являются просто вещи исходного кода... от генерации кода/VM точка зрения, они действительно не имеют значения вообще.
В Вашем определенном примере, не используя "интервал" никакой мусор не создается. Однако, если бы это были объекты, создаваемые тогда для обоих случаев количество мусора и когда мусор имел бы право на очистку, было бы идентично.
Берут следующий код:
public class X
{
public static void main(final String[] argv)
{
foo();
bar();
}
private static void foo()
{
for(int i=0;i<5;i++)
{
final int myFinalVariable = i;
}
}
private static void bar()
{
for(int i=0;i<5;i++)
{
int myFinalVariable = i;
}
}
}
компилятор производит идентичный байт-код для каждого метода:
public class X extends java.lang.Object{
public X();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #2; //Method foo:()V
3: invokestatic #3; //Method bar:()V
6: return
private static void foo();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iconst_5
4: if_icmpge 15
7: iload_0
8: istore_1
9: iinc 0, 1
12: goto 2
15: return
private static void bar();
Code:
0: iconst_0
1: istore_0
2: iload_0
3: iconst_5
4: if_icmpge 15
7: iload_0
8: istore_1
9: iinc 0, 1
12: goto 2
15: return
}
Добавление другого метода, который объявляет, переменная вне цикла дает Вам немного отличающийся байт-код из-за порядка, которым переменные объявляются). Обратите внимание, что эта версия переменная не может быть сделана окончательной. Эта последняя версия не является лучшим способом (последняя переменная в цикле является лучшей, если можно сделать это):
private static void car()
{
int myFinalVariable;
for(int i=0;i<5;i++)
{
myFinalVariable = i;
}
}
private static void car();
Code:
0: iconst_0
1: istore_1
2: iload_1
3: iconst_5
4: if_icmpge 15
7: iload_1
8: istore_0
9: iinc 1, 1
12: goto 2
15: return
}
Вы можете использовать массив значений по умолчанию, а затем объединить массив аргументов со значениями по умолчанию. Значения по умолчанию будут отменены, если они появятся в массиве аргументов. Простой пример:
$defaults = array(
'foo' => 'aaa',
'bar' => 'bbb',
'baz' => 'ccc',
);
$options = array(
'foo' => 'ddd',
);
$merged = array_merge($defaults, $options);
print_r($merged);
/*
Array
(
[foo] => ddd
[bar] => bbb
[baz] => ccc
)
*/
В вашем случае это будет:
function addLinkPost($postDetailArray) {
static $defaults = array(
'title' => 'Error: No Title',
'url' => 'no url',
'caption' => '',
'publish' => true,
'postdate' => 'NOW()',
'tagString' => '',
);
$merged = array_merge($defaults, $postDetailArray);
$title = $merged['title'];
$url = $merged['url'];
$caption = $merged['caption'];
$publish = $merged['publish'];
$postdate = $merged['postdate'];
$tagString = $merged['$tagString'];
}
В этом случае рекомендуется использовать массив в качестве аргумента. Однако вы можете немного упростить код в функции, используя тернарный оператор ( http://dk.php.net/ternary ):
$ title = isset ($ postDetailArray ['title '])? $ postDetailArray ['title']: 'Ошибка: нет заголовка';
Вы можете еще больше упростить его, выполнив следующие действия:
function addLinkPost($data) {
$arguments = array('title', 'url', 'caption', 'publish', 'postdate', 'tagString');
foreach ($arguments as $value) {
$$value = isset($data[$value]) ? $data[$value] : 'Error: No '.$value;
}
}
Я думаю, что пример хорош. Я не думаю, что здесь нужно провести еще большую оптимизацию, за исключением, возможно, исключения нескольких скобок.
при желании вы можете проверить функцию извлечения в PHP
Попробуйте следующее:
function addLinkPost($postDetailArray) {
foreach($array as $key=>$value){
$$key = (isset($value) && !empty($value)) ? $value : ('no '.$key);
}
//all keys are available as variables
var_dump($url); var_dump($publish); //etc
}
Вы можете сделать все элементы массива параметрами функции. Проверьте, является ли первый массив в функции, и если да, извлеките массив.
function addLinkPost($title = null, $url = null, $caption = null, $publish = null, $postDate = null, $tagString = null)
{
if(is_array($title)) {
extract($title);
}
....
}
Возможно, это сделает код более понятным.
Как насчет:
function getdefault($value, $default = null) {
return isset($value) ? $value : $default;
}
function addLinkPost($postDetailArray) {
$title = getdefault($postDetailArray['title'], 'Error: No Title');
$url = getdefault($postDetailArray['url'], 'no url');
$caption = getdefault($postDetailArray['caption'], '');
$publish = getdefault($postDetailArray['publish'], TRUE);
$postdate = getdefault($postDetailArray['postdate'], 'NOW()');
$tagString = getdefault($postDetailArray['tagString'], '');
}
или альтернативно:
$defaults = array(
'title' => 'Error: No Title',
'url' => 'no url',
'caption' => '',
'publish' => TRUE,
'postdate' => 'NOW()',
'tagString' => '',
);
function addLinkPost($postDetailArray) {
global $defaults;
foreach ($defaults as $k => $v) {
$$k = isset($postDetailArray[$k]) ? $postDetailArray[$k] : $v;
}
}
С одним предупреждением о том, что если у вас есть ключ массива «defaults» в $ defaults
, он будет перезаписан глобальные $ по умолчанию
.