PHP-də anonim funksiyalar. PHP: Anonim Funksiyalar Təcrübədə Bağlamaların Necə İstifadə Edilməsi

Hər kəsə salam və bu gün biz danışacağıq php-də anonim funksiyalar hansılardır və onlardan harada istifadə etmək.

Anonim funksiyalar, və ya başqa şəkildə lambda funksiyaları adı olmayan funksiyalardır.

Müntəzəm funksiyanın nümunəsi

FunName ($txt) (
echo "Mənim mətnim: ".$txt;
}

$func = "FuName";
$func("Mənim mətnim");
?>

Bir parametr qəbul edən bir funksiyamız var. Sonra funksiyanın adını dəyişənə yazırıq və onu çağırırıq. Qeyri-adi heç nə yoxdur. IN OOPüslubu daha haqlı olacaq.

sinif MyClass(
funksiya çubuğu() (
// kod
}
}

$class = yeni MyClass();
$func = "bar";
$class->$func();
?>

Anonim funksiyalar

Əgər dildən anonim funksiyalarla tanışsınızsa JavaScript, onda onların nə üçün lazım olduğunu başa düşürsən, yoxsa, oxumağa davam et.

Proqram kodunun daha bir yerində anonim funksiyamızı çağırmaq üçün onu dəyişənə təyin edə bilərik

$func = funksiya() (
// kod
};

$func();
?>

Diqqət yetirin ki, sonunda var ; , çünki dəyişənə funksiyaya bərabər qiymət təyin edirik. Ancaq bütün məsələ bu deyil, bu funksiyaları kimi istifadə edə bilməyimizdir geri çağırış funksiyaları. Misal üçün:

$val = massiv_filtri($giriş, funksiya ($v) ( qaytarmaq $v > 2; ));
?>

Açar söz İSTİFADƏ

Yenə bilirsənsə JavaScript, onda bu sizin üçün problem olmayacaq. Açar söz İSTİFADƏ texnikadan istifadə etməyə imkan verir bağlamalar, yəni. onun köməyi ilə biz xarici dəyişənlərə çata bilərik.

$mx = funksiya ($high_val) (
qaytarma funksiyası ($val) istifadə ($high_val) (
$val > $high_val qaytarın;
};
};

$i = massiv(1, 2, 3, 4, 5, 6, 7);
$o = massiv_filtri($giriş, $maksimum_komp(2));
?>

Budur, öz içimizdəyik lambda funksiyaları qlobal dəyişən istifadə edin yüksək_val. Bunun mümkün olması üçün biz sözdən sonra olmalıyıq funksiyası və parametrləri mötərizədə yazın istifadə edin və funksiya kodu daxilində istifadə etmək istədiyimiz xarici dəyişənin adını ora ötürün.

Ancaq qlobal dəyişənimizin dəyərini bu şəkildə dəyişdirə bilməyəcəyik. Bunun üçün adından əvvəl işarəni göstərməlisiniz &

$name = "Brian";
$setName = funksiya($n) istifadə(&$name) (
$adı = $n;
};

$setName("David");
echo $name;
?>

Nəticə

Beləliklə, bu gün öyrəndiniz php-də anonim funksiyalar nədir və onlardan necə istifadə etmək olar. Uğurlar!

Vikipediya deyir ki, anonim funksiya identifikator olmadan mövcud ola bilən funksiyadır. Olduqca maraqlı səslənir! Bu dərslikdə mən sizə qeyri-standart metodlardan istifadə edərək funksiyanı necə yarada və çağıra biləcəyinizlə bağlı bəzi nümunələri göstərəcəyəm.

Dərhal nümunələrlə başlayaq:

Funksiya Testi($var) ( əks-səda "Bu, $vardır"; )

Bu çox sadə funksiyadır. İndi normal çağırışa əlavə olaraq, bu funksiyanın adını saxlayan dəyişəndən istifadə edərək bu funksiyanı işlədə bilərik. Bu kimi bir şey:

$f = "Sınaq"; $f("dəyişən funksiya");

Kodu işlətsəniz, bu, dəyişən funksiyadır mesajını görəcəksiniz. Nəzərə alın ki, tək dırnaqların işlənməsi qoşa dırnaqlardan daha sürətlidir.

Bu texnikanı OOP-da da istifadə edə bilərik. php.net-dən nümunə:

Class Foo ( Funksiya Variable() ( $name = "Bar"; $this->$name(); // Bu, Bar() metodunu çağırır ) Bar() funksiyası ( "This is Bar"; ) ) $foo = yeni Foo(); $funcname = "Dəyişən"; $foo->$funcname(); // Bu, $foo->Variable() çağırır

Bu konsepsiya olduqca maraqlıdır. O, geri çağırışları, funksiya cədvəllərini və s. həyata keçirmək üçün istifadə edilə bilər.

İndi sizə anonim funksiyaların nə olduğunu izah etməyə çalışacağam:

$input = massiv(1, 2, 3, 4, 5); $çıxış = massiv_filtri($giriş, funksiya ($v) ($v > 2; ) qaytarın);

($v) funksiyası ($v > 2; ) anonim funksiyadır. Biz onu sonradan istifadə etmək üçün dəyişənə də təyin edə bilərik.

$max = funksiya ($v) ( qaytarmaq $v > 2; ); $input = massiv(1, 2, 3, 4, 5); $çıxış = massiv_filtri ($giriş, $maks);

İndi yeni istifadə açar sözünə nəzər salaq. Bunun üçün başqa bir anonim funksiya yazaq (PHP 5.3 ilə işləyir):

$max_comp = funksiya ($max) ( qaytarma funksiyası ($v) istifadə ($max) ( qaytarmaq $v > $max; ); ); $input = massiv(1, 2, 3, 4, 5); $çıxış = massiv_filtr($giriş, $maksimum_komp(2));

Bu nümunədə biz use açar sözündən istifadə edərək bağlama effektindən istifadə edirik. Bu texnika anonim funksiyaya xarici dəyişənlərə daxil olmaq imkanı verir. Prosedur proqramlaşdırmasının qoxusu varmı?

Daha sadə bir nümunə:

$string = "Salam Dünya!"; $closure = function() istifadə ($string) ( echo $string; ); $bağlama();

Artıq dediyim kimi, bu cür funksiyalarda istifadə etmək istədiyimiz dəyişənlər (qlobal miqyasdan) istifadədən keçməlidir. Qeyd etmək vacibdir ki, defolt olaraq yalnız dəyər ötürülür, ona görə də ötürülən dəyişənin məzmununu dəyişdirmək və onun anonim funksiyadan kənarda dəyişməsini istəyirsinizsə, dəyəri aşağıdakılara keçirin:

$x = 1; $bağlama = funksiya() istifadə (&$x) ( ++$x; ); echo $x . "
"; $closure(); echo $x ."
"; $closure(); echo $x ."
";

Bu misalda bizim metodumuz anonim funksiya hər dəfə çağırılanda $x dəyişəninin məzmununu dəyişir. Əgər dəyişənin ünvanını yox, dəyişənin özünü keçirsəydik, üç 1-i göstərərdik.

Bağlanmanın əsl gözəlliyi qlobal ad məkanını qarışdırmamasıdır. Anonim funksiya öz fəaliyyətini başa vuran kimi, onda istifadə olunan bütün dəyişənlər avtomatik olaraq məhv edilir.

Mən php-də sadə mysql-dən PDO-ya keçirəm və qeyd etdim ki, səhvləri yoxlamaq üçün ümumi üsul if/else birləşmələri əvəzinə try/catch kombinasiyasından istifadə etməkdir.

bu metodun üstünlüyü nədir, müxtəlif addımlar üçün (qoşulmaq, hazırlamaq, icra etmək və s.) bütün xətaları idarə etmək üçün çoxlu yuvalanmış if/else blokları əvəzinə bir cəhd/tutmaq blokundan istifadə edə bilərəmmi?

11 51

Jeroen

11 cavab:

İstisnanın atılması və tutulması əksər digər primitiv əməliyyatlarla müqayisədə bahalı əməliyyatdır. Əgər bu, yaxşı işləməli olan kod parçasıdırsa (məsələn, sıx bir dövrədə), istifadə vəziyyətinizə baxmaq istəyə bilərsiniz - əgər istisnaların nisbətən tez-tez baş verəcəyini gözləyirsinizsə, if/else ilə daha yaxşı olacaqsınız. performans (əsas kod yalnız sizin üçün istisnanı əhatə etmirsə, bu halda heç bir qazanc yoxdur). İstisnalar yalnız nadir hallarda atılırsa, sıx bir döngədə budaqlanmanın qarşısını almaq üçün cəhd etmək/tutmaq daha yaxşıdır.

PDO obyektlərdən istifadə etdiyi üçün xəta baş verərsə, onlar istisnalar atır. Köhnə mysql/mysqli sadə funksiyalar idi və istisnalar atmırdı, sadəcə səhv kodlarını qaytarırdılar. Sınaq/tutmaq istisnanın koddan atılması zamanı istifadə olunur və siz onu xətaların idarə edilməsinin obyekt yönümlü üsulu olan tutma bəndində tutursunuz. Siz if/else blokları ilə istisnaları tuta bilməzsiniz - onlar try/catch ilə heç nə paylaşmırlar.