PHP: Funksiya parametrləri və arqumentləri. Php xətası - foreach() funksiyasının qaytarılması dəyəri üçün etibarsız arqument

Mesajınız düzgündür.

Təəssüf ki, parametrlər siyahısının ən sonunda isteğe bağlı parametrdən istifadə etmək lazımdırsa, hər bir sonuncu parametri təyin etməlisiniz. Tipik olaraq, qarışdırmaq və uyğunlaşdırmaq istəyirsinizsə, onlara "" və ya null standart dəyərlərini verirsiniz və əgər onlar standart dəyərdirsə, onları funksiya daxilində istifadə etmirsiniz.

Varsayılan dəyəri false və ya null kimi göstərməkdən başqa bir arqumenti "keçmək" üçün heç bir yol yoxdur.

PHP-də sintaktik şəkər olmadığından, siz tez-tez belə bir şey görəcəksiniz:

Checkbox_field(array("ad" => "bəzi ad", ....));

Hansı ki, şərhlərdə fəsahətli şəkildə deyildiyi kimi, adlandırılmış arqumentləri təqlid etmək üçün massivlərdən istifadə edir.

Bu, maksimum çeviklik verir, lakin bəzi hallarda lazım olmaya bilər. Ən azı, əksər hallarda gözlənilməz hesab etdiyiniz hər şeyi arqumentlər siyahısının sonuna köçürə bilərsiniz.

Xeyr, bu şəkildə mübahisələri qaçırmaq mümkün deyil. Siz keçən arqumentləri atlaya bilərsiniz yalnızəgər onlar parametrlər siyahısının sonundadırsa.

Bunun üçün rəsmi təklif var idi: https://wiki.php.net/rfc/skipparams, rədd edildi. Təklif səhifəsi bu mövzuda digər SO sualları ilə əlaqələndirilir.

Könüllü arqumentləri ötürmək imkanı ilə bağlı heç nə dəyişməyib, lakin düzgün sintaksis naminə və keçmək istədiyim arqumentlər üçün NULL təyin etmək üçün bunu necə edərdim:

Müəyyən et("DEFAULT_DATA_LIMIT", "50"); müəyyən ("DEFAULT_DATA_PAGE", "1"); /** * getData * məlumat səhifəsini əldə edin * * Parametrlər: * ad - (tələb olunur) əldə etmək üçün verilənlərin adı * limit - (isteğe bağlı) standart limiti əldə etmək üçün NULL göndərin: 50 * səhifə - (isteğe bağlı) NULL göndərin standart səhifəni əldə etmək üçün: 1 * Qaytarır: * massiv kimi verilənlər səhifəsi */ funksiyası getData($name, $limit = NULL, $səhifə = NULL) ( $limit = ($limit==NULL) ? DEFAULT_DATA_LIMIT: $limit; $səhifə = ($səhifə==NULL) DEFAULT_DATA_PAGE: $səhifə;

Onu belə adlandırmaq olar: getData("bəzi ad",NULL,"23"); və gələcəkdə funksiyanı çağıran hər kəs hər dəfə standart dəyərləri və ya onlar üçün elan edilmiş sabiti xatırlamaq məcburiyyətində deyil.

Sadə cavab: Yox. Bəs arqumentləri sıfırlayanda niyə atlayın ki, buna nail olursunuz?

Sizin - " Defolt funksiya arqumentlərinin səhv istifadəsi" və gözlədiyiniz kimi işləməyəcək.

PHP sənədlərindən əlavə qeyd:

Defolt arqumentlərdən istifadə edərkən hər hansı defolt dəyər standart olmayan arqumentlərin sağ tərəfində olmalıdır; əks halda işlər gözlənildiyi kimi olmayacaq.

Aşağıdakıları nəzərdən keçirin:

getData funksiyası($name, $limit = "50", $səhifə = "1") ( "Seçin * KİTABLARDAN HARADA ad = $adı VƏ səhifə = $səhifə limiti $limit"; ) echo getData("bəzi ad" , "", "23"); // gözlənildiyi kimi işləməyəcək

Çıxış belə olacaq:

"Ad = bəzi ad VƏ səhifə = 23 limit olan kitablardan * seçin"

Defolt funksiya arqumentlərinin düzgün istifadəsi aşağıdakı kimi olmalıdır:

getData funksiyası($name, $səhifə = "1", $limit = "50") ( "Seçin * KİTABLARDAN HARADA ad = $adı VƏ səhifə = $səhifə limiti $limit"; ) echo getData("bəzi ad" , "23"); //gözlənildiyi kimi işləyir

Çıxış belə olacaq:

"Ad = bəzi ad VƏ səhifə = 23 limit 50 olan kitablardan * seçin"

Varsayılan olaraq, qeyri-defolt dəyərlərdən sonra, biri müəyyən edilmədikdə/müəyyən edilmədikdə, həmişə həmin dəyişən üçün standart dəyəri ləğv edəcəkdir. İstinad üçün bir keçid və bu nümunələrin haradan gəldiyi budur.

Redaktə: Bunu null digərləri kimi null olaraq təyin etmək işləyə bilər və başqa bir alternativdir, lakin istədiyiniz kimi olmaya bilər. Müəyyən edilmədikdə həmişə standart dəyəri null olaraq təyin edir.

Yuxarıda qeyd edildiyi kimi, seçimləri atlaya bilməyəcəksiniz. Bu cavabı şərhdə yazmaq üçün çox böyük olan bəzi əlavələr etmək üçün yazdım.

@Frank Nocke funksiyanı öz standart parametrləri ilə çağırmağı təklif edir, məsələn, malik

Funksiya a($b=0, $c=NULL, $d="")( //...

istifadə etməlisən

$var = a(0, NULL, "ddd");

ilk iki parametri ($b və $c) buraxmaqla eyni funksiyanı yerinə yetirəcək.

Bunlardan hansının standart dəyərlər olduğu aydın deyil (defolt dəyəri göstərmək üçün 0-a təyin olunub, yoxsa bu vacibdir?).

Standart dəyərlər probleminin xarici (və ya daxili) funksiya ilə əlaqəli olması təhlükəsi də var, burada standart dəyərlər funksiya (və ya metod) müəllifi tərəfindən dəyişdirilə bilər. Beləliklə, proqramda zənginizi dəyişdirməsəniz, təsadüfən onun davranışını dəyişə bilərsiniz.

Bəzi müvəqqəti həll yolu DEFAULT_A_B kimi bəzi qlobal sabitləri müəyyən etmək ola bilər ki, bu da "A funksiyasının B parametri üçün defolt dəyər" və bu kimi "çıxır" olacaq:

$var = a(DEFAULT_A_B, DEFAULT_A_C, "ddd");

Sinif sabitlərini təyin etsəniz, məsələn, qlobal əhatə dairəsinin bir hissəsi olduğu üçün siniflər üçün bu, daha sadə və zərifdir.

Sinif MyObjectClass ( const DEFAULT_A_B = 0; funksiya a($b = self::DEFAULT_A_B)( // metod gövdəsi ) ) $obj = yeni MyObjectClass(); $var = $obj->a(MyObjectClass::DEFAULT_A_B); // və s.

Nəzərə alın ki, bu standart sabit kod ərzində tam olaraq bir dəfə müəyyən edilir (metod bəyanında belə heç bir dəyər yoxdur), buna görə də gözlənilməz dəyişikliklər halında siz həmişə funksiya/metodu düzgün standart dəyərlə təmin edəcəksiniz.

Bu həllin aydınlığı, şübhəsiz ki, oxucuya heç nə deməyən xam defolt dəyərləri (NULL, 0 və s.) təmin etməkdən daha yaxşıdır.

(Razıyam ki, $var = a(,"ddd"); kimi zəng etmək daha yaxşı seçim olardı)

Hər hansı bir itkin parametr üçün (siz) təhlükəsiz tərəfdə olmaq üçün standart parametrlə getməlisiniz.

(Defolt parametrin "" və ya oxşar və ya əksinə olduğu yerdə null üçün qərar vermək sizi problemə salacaq...)

Arqumentləri ötürə bilməzsiniz, lakin massiv parametrlərindən istifadə edə bilərsiniz və yalnız bir parametr təyin etməlisiniz, bu da parametrlər massividir.

Function myfunction($array_param) ( echo $array_param["name"]; echo $array_param["age"]; ............. )

Və istədiyiniz qədər parametr əlavə edə bilərsiniz, onları müəyyən etmək lazım deyil. Bir funksiyanı çağırdığınız zaman parametrlərinizi belə təyin edirsiniz:

Myfunction(massiv("ad" => "Bob","yaş" => "18", .........));

Hər kəsin artıq dediyi kimi, funksiyalara bəzi kod sətirləri əlavə etmədən istədiyiniz şey PHP-də mümkün olmayacaq.

Lakin siz funksiyalarınızı əldə etmək üçün bu kod parçasını funksiyanın yuxarı hissəsinə yerləşdirə bilərsiniz:

Foreach((yeni ReflectionFunction(debug_backtrace()["funksiya"]))->getParameters() $param kimi) ( if(empty($($param->getName())) && $param->isOptional()) $($param->getName()) = $param->getDefaultValue();

Beləliklə, əsasən debug_backtrace() ilə mən bu kodun yerləşdirildiyi funksiyanın adını alıram, sonra bütün funksiya arqumentləri ilə birlikdə yeni ReflectionFunction obyekti və döngəsi yaratmaq üçün.

Döngüdə mən sadəcə olaraq yoxlayıram ki, funksiya arqumenti boş() VƏ arqument “isteğe bağlıdır” (default dəyərə malikdir). Əgər belədirsə, mən sadəcə olaraq arqumentə standart dəyər təyin edirəm.

nümayiş

Limiti null olaraq təyin edin

getData funksiyası($name, $limit = null, $səhifə = "1") ( ... )

və bu funksiyanı çağırın

GetData("bəzi ad", null, "23");

limit təyin etmək istəyirsinizsə, arqument kimi keçə bilərsiniz

GetData("bəzi ad", 50, "23");

Daha əvvəl deyildiyi kimi, heç nə dəyişməyib. Bununla belə, həddindən artıq çox parametrlərdən (xüsusilə qabaqcıl olanlardan) ehtiyatlı olun - kod qoxusunun güclü göstəricisidir.

Ola bilsin ki, funksiyanız həddən artıq çoxdur:

// ilk qurma konteksti $dataFetcher->setPage(1); // $dataFetcher->setPageSize(50); // burada istifadə edilmir // sonra işi yerinə yetirin $dataFetcher->getData("bəzi ad");

Bəzi parametrləri məntiqi olaraq qruplaşdırmaq olar:

$pagination = yeni Səhifələmə(1 /*, 50*/); getData("bəzi ad", $pagination); // Java kodlayıcıları yəqin ki, bu forma ilə tanış olacaqlar: getData("bəzi ad", yeni Səhifələmə(1));

Sonuncu halda, həmişə ad-hoc parametr obyekti təqdim edə bilərsiniz:

$param = new GetDataParameter(); $param->setPage(1); // $param->setPageSize(50); // burada istifadə edilmir getData($param);

(bu, daha az rəsmi metodun sadəcə təriflənmiş versiyasıdır parametrlər massivi)

Bəzən parametrin özünü yaratma səbəbi lazım deyil. Bu nümunədə $page həqiqətən isteğe bağlı olmaq deməkdir? Çox simvolu saxlamaq həqiqətən vacibdirmi?

// şübhəli // ilk baxışdan aydın deyil ki, "getData()"-a parametrsiz çağırış // getData($page = 1) data funksiyasının yalnız bir səhifəsini qaytarır; // bu daha mənalı funksiya log($message, $timestamp = null /* cari vaxt default olaraq */);

Bu fraqment:

GetData funksiyası($name, $options) ($default = massiv("limit" => 50, "səhifə" => 2,); $args = array_merge($default, $options); print_r($args); ) getData("foo", massiv()); getData("foo", array("limit" => 2)); getData("foo", array("limit" => 10, "səhifə" => 10));

Massiv ( => 50 [səhifə] => 2) massiv ( => 2 [səhifə] => 2) massiv ( => 10 [səhifə] => 10)

Bunu edərdim:

Ümid edirəm bu kiməsə kömək edir

Yoxla.

funksiya getData($name, $limit = NULL, $səhifə = "1") ( if (!$limit)( $limit = 50; ) ) getData("bəzi ad", "", "23");

Funksiya çağırışında orta parametri atlaya bilməzsiniz. Ancaq bunun ətrafında işləyə bilərsiniz:

Function_call("1", "2", "3"); // Parametrlə keçin. function_call("1", null, "3"); // Parametrsiz keçin.

Funksiya_call($a, $b="50", $c)( if(isset($b))( echo $b; ) else( echo "50"; ) )

@IbrahimLawal qeyd etdiyi kimi. Ən yaxşısı onları sıfır dəyərlərə təyin etməkdir. Sadəcə müəyyən edilmiş standartları istifadə etdiyiniz dəyərin sıfır olub olmadığını yoxlayın.

Ümid edirəm kömək edər.

GetData("bəzi ad");

sadəcə onları keçməyin və default qəbul ediləcək

>

Php funksiyaları

>

Php skriptləri

func_get_arg

func_get_arg-- Arqument siyahısından elementi qaytarır

Təsvir

qarışıq func_get_arg (int arg_num)

İstifadəçi funksiyası arqument siyahısından arg_num -th arqumentini qaytarır. Funksiya arqumentlərinin nömrələnməsi sıfırdan başlayır. func_get_arg() funksiya tərifindən kənar çağırıldıqda xəbərdarlıq yaradır.

arg_num ötürülən arqumentlərin sayından çox olarsa, xəbərdarlıq yaradılacaq və func_get_arg() geri dönəcək YANLIŞ .

foo funksiyası()
{
$numargs = func_num_args();
əks-səda"Arqumentlərin sayı: $numargs
\n" ;
əgər($numargs >= 2) (
əks-səda"İkinci arqument:" . func_get_arg (1) . "
\n" ;
}
}

foo(1, 2, 3);
?>

func_get_arg() ilə birlikdə istifadə edilə bilər func_num_args()func_get_args() dəyişən sayda arqumentlərlə funksiyalar yaratmaq.

İstifadəçinin töhfə verdiyi qeydlər

yepiskop
11 dekabr 2004-cü il 08:58

"Müxtəliflik" operatoru ilə bağlı üçün dvogel at ssc dot wisc dot edu, zəhərinizi seçin:

// üçlü operatorlardan istifadə etməklə
funksiya seçimi ($a, $b) ( qaytarmaq ( isset($a) ? $a : $b ); )
$a = (seçmək ($b , $c ) ? seçmək ($c , $d ) : null);
?>
// varargs funksiyasından istifadə etməklə
funksiya seçimi ($a) (
$a rg c= func_num_args();
üçün($i = 0; $i< $a rg c; $i++) (
$a rg = func_get_arg($i);
əgər (! is_null ($a rg)) {
qayıtmaq $a rg ;
}
}

Null qaytarın;
}

$a = seçin ($b , $c , $d );
?>


mw atto lanfear dotto com
08 dekabr 2004 01:56

func_get_arg() funksiyasının özü daxilində funksiya arqumenti kimi istifadə edilməsinə icazə verilmir sinif PHP 5.0.2-də konstruktorlar (wonk-ay!!!):

sinif ABC
{
funksiya __construct()
{
foreach(func_get_args() kimi $name => $value)
{
əks-səda <<

$adı: $dəyər


Haqqımızda Şirkətin Adı: EOT;
}
}
}

sinif DEF uzanır ABC
{
funksiya __construct()
{
valideyn::__construct( func_get_arg (0),
func_get_arg (1),
func_get_arg (2));
}
}

$def = yeni DEF(123123, "asdfasdf", "blahblahblah");

Yuxarıdakı skript yaradır:

Fatal səhv: func_get_arg(): 23-cü sətirdə c:\Inetpub\wwwroot\phpwasrc\chapter10\xxx-də funksiya parametri kimi istifadə edilə bilməz

Bununla belə, bunları normal funksiyalara parametr kimi ötürərkən heç bir problem yoxdur.
dvogel və ssc dot wisc dot edu
22 oktyabr 2004 01:54

Mən həmişə təxirə salma və ya kaskad operatoru istəyirəm ki, bu ifadədən istifadə edə bildim:

$a = $b ## $c ## $d ;

Və tapşırıq operatorunun sağındakı hər şey sıfır olmayan ən solda olan dəyərə görə qiymətləndirəcək. Bu, mahiyyətcə bunun çökmüş versiyasıdır:

əgər($b) (
$a =$b ;
} başqa {
əgər($c) (
$a =$c;
} başqa {
əgər($d) (
$a = $d ;
} başqa {
$a = null;
}
}
}

Bunun əvəzinə, mən dəyişən sayda arqumentlər götürən və null olmayan birincini qaytaran funksiya yaratmağa çalışıram. Bunu bəzi böyük massivlərdə istifadə etmək istəmirəm, ona görə də keçmək istəyirəm. bunlara istinadla, PHP-nin daha yeni versiyalarında zəng vaxtının ötürülməsi qeyri-aktivdir (və belə olmalıdır). =

Düşünə biləcəyim yeganə həll dəyişənləri istinad üçün təyin etməkdir massiv birinci. məs.

$a = massiv (...);
$b = 0;
$c =
first_not_null($a, $b);

Hər kəs daha yaxşı bir həll bilirmi?
harald at triptop dot org
15-Sentyabr 2004 02:09

func_get_arg faydalıdır, əgər arqumentlərin dəqiq sırasını bilirsiniz və ya əgər sifarişin əhəmiyyəti yoxdur mən bu funksiyadan istifadə edirəm (və ya func_get_args). üçünöz yaratmaq üçün nümunə sprintf sarğılar.

əgər bir funksiyaya dəyişən sayda arqument ötürmək istəyirsən, məncə, onu açar/dəyər kimi təqdim etmək daha yaxşıdır massiv məsələn:

funksional zəng ( massiv("param1" => "..." ,...));
?>

Və "çıxarış" massiv all.php?act=funct&argument= daxilində tip yoxlaması kimi fəndlər etmək lazım deyil üçün bu halda parametrin tanınması.
04-iyun-2004 05:16

Mən əslində ehtiyac olduğunu düşünürəm üçün belə "tamamilə hər şeyi et" funksiyaları. Onları əsasən alət kimi istifadə edirəm üçün sürətli prototipləmə.
Və bir funksiyaya bir neçə sətir ötürə biləcəyiniz bir üsul var: ereg ();
Başqa bir istifadə üçün belə funksiyalar kiçik kod parçaları yaratmaqdır üçün oradakı digər insanlar. Onlar artıq funksiyanı redaktə etmək məcburiyyətində qalmayacaqlar əgər parametrdən istifadə etmirlər. Onlar sadəcə all.php?act=funct&argument=-ə zəng edəndə onun adını çəkmirlər
Bu, istifadəsində çox möhkəm olan hərtərəfli funksiyalarla nəticələnir. Normalda sizdə sadəcə kiçik bir kod parçası (məsələn, ip-bloklama fraqmentləri) olur. Bu tip proqramlaşdırma vasitəsilə siz bütün funksiyalara sahib olursunuz.
26 may 2004 08:29

Çox ağıllı olmadıqda, eyni tipli ən azı iki parametr təyin etməlisiniz - hansıdır? Aydındır ki, bəzi defoltlara qərar verə bilərsiniz, amma sonra hər şey çirkinləşir. Nə əgər sizə YALNIZ bir sim lazımdır əgər bir boolean da təmin edildi? Tip yoxlanışı funksiyanızın əsas diqqət mərkəzinə çevrilir, bok. üçün təmiz kod naminə siz funksiyalarınız üçün təmiz interfeys təyin etməli və arqument kimi nəyin və harada ötürüldüyünə qərar verməlisiniz. Bəli, siz həmişə do_absolutely_everything() funksiyasını kodlaya bilərsiniz, lakin bunun mənası varmı?
anders at ingemann dot fakestuff dot de
30 aprel 2004 03:18

Olduqca sərin bir şey üçün istifadəçi müəyyən edilmişdir funksiyaları yalnız lazım olan parametrləri təqdim etməkdir. Əgər etməli olduğunuz üç isteğe bağlı parametri olan bir funksiyanı çağırırsınız müəyyənləşdirmək iki birinci (hətta əgər kimi qalmalıdırlar müəyyən edilmişdir funksiyada standart) funksiyaya üçüncü vacib parametrin nə olduğunu söyləyə bilməmişdən əvvəl. Bunun əvəzinə təqdim olunan parametrin nümunəsinə və ya növünə görə onun hansı dəyişənə təyin edilməli olduğunu öyrənə bilərsiniz.
bunun kimi:

nə olursa olsun funksiyası()
{
üçün($i = 0; $i< func_num_args (); $i ++)
{
əgər (is_bool (func_get_arg($i ))) $log_ip = func_get_arg($i);
əgər (is_int (func_get_arg($i ))) $limit = func_get_arg($i);
əgər (is_string (func_get_arg($i ))) $adı = func_get_arg($i);
}
}
?>

İndi funksiyanı istədiyiniz parametrlə çağıra bilərsiniz.
məsələn:

onda hal$ limiti olacaq müəyyən edilmişdir 3600 ilə.

Fərqi yoxdur əgər siz bunu edirsiniz:


və ya bu:

və ya bu:

Siz də istifadə edə bilərsiniz ereg(). Bunun vasitəsilə siz bir sətir kimi birdən çox parametrdən istifadə edə bilərsiniz.
hmm yəqin ereg() ən yaxşı həlldir...
eybi yoxdur.
sadəcə yoxlayın ;-)
mightye (at) mightye (nöqtə) org
12 mart 2004 08:45

func_get_arg() * qaytarır surəti* arqumentdən, mənim bildiyimə görə, dəyişən sayda arqumentlərə istinadlar əldə etmək üçün heç bir yol yoxdur.

Oyunumda modul sistemim var, burada moduldakı funksiyalara dəyişən sayda arqument ötürmək və onları istinadla ötürmək istəyirəm. əgər modul soruşur üçün onu istinadla, lakin siz isteğe bağlı parametrləri istinad kimi qəbul edə bilməzsiniz, nə də dəyişən sayda arqumentlər üzrə arayışı əldə edə bilməzsiniz. Görünür, mənim modullarım parametrləri öz funksiyalarına istinadla qəbul etmək imkanı ilə bağlı olacaq.
Martin, classaxe dot com-da
07 iyun 2002 09:55

Bu funksiya zərif olsa da, əlbəttə ki, xəbərdarlıqları söndürməsəniz, dəyişənlərin təyin edilmədiyi yerlərdə xəbərdarlıq mesajlarının yaradılması problemindən qaçmır:
səhv_hesabat(E_ERROR);

Cavab üçün lazımlı xəbərdarlıqları görmək istəyənlər?
Bunu belə adlandırın:
@allSet($w , $x , $y , $z )

Parametrlər funksiyanın tərifində, mötərizədə göstərilir və onun yerli dəyişənləridir, yəni. onlar yalnız onun bədənində görünür; əgər bir neçə parametr varsa, onlar vergüllə ayrılır. Çağırılan zaman funksiya parametrləri işə salmaq üçün istifadə olunan arqumentləri qəbul edə bilər.

Hansı parametrlərə baxdıq, indi onların hansı dəyərlərlə işə salındığını öyrənəcəyik. Parametrlərə təyin ediləcək dəyərlərə arqumentlər deyilir - bu, məsələn, sətir və ya tam ədədin hərfi, dəyişən və ya dəyişənlərdən və operatorlardan ibarət daha mürəkkəb ifadə ola bilər, lakin PHP tərcüməçisi tərəfindən qiymətləndirilə bilər. parametrin işə salınacağı dəyəri əldə etmək üçün. Sadəcə olaraq, arqument funksiyaya ötürülən dəyərdir:

Arqumentləri ötürmək

PHP funksiya arqumentlərini ötürməyin iki yolunu dəstəkləyir. Birincisi arqumentləri dəyər üzrə ötürməkdir (defolt olaraq işləyir), ikincisi arqumentləri istinadla ötürməkdir. PHP də standart dəyərləri dəstəkləyir. İndi hər üç variantı daha ətraflı nəzərdən keçirək.

Varsayılan olaraq, arqumentlər dəyərlə funksiyaya ötürülür (bu o deməkdir ki, funksiya daxilində parametrin dəyərini dəyişdirsəniz, ondan kənarda ötürülən dəyər eyni qalacaq):

$color color"; // Dəyişənin dəyəri dəyişməyib?>

Əgər funksiyaya ötürülən arqumentləri funksiyadan kənarda dəyişməyə icazə vermək lazımdırsa, siz onları istinadla ötürməlisiniz. Arqumentin istinadla ötürülməsi üçün funksiyanın tərifində parametr adından əvvəl & (ampersand) işarəsi göstərməlisiniz:

Funksiyalar standart arqument dəyərlərini təyin edə bilər. Varsayılan dəyər təyin etmək üçün funksiya tərifində sadəcə parametri istədiyiniz dəyərə təyin etməlisiniz:

\n"; ) echo tea(); // default dəyəri çap edəcək echo tea("qara"); ?>

Qeyd: Defolt arqument dəyərlərinə malik olan hər hansı parametrlər defolt dəyərləri olmayan arqumentlərin sağında yerləşməlidir, əks halda kodunuz gözlənildiyi kimi işləməyə bilər:

Funksiya dəyərinin qaytarılması

Funksiya tamamlandıqda, onu çağıran proqrama bəzi dəyəri (funksiyanın nəticəsi) qaytara bilər. Funksiya daxilində qaytarılan ifadə funksiyanın qaytardığı dəyəri təyin etmək üçün istifadə olunur. Qaytarılan dəyər istənilən növ ola bilər. Aşağıdakı sintaksisə malikdir:

Qaytarma ifadəsi;

Qaytarma ifadəsi funksiyanın istənilən yerində yerləşdirilə bilər. Nəzarət ona çatdıqda, funksiya bir dəyər qaytarır (əgər göstərilmişdirsə) və onun icrasını tamamlayır. Əgər qaytarma ifadəsi göstərilməyibsə və ya qaytarma dəyəri göstərilməyibsə, funksiya NULL qaytaracaq. Qaytarılan dəyərdən istifadə etmək üçün funksiyanın icrasının nəticəsi dəyişənə təyin edilə bilər, məsələn:

"; // => 16. funksiya foo($num) ( if($num === 10) "$num 10-dur" qaytarın; başqa "$num 10 deyil" qaytarın; "salam" əks-sədası; // bu kod xətti heç vaxt yerinə yetirilməyəcək ) echo foo(6);

PHP 4/5-də zəng edərkən təyin etmək istəmədiyiniz parametrləri atlayaraq (python-da olduğu kimi) adlandırılmış isteğe bağlı parametr təyin etmək mümkündürmü?

Funksiya foo($a,$b="", $c="") ( // nə olursa olsun ) foo("salam", $c="bar"); // biz defolt olaraq $b istəyirik, lakin $c təyin edin

Xeyr, mümkün deyil: üçüncü parametri keçmək istəyirsinizsə, ikincisini keçməlisiniz. Və adlanan parametrlər də mümkün deyil.

"Həll" yalnız bir parametrdən, massivdən istifadə etmək və həmişə onu ötürmək olardı... Amma həmişə orada hər şeyi təyin etməyin.

Funksiya foo($params) ( var_dump($params); )

Və bunu belə adlandırırıq:

Foo(array("a" => "salam",)); foo(array("a" => "salam", "c" => "glop",)); foo(array("a" => "salam", "test" => "başqası",));

Sizə bu çıxışı verəcək:

"a" massivi => "salam" sətri (uzunluq=5) sətir "a" => sətir "salam" (uzunluq=5) "c" => "glop" sətri (uzunluq=4) "a" sətri => sətir "salam" (uzunluq = 5) "test" => "başqa bir" sətir (uzunluq = 11)

Ancaq bu həlli həqiqətən bəyənmirəm:

  • Siz phpdoc-u itirəcəksiniz
  • Sizin IDE artıq heç bir ipucu verə bilməyəcək... Bu pisdir

Buna görə də mən bununla yalnız çox xüsusi hallarda gedərdim – məsələn, çoxlu isteğe bağlı parametrləri olan funksiyalar üçün…

Xeyr, PHP arqumentləri adla ötürə bilməz.

Çoxlu arqument alan funksiyanız varsa və onların hamısının standart dəyərləri varsa, bunun əvəzinə funksiyanı bir sıra arqumentlər qəbul etməyi düşünə bilərsiniz:

Funksiya testi ($args massivi) ( $defaults = massiv("a" => "", "b" => "", "c" => ""); $args = array_merge($defaults, array_intersect_key($args) , $defaults)); list($a, $b, $c) = array_values($args) // list(): çıxarış($args); , $c)

Bunu bir qədər edə biləcəyiniz yeganə yol, adlandırılmış düymələri olan massivlərdən istifadə etməkdir.

PHP ilə arqumentlərin sırası önəmlidir. Müəyyən bir arqumenti yersiz göstərə bilməzsiniz, lakin bunun əvəzinə, funksiyanızdakı dəyərin NULL dəyərinə etiraz etmədiyiniz müddətcə, NULL keçməklə arqumentləri atlaya bilərsiniz.

Foo("salam", NULL, "bar");

kimi PHP 5.4 stenoqrafiya massiv sintaksisiniz var (ağır “massiv” ilə massivləri təyin etmək lazım deyil və əvəzinə “” istifadə edin).

Bacararsan təqlid etmək bir çox cəhətdən adlandırılmış parametrlər, yaxşı və sadə bir yol ola bilər:

Bar("bir", ["a1" => "iki", "bar" => "üç", "foo" => "dörd"]); // çıxış: twothreefour funksiya paneli ($a1, $kwargs = ["bar" => null, "foo" => null]) ( çıxarış($kwargs); echo $a1; echo $bar; echo $foo; )

Bu, tam olaraq gözəl deyil, amma hiylə edir, bəziləri deyə bilər.

Class NamedArguments ( statik funksiya init($args) ( $assoc = reset($args); if (is_array($assoc)) ( $diff = array_diff(massiv_keys($assoc), array_keys($args)); if (boş) ($diff)) return $assoc trigger_error("Yanlış parametrlər: ".join(",",$diff), E_USER_ERROR qaytarılması massivi()) ) class Test ( ictimai statik funksiya foobar($lazım, $optional1 =); "", $optional2 = "") ( çıxarış(NamedArguments::init(get_defined_vars())); printf("tələb olunur: %s, optional1: %s, optional2: %s\n", $laquired, $ optional1, $optional2); ) ) Test::foobar("lazım", "optional1", "optional2"); Test::foobar(array("lazım" => "lazım", "optional1" => "optional1", "optional2" => "optional2"));

Siz massiv əvəzinə obyekti ötürməklə phpdoc-u və defoltları təyin etmək qabiliyyətini saxlaya bilərsiniz, məs.

Class FooOptions ( $opt1 = "x"; $opt2 = "y"; /* və s. */ );

Bu, həmçinin siz istəyirsinizsə, funksiya çağırışınızda ciddi tip yoxlaması etməyə imkan verir:

foo funksiyası(FooOptions $opts) ( ... )

Əlbətdə ki, bunun üçün FooOptions obyektinin qurulmasını əlavə məlumatlandırma ilə ödəyə bilərsiniz. Təəssüf ki, tamamilə pulsuz gəzinti yoxdur.

Normalda edə bilməzsiniz, lakin məncə, PHP funksiyasına adlandırılmış arqumentləri ötürməyin bir çox yolu var. Şəxsən mən massivlərdən istifadə edərək tərifə istinad edirəm və keçməli olduğum şeyi çağırıram:

Sinif Testi( ictimai $a = false; özəl $b = yalan; ictimai $c = yalan; ictimai $d = yalan; ictimai $e = yalan; ictimai funksiya _factory())( $args = func_get_args(); $args = $this->a = array_key_exists("a",$args) : $this->b = array_key_exists("b",$args) ? this->c = array_key_exists("c",$args) ? $args["c"] : $this->d = array_key_exists("d",$args) d"] : 0; $this- >e = array_key_exists("e",$args) ? $args["e"] : 0; ) ictimai funksiya show() ( var_dump($this); ) ) $test = new Test(); $args["c"]=999; $test->_fabrika($args); $test->göstər();

Əgər 10 arqument ötürməli olsam və onlardan 3-ü mənə həqiqətən ehtiyac duyduğum məlumatdırsa, belə bir funksiyaya keçmək HƏTTA AKILLI DEYİL

Funksiyamı qaytarın (yanlış, yalan, 10, yanlış, yalan, "tarix", yalan, yalan, yanlış, "az");

Verdiyim yanaşma ilə siz 10 arqumentdən hər hansı birini massivdə qura bilərsiniz:

$arr["count"]=10; $arr["type"]="tarix"; $arr["sifariş"]="az"; funksiyamı qaytar ($arr);

Bloqumda bu prosesi daha ətraflı izah edən bir yazım var.

İstifadə etdiyim budur. Funksiya tərifi isteğe bağlı adlandırılmış arqumentləri təyin edən bir isteğe bağlı massiv arqumentini götürür:

Funksiya funksiyası($arg, $options = Massiv()) ( $defaults = Array("foo" => 1.0, "bar" => FALSE); $options = array_merge($default, $options); // Normal funksiya Burada qeyd olunan parametr dəyərlərini almaq üçün $options["foo"] və // $options["bar"] istifadə edin.

Siz adətən heç bir arqument olmadan zəng edə bilərsiniz:

Func("xyzzy")

Əlavə adlandırılmış arqumenti təyin etmək üçün onu isteğe bağlı massivdə keçirin:

Func("xyzzy", Array("foo" => 5.7))

Yox həqiqətən yox. Bunun üçün istifadə edə biləcəyiniz bir neçə alternativ var.

Test (null, null, "salam")

Və ya bir sıra keçir:

Test(array("c" => "salam"));

Sonra funksiya belə ola bilər:

Funksiya testi($array) ( $c = isset($array[c]) ? $massiv[c] : ""; )

Və ya arasına bir funksiya əlavə edin, amma bunu təklif etməzdim:

ctest($c) funksiyası (test("","",$c); )

Funksiya testini sınayın ($a="",$b="",&$c="")()

$c-dan əvvəl & qoymaq

mən belə düşünmürəm...
Zəng etmək lazımdırsa, məsələn, substr funksiyası, ki, 3 params var, və istəyirəm təyin edin$uzunluğu olmadan$start təyin edin, bunu etməyə məcbur olacaqsınız.

Substr($str,0,10);

bunu aradan qaldırmaq üçün gözəl bir yol həmişə istifadə etməkdir massivlər parametrlər üçün

Sadə cavab. Xeyr edə bilməzsən.
Bir obyekt/massivdən keçməklə və ya bəzi digər Asılılıq inyeksiya nümunələrindən istifadə etməklə onun ətrafından keçməyə cəhd edə bilərsiniz.

Həmçinin, boş sətirlərdən çox nulllardan istifadə etməyə çalışın, çünki is_null() istifadə edərək onların mövcudluğunu yoxlamaq daha dəqiqdir.

Funksiya testi ($a=null,$b=null,$c=null)( if (is_null($a) ( //$a haqqında bir şey edin) if (is_null($b) ( //$b haqqında bir şey edin) ) əgər (is_null($c) ( //$c haqqında bir şey edin ) )

Test (null, null, "Salam");

Çox qısa, bəzən bəli, əks və tipli dəyişənlərdən istifadə etməklə. Ancaq düşünürəm ki, bu, yəqin ki, arxasınca getdiyiniz şey deyil.

Probleminizin daha yaxşı həlli, ehtimal ki, 3 arqumentə keçməkdir, çünki funksiyalar funksiyanızın içərisində çatışmayanı özünüz idarə edir.

Bunu python yolu ilə edə bilməzsiniz. Hər halda, siz assosiativ massiv keçə və massiv qeydlərini öz adı ilə istifadə edə bilərsiniz:

Funksiya testi ($args=array("a"=>"","b"=>"","c"=>"")) ( // nəsə et ) test(array("c"=>"Salam "));

Bu, yazmağı azaltmır, lakin ən azı arqumentlərin adlarının zəngdə görünən və oxunaqlı olması daha təsviridir.

Burada bir iş var:

Funksiya set_param_defaults($params) ( foreach($params["default_values"] as $arg_name => $arg_value) (if (!isset($params[$arg_name])) ( $params[$arg_name] = $arg_value ) ) return $params ) funksiyası foo($z, $x = null, $y = null) ( $default_values ​​= ["x" => "x üçün standart dəyər", "y" => "default; y üçün dəyər" ]; $params = set_param_defaults(get_defined_vars()); çap $params["x"] . print $params["y"] . ("z dəyəri təyin et", null, "y dəyərini təyin et"); "\n" çap edin; foo("z dəyərini təyin edin", "x dəyərini təyin edin");

ALTERNATİF OLARAQ:
Şəxsən mən bu üsulla gedərdim.

foo($z, $x_y) ( $x_y += ["x" => "x üçün defolt dəyər", "y" => "y üçün defolt dəyər"]; "$z\n" çap edin; $ çap edin x_y["x"] "\n"; print $x_y["y"] . çap "\n"; foo("z dəyəri təyin et", ["x" => "x dəyəri təyin et"]);

Hər iki nümunə üçün nəşrləri çap edin.

  • z dəyərini təyin edin
  • x üçün standart dəyər
  • y dəyərini təyin edin
  • z dəyərini təyin edin
  • x dəyərini təyin edin
  • y üçün standart dəyər

Sadəcə Drupal-ın istifadə etdiyi assosiativ massiv modelindən istifadə edin. İsteğe bağlı defolt arqumentlər üçün sadəcə assosiativ massiv olan $options arqumentini qəbul edin. Sonra massivdə çatışmayan düymələri təyin etmək üçün massiv + operatorundan istifadə edin.

Funksiya foo ($a_required_parameter, $options = massiv()) ( $options += array("b" => "", "c" => "",); // nə olursa olsun ) foo("a", massiv( "c" => "c-nin dəyəri")); // c təyin edərkən b keçməyə ehtiyac yoxdur.



Əlaqədar nəşrlər