Dizisi ile PHP isteğe bağlı fonksiyon argümanları.

7 Cevap php

Ben bu daha iyi olduğuna eminim. Herhangi bir yardım büyük takdir edilecektir.

Ben argüman içerir ve tüm argümanları isteğe bağlı bir php işlevin bir dizi geçmek istiyorum. Ben kodu ateşleyiciye kullanarak ve hiçbir şekilde bir uzman tarafından duyuyorum ediyorum. Aşağıda ben şimdiye kadar kullanmakta olan budur:

function addLinkPost($postDetailArray) {

	if (isset($postDetailArray['title'])) {
		$title = $postDetailArray['title']; }
	else {
		$title = "Error: No Title";
	}

	if (isset($postDetailArray['url'])) {
		$url 		= $postDetailArray['url'];
	} else {
		$url		= "no url";
	}
	if (isset($postDetailArray['caption'])) {
		$caption 	= $postDetailArray['caption'];
	} else {
		$caption 	= "";
	}
	if (isset($postDetailArray['publish'])) {
		$publish 	= $postDetailArray['publish'];
	} else {
		$publish	= TRUE;
	}
	if (isset($postDetailArray['postdate'])) {
		$postdate 	= $postDetailArray['postdate'];
	} else {
		$postdate 	= "NOW()";
	}
	if (isset($postDetailArray['tagString'])) {
		$tagString	= $postDetailArray['tagString'];
	} else {
		$tagString = "";
	}

7 Cevap

Bunu şöyle yapabiliriz:

function addLinkPost(array $postDetailArray)
{
    $fields = array(
        'key' => 'default value',
        'title' => 'Error: No Title',
    );

    foreach ($fields as $key => $default) {
        $$key = isset($postDetailArray[$key]) ? $postDetailArray[$key] : $default;
    }
}

Sadece anahtar ve varsayılan değeri ile $ alanlar diziyi düzenlemek.

Sen varsayılan bir dizi kullanmak ve daha sonra varsayılan ile argüman dizi birleştirebilirsiniz. Onlar argüman dizide görülürse varsayılan geçersiz olacaktır. Basit bir örnek:

$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
)

*/

Senin durumunda, olurdu:

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'];
}

Bir argüman olarak dizi kullanarak bu durumda iyi bir fikirdir. Ancak, işlev kodu basitleştirmek verebilecek üçlü operatörünü kullanarak bir bit (http://dk.php.net/ternary):

$ Title = isset ($ postDetailArray ['title'])? $ PostDetailArray ['title']: 'Hata: No Title';

Hatta daha aşağıdakileri yaparak bunu basitleştirmek olabilir:

function addLinkPost($data) {

$arguments = array('title', 'url', 'caption', 'publish', 'postdate', 'tagString');

foreach ($arguments as $value) {
    $$value = isset($data[$value]) ? $data[$value] : 'Error: No '.$value;
}

}

i örnek gayet iyi olduğunu düşünüyorum. Ben burada yapılması gereken daha çok optimizasyon belki birkaç parantez bırakarak hariç, orada olduğunu sanmıyorum.

isteğe bağlı olarak, size PHP özü fonksiyonunu kontrol edebilirsiniz

Bu deneyin:

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
}

Sen fonksiyon dizi parametreleri tüm unsurları yapabilir. Ilk fonksiyonu bir dizi olup olmadığını kontrol edin ve eğer öyleyse, dizi ayıklayın.

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

      ....
 }

Belki biraz daha açık kod yapar.

Nasıl hakkında:

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'], '');
}

ya da seçenek olarak:

$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;
  }
}

Eğer 'varsayılan' bir dizi anahtarı varsa $defaults, bu küresel $defaults üzerine yazılır uyaran biri ile.