PHP дополнительные аргументы функции с массивом. Как кодировать / Лучший способ кодировать?

Переменная является просто местоположением на стеке. Попытайтесь сохранить свои переменные с максимально небольшим объемом и попытаться сделать их окончательными. Однако объемом и финалом являются просто вещи исходного кода... от генерации кода/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

}
7
задан Ross 25 September 2009 в 11:49
поделиться

7 ответов

это парсер проблема.

10
ответ дан 6 December 2019 в 05:01
поделиться

Вы можете использовать массив значений по умолчанию, а затем объединить массив аргументов со значениями по умолчанию. Значения по умолчанию будут отменены, если они появятся в массиве аргументов. Простой пример:

$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'];
}
27
ответ дан 6 December 2019 в 05:01
поделиться

В этом случае рекомендуется использовать массив в качестве аргумента. Однако вы можете немного упростить код в функции, используя тернарный оператор ( 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;
}

}

4
ответ дан 6 December 2019 в 05:01
поделиться

Я думаю, что пример хорош. Я не думаю, что здесь нужно провести еще большую оптимизацию, за исключением, возможно, исключения нескольких скобок.

при желании вы можете проверить функцию извлечения в PHP

0
ответ дан 6 December 2019 в 05:01
поделиться

Попробуйте следующее:

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
}
0
ответ дан 6 December 2019 в 05:01
поделиться

Вы можете сделать все элементы массива параметрами функции. Проверьте, является ли первый массив в функции, и если да, извлеките массив.

 function addLinkPost($title = null, $url = null, $caption = null, $publish = null, $postDate = null, $tagString = null)
 {
      if(is_array($title)) {
           extract($title);
      }

      ....
 }

Возможно, это сделает код более понятным.

0
ответ дан 6 December 2019 в 05:01
поделиться

Как насчет:

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 , он будет перезаписан глобальные $ по умолчанию .

0
ответ дан 6 December 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: