Internet Windows Android
Kengaytirish

Generator php -da uning qanday ishlashini yaratadi. PHP tasodifiy sonlarni yaratish

Ushbu maqolada biz Iterator interfeysi yuklamasdan va murakkab bo'lmagan holda oddiy iteratorlarni amalga oshirishning oson usulini ta'minlaydigan generatorlarni o'rganamiz.

Generatorlar qanday ishlaydi?

Vikipediyaga ko'ra, generator "generator parametrlari bo'lgan qatorni qaytaradigan funktsiyaga juda o'xshash, siz uni nomlashingiz va qiymatlar ketma -ketligini yaratishingiz mumkin."... Jenerator, asosan, funktsiyaga o'xshaydi, lekin qiymatni qaytarish o'rniga, kerak bo'lganda qancha qiymat beradi. Bu funktsiyaga o'xshaydi, lekin u iterator kabi ishlaydi.

Generatorlar qaytish o'rniga rentabellik kalit so'zidan foydalanadilar. Qaytish xuddi shunday harakat qiladi, u chaqiruv funktsiyasining qiymatini qaytaradi, lekin funktsiyani to'plamdan olib tashlash o'rniga uning holati saqlanadi. Bu funksiya yana chaqirilganda, avvalgi joyidan davom etish imkonini beradi. Aslida, siz generator qiymatini qaytarolmaysiz, garchi siz uning bajarilishini to'xtatish uchun qaytarilmaydigan qiymatdan foydalanishingiz mumkin.

PHP qo'llanmasida shunday deyilgan: "Jenerator funktsiyasi chaqirilganda, u ko'chirilishi mumkin bo'lgan ob'ektni qaytaradi." Bu generator ichki sinfining ob'ekti bo'lib, iterator interfeysini xuddi shu tarzda amalga oshiradi. PHP bu ob'ektni takrorlab, har safar qiymat kerak bo'lganda generatorni chaqiradi. Bu holat faqat keyingi qiymat zarur bo'lganda saqlanadi.

Yuqoridagi kodning chiqishi quyidagicha bo'ladi:

Jenerator ishga tushdi

0

1

2 beradi

3 beradi

Ko'rsatilgan 4

Jenerator tugadi

Bizning birinchi generatorimiz

Generatorlar yangi tushuncha emas va ular allaqachon C #, Python, JavaScript va Ruby kabi tillarda mavjud bo'lib, odatda ulardan foydalanish orqali aniqlanadi. Yo'l bering kalit so'z. Quyida Python misoli keltirilgan:

Def file_lines (fayl nomi): file = ochiq (fayl nomi) fayldagi satr uchun: file_close () file_lines satrida ("somefile"): .............

PHP -da Python generatorini qayta yozamiz. (E'tibor bering, ikkala parcha ham xato tekshirishni amalga oshirmaydi.)

Jenerator funktsiyasi faylni ochadi va kerak bo'lganda faylning har bir satrini o'qiydi. Har safar generator chaqirilganda, u to'xtagan joyidan davom etadi. U boshidan boshlamaydi, chunki harakat tasdiqlanganda uning holati saqlanib qolgan. Barcha satrlarni o'qib bo'lgach, generator shunchaki o'chadi va tsikl tugaydi.

Qaytish kalitlari

PHP iteratorlari kalit / qiymat juftlaridan iborat. Bizning misolimizda faqat qiymat qaytarilgan va shuning uchun kalitlar raqamli bo'lgan (raqamli kalitlar sukut bo'yicha). Agar siz assotsiativ juftlikni qaytarishni xohlasangiz, massiv sintaksisidan foydalanib kalitni kiritish uchun rentabellikni o'zgartiring.

$ liniyasi; ...) foreach (file_lines ("somefile") sifatida $ key => $ line) (.............)?>

Qiymat kiritish

rentabellik nafaqat qiymatlarni qaytaradi, balki tashqaridan ham qiymatlarni qabul qilishi mumkin. Agar siz qiymatni o'tkazmoqchi bo'lsangiz, bu generator ob'ektining send () usulini qiymat bilan chaqirish orqali amalga oshiriladi. Bu qiymat keyinchalik hisob -kitoblarda yoki boshqa narsalarda ishlatilishi mumkin.

yuborish ("to'xtatish"); ) echo "($ v) n"; )?>

Chiqish quyidagicha bo'ladi:

Xotirani generatorlar yordamida saqlash

Generatorlar katta to'plamlarni hisoblash uchun qulaydir va agar siz bir vaqtning o'zida barcha natijalarga xotira ajratishni xohlamasangiz yoki bilmagan bo'lsangiz, sizga barcha natijalar kerak bo'ladi. Natijalarni qayta ishlash usuli tufayli xotira hajmini faqat joriy natijaga ajratish orqali minimallashtirish mumkin.

Fayldagi barcha satrlarni massiv sifatida qaytaradigan file () funksiyasini tasavvur qiling. File () va file_lines () funktsiyasining demosini ko'rsatish uchun oddiy mos yozuvlar nuqtasini (shkalasini) manipulyatsiya qilib, har biri Lipsum yordamida bir xil tasodifiy 100 xatli matnli fayllardan foydalangan holda, file () funktsiyasi xotiradan 110 barobar ko'proq xotira ishlatilganligini ko'rsatdi. generator ...

Generatorlar joriy etilishi bilan PHP ishlab chiquvchilar qo'liga kuchli vositani qo'ydi. Endi biz iteratorlarni tez yozishimiz mumkin, bu jarayonda juda ko'p xotirani tejaydi. Ushbu qo'llanma yordamida siz ularni o'zingizning loyihalaringizda ishlatishni boshlashingiz uchun yetarli deb umid qilaman.

Avtomobil haydashda tezlik hamma narsa emas. Lekin ichida WEB hamma narsa tezlik bilan hal qilinadi. Ilovangiz qanchalik tez bo'lsa, foydalanuvchi tajribasi shunchalik yaxshi bo'ladi. OK, bu maqola haqida PHP generatorlari, nima uchun biz tezlik haqida gapirayapmiz? Ko'rib turganingizdek, generatorlar dastur tezligi va xotira iste'moli jihatidan katta farq qiladi.

PHP generatorlari nima?

Kiritilgan PHP 5.5 versiyasida Jeneratorlar - bu xotirada ma'lumotlar majmuasini yaratmasdan, ma'lumotlarni aylanib o'tishning oddiy mexanizmini ta'minlaydigan funktsiyalar. Hali ham bu nima haqida ekanligini bilmayapsizmi? Keyin ko'rib chiqaylik PHP generatorlari Amalda.

Fayl yarating generator_test.php quyidagi tarkib bilan:


$ qator =;
uchun ($ i = 0; $ i< $max; $i++) {
$ qator = $ i;
}
$ qatorini qaytarish;
}

Foreach (getRange (15) $ diapazoni sifatida) (
echo "Ma'lumotlar ($ diapazoni)
";
}

Keyin, bizda bu fayl joylashgan papkada konsolni oching va quyidagilarni yozing

Http: // localhost: 8000 / generator_test.php

Natijada shunday bo'ladi:

Ma'lumotlar 1
Ma'lumotlar 2
….
Ma'lumotlar 15

Yuqoridagi kod juda oddiy. Biroq, keling, unga ozgina o'zgartirish kiritaylik:


echo "Ma'lumotlar ($ diapazoni)
";
}

Endi hosil qilingan raqamlar diapazoni 0 dan sobitgacha PHP_INT_MAX, bu tarjimon ko'rsatishi mumkin bo'lgan eng katta tamsayı PHP... Shundan so'ng, brauzerga qayting va sahifani yangilang. Biroq, bu safar oddiy matn o'rniga, ovoz balandligi oshib ketgani haqida xabar olamiz. mavjud xotira, buning natijasida skript g'ayritabiiy tarzda to'xtatildi.

Qanday uyat - u PHP xotiradan! Aqlga keladigan birinchi narsa - bu sozlamani o'zgartirish. memory_limit php.ini -da... Lekin o'zimizga savol beraylik - bu haqiqatan ham shunchalik samarali bo'ladimi? Biz haqiqatan ham bitta skript barcha mavjud xotirani egallashini xohlaymizmi?

Biz generatorlardan foydalanamiz

Keling, xuddi shu funktsiyani yuqoridagi kabi yozamiz, uni bir xil qiymat bilan chaqiramiz PHP_INT_MAX va yana yugur. Ammo bu safar biz generator funktsiyasini yarataylik.

GetRange funktsiyasi ($ max = 10) (
uchun ($ i = 1; $ i< $max; $i++) {
$ i daromad;
}
}

Foreach (getRange (PHP_INT_MAX) $ diapazoni sifatida) (
echo "Ma'lumotlar ($ diapazoni)
";
}

Funktsiyani aniqlash getRange Bu safar biz faqat qiymatlarni takrorlaymiz va natijani yaratamiz. Kalit so'z Yo'l bering ko'rsatmaga o'xshash qaytish bunda u funktsiyadan qiymatni qaytaradi, lekin yagona farq shunda Yo'l bering faqat kerak bo'lganda qiymatni qaytaradi va bir vaqtning o'zida butun ma'lumotlar majmuasini xotiraga joylashtirishga urinmaydi. Brauzerga kirganda, siz sahifada ko'rsatilgan ma'lumotlarni ko'rishingiz kerak. Bunga e'tibor bering PHP -dagi generatorlardan faqat funktsiya ichida foydalanish mumkin.

Nega generatorlar kerak?

Vaqti -vaqti bilan bunday vazifalar katta hajmdagi ma'lumotlarni (masalan, jurnal fayllarini) qayta ishlash, ma'lumotlar bazasidan katta namunalar bo'yicha hisob -kitoblarni bajarish va h.k. zarur bo'lganda paydo bo'ladi. Va biz hech qachon bu operatsiyalar barcha mavjud xotirani egallashini xohlamaymiz, shuning uchun biz imkon qadar xotirani saqlashga harakat qilishimiz kerak. Ma'lumotlar katta bo'lmasligi kerak - PHP generatorlari ma'lumotlar hajmidan qat'iy nazar samarali. Shuni unutmangki, bizning maqsadimiz - bu ilovani tez va shu bilan birga xotirani iloji boricha kamroq sarflash.

Qaytish kalitlari

Ba'zida biz faqat qiymatni emas, balki kalit-qiymat juftligini qaytarishimiz kerak bo'ladi. Jeneratorlardan foydalanganda biz kalit-qiymat juftlarini quyidagicha yaratishimiz mumkin.

GetRange funktsiyasi ($ max = 10) (
uchun ($ i = 0; $ i< $max; $i++) {
$ qiymati = $ i * mt_rand ();
$ i => $ qiymatini bering;
}
}
?>

Biz bu funktsiyani oddiy qator kabi ishlatishimiz mumkin:

Foreach (getRange (PHP_INT_MAX) $ key => $ qiymati sifatida) (
echo "Kalit ($ kalit) - ($ qiymati)";
}

Qiymatlarni generatorlarga yuborish

Jeneratörlar ham qiymatlarni qabul qilishi mumkin. Bu shuni anglatadiki, generatorlar bizga buyruq yoki boshqa narsaning ko'rinishi bo'lishi mumkin bo'lgan qiymatlarni kiritishga imkon beradi. Masalan, biz generatorga bajarishni to'xtatish yoki chiqishni o'zgartirish zarurligini bildiruvchi qiymat yuborishimiz mumkin. Quyida namuna kodi keltirilgan:

GetRange funktsiyasi ($ max = 10) (
uchun ($ i = 1; $ i< $max; $i++) {
$ injection = $ i hosil qilish;
agar ($ injection === "to'xtatish") qaytsa;
}
}

$ generator = getRange (PHP_INT_MAX);

Foreach ($ generator sifatida $ diapazoni) (
agar ($ oralig'i === 10000) (
// generatorga xabar yuborish
$ generator -> yuborish ("to'xtatish");
}
chop etish "qiymati ($ diapazoni)
";
}

E'tibor bering, ko'rsatma yordamida qaytish v generator vazifalari bu funksiyadan darhol chiqib ketishga olib keladi.

Nihoyat, shuni ta'kidlashni istardimki, generatorlar ishlashni sezilarli darajada yaxshilaydi, biz buni e'tiborsiz qoldirolmaymiz. Ko'pincha, bizning kodimizni bajarish uchun kuchli serverlarga ega bo'lishimiz shart emas - biz ozgina refaktoring qilishimiz kerak. Va generatorlar - bu juda foydali vosita, biz ularni ortiqcha ishlatmasdan tez -tez ishlatishimiz kerak.

Aytmoqchi, generatorlar haqida Men darsimda batafsil ma'lumot beraman. Shuningdek, materialni yaxshiroq o'zlashtirishga yordam beradigan misollar va topshiriqlar mavjud.

Va endi biz tayyor parol yaratish funktsiyasini olamiz va saytingiz foydalanuvchilari uchun yangi parolni tiklash yoki yaratish uchun skript yozamiz.

Parolni tiklash uchun skript

Odatda skript qanday yoziladi?

Har doimgidek, bosqichma -bosqich sxema tuziladi, biz buni bosqichma -bosqich bajarishimiz kerak. Hammasi bitta faylda bo'ladi, reminder.php

1. Skriptni faqat ma'lum bir o'zgaruvchi bo'lsa ishga tushiring, masalan $ action;

2. Parolni yaratish jarayonini boshlash uchun foydalanuvchi belgilaydi E-pochta manzili$ _POST [`ema'l`]; Kodni soddalashtirish uchun biz tayinlaymiz berilgan qiymat o'zgaruvchan $ elektron pochta.

3. bilan tekshiring muntazam ifodalar Foydalanuvchining elektron pochta manzilini to'g'ri ko'rsatishini ta'minlash uchun barcha belgilar. Agar yo'q bo'lsa, xatoni ko'rsating, skriptni tugating. Agar hamma narsa to'g'ri bo'lsa, davom etamiz.

4. Biz ma'lumotlar bazasida, bizning holatimizda foydalanuvchilar jadvalida bir xil pochta manzili bo'lgan foydalanuvchini qidiramiz. Agar yo'q bo'lsa, biz ma'lumotlar bazasida bunday manzil yo'qligi to'g'risida xato qilamiz va skriptni tugatamiz.

5. Ma'lumotlar bazasida shunday manzilga ega foydalanuvchi bor, davom eting va yangi parol yaratish funktsiyasini ishga tushiring. Shuningdek, elektron pochta manzilida biz ma'lumotlar bazasidan yagona foydalanuvchi identifikatorini olamiz va uni $ id o'zgaruvchisiga yozamiz;

Reg.ru: domenlar va xosting

Rossiyadagi eng yirik registrator va xosting provayderi.

Xizmatda 2 milliondan ortiq domen nomlari.

Reklama, domen uchun pochta, biznes echimlari.

Butun dunyo bo'ylab 700 mingdan ortiq xaridor o'z tanlovini qilgan.

Bootstrap ramkasi: tezkor javob berish tartibi

Bootstrap tizimidagi javob berish tartibining asoslari bo'yicha bosqichma-bosqich video darslik.

Kuchli va amaliy vosita yordamida oson, tez va samarali yozishni o'rganing.

Buyurtma berish va pul to'lash tartibi.

* O'tishni to'xtatib turish uchun sichqonchani suring.

Oldinga orqaga

PHP -da tasodifiy satrlarni yaratish

Bu qisqa postda men sizga PHP yordamida tasodifiy satrni qanday yaratishni ko'rsataman.

Shunga o'xshash vazifa turli vaziyatlarda paydo bo'lishi mumkin, masalan:

Oldindan belgilangan belgilar to'plamidan tasodifiy parol yaratish;

Fayl yoki papka uchun tasodifiy nom yaratish (ularni yashirish va himoya qilish uchun);

Jarayon uchun vaqtinchalik yagona identifikatorni yaratish;

Tasodifiy mag'lubiyatni murakkabroq skript uchun "manba material" sifatida ishlatish va h.k.

Tasodifiy satrlarni ishlatishning boshqa usullari mavjud, ular yordamida siz ijod qilishingiz mumkin.

PHP -da bizni qiziqtirgan vazifani bajaradigan maxsus funktsiya yo'q, shuning uchun siz o'zingizning ehtiyojingizga qarab bunday vositani o'zingiz yozishingiz kerak.

Quyida bu muammoni hal qilish variantlaridan biri keltirilgan.

// Funktsiya 2 parametrni oladi: tasodifiy satr uzunligi va uni shakllantirish funktsiyasida ishtirok etadigan belgilar random_string ($ str_length, $ str_characters) ($ str_characters = qator (0,1,2,3,4,5, 6,7,8, 9, "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k" "," l "," m "," n "," o "," p "," q "," r "," s "," t "," u "," v "," w ", "X", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J" "," K "," L "," M "," N "," O "," P "," Q "," R "," S "," T "," U "," V ", "W", "X", "Y", "Z"); // Funktsiya kirill alifbosi yordamida tasodifiy qatorni yaratishi mumkin // $ str_characters = array (0,1,2,3,4,5,6) , 7,8,9, "a", "b", "c", "g", "d", "e", "g", "z", "i", "k", "l" , "m", "n", "o", "p", "p", "s", "t", "y", "f", "x", "c", "h", " w "," u "," e "," u "," i "); // Agar birinchi parametr nol bo'lsa yoki butun son bo'lmasa, false qaytaring (! is_int ($ str_length) || $ str_length< 0) { return false; } // Подсчитываем реальное количество символов, участвующих в формировании случайной строки и вычитаем 1 $characters_length = count($str_characters) - 1; // Объявляем переменную для хранения итогового результата $string = ""; // Формируем случайную строку в цикле for ($i = $str_length; $i >0; $ i--) ($ string. = $ str_characters;) // Natijani qaytarish $ stringni qaytaradi; )

Material yangi boshlanuvchilar uchun mo'ljallanganligi sababli, men bu funksiya qanday ishlashini tushuntirib beraman.

Tasodifiy satr yaratish funktsiyasining o'zi ikkita parametrni oladi. Birinchisi, natijada paydo bo'ladigan satrda ko'rmoqchi bo'lgan belgilar soni. Ikkinchisi, biz yaratishda foydalanmoqchi bo'lgan belgilar majmuasi.

Agar hosil bo'ladigan mag'lubiyat uzunligi nol yoki manfiy bo'lsa va funktsiyani bajarish ma'nosiz bo'lsa va agar tamsayı bo'lmagan raqam ko'rsatilsa, buziladi, biz bu holatlarni ta'minlaymiz va noto'g'ri qaytaramiz.

Agar birinchi parametr to'g'ri bo'lsa, biz count () funktsiyasidan foydalanib, satr hosil qilishda ishtirok etadigan belgilar sonini hisoblaymiz va natijada olingan sondan birini chiqaramiz. Nega bunday qilyapmiz? Bu savolga biroz keyinroq javob beraman, lekin hozircha funksiyaga o'tamiz.

O'zgaruvchini e'lon qilish orqali $ string yakuniy natijani saqlash uchun biz tsiklda tasodifiy chiziq yaratishni boshlaymiz uchun.

Hisoblagichning boshlang'ich qiymati sifatida $ i tsikl tasodifiy satrda ko'rishni istagan belgilar sonini bildiradi ($ str_length).

Keyin hisoblagich qiymati noldan katta bo'lsa, tsikl bajarilishi sharti keladi.

Nihoyat, tsiklning har bir takrorlanishidan so'ng, biz "-" kamaytirish operatori yordamida hisoblagich qiymatini bitta kamaytiramiz.

Shunday qilib, loop oxirgi qatordagi belgilar sonini olishni xohlagancha takrorlashni amalga oshiradi.

Xo'sh, endi tsiklning tanasini ko'rib chiqaylik va nima uchun biz o'zgaruvchining belgilar sonidan birini olib tashladik degan savolga qaytamiz. $ str_characters.

Ko'rib turganingizdek, biz o'zgaruvchiga ketma -ket qo'shib, oxirgi qatorni tashkil qilamiz $ string pastadir orqali har bir o'tish uchun bitta belgi.

Keling, batafsil ko'rib chiqaylik.

Biz funktsiyadan foydalanamiz mt_rand () va unga ikkita parametr - nol va bir xil o'zgaruvchi bittaga kamayadi $ belgilar_uzunligi... Funktsiya mt_rand () bizga ma'lum bir diapazonda tasodifiy sonni yaratishga imkon beradi (ya'ni noldan togacha) $ belgilar_uzunligi).

Bu funktsiyani ishlatishdan maqsad shundaki, uning yordamida biz qator uchun indeks sifatida ishlatiladigan tasodifiy sonni yaratamiz. $ str_characters.

Indeks qatordan qaysi belgi ekanligini ko'rsatadi $ str_characters olishni xohlaymiz.

Bu erda biz asosiy nuqtaga keldik. Agar biz birinchi elementni shunga o'xshash qurilish yordamida olgan bo'lsak

$ str_characters;

keyin oxirgi elementni quyidagilarni yozish orqali olish mumkin edi (axir bizda massivda 62 ta element bor):

$ str_characters;

Bu juda mantiqiy bo'lardi, lekin, afsuski, bu to'g'ri emas.

Aslida, birinchi element orqali kirish mumkin

$ str_characters;

va 62 element (oxirgi) orqali

$ str_characters;

Siz buni faqat ushbu qiymatlarni ko'rsatish orqali tekshirishingiz mumkin.

Nega biz 62 -dan birini olib tashlaganimiz aniq bo'ldi. Faqat indekslarimiz diapazoni 0 dan 61 gacha bo'lishi uchun. Bu bizga tasodifiy 62 indeksli tasodifan mavjud bo'lmagan elementga havola qilish ehtimoli bo'lmagan holda tasodifiy qatorni to'g'ri shakllantirishni ta'minlaydi.

Hammasi shu. Operator yordamida qiymatni qaytarish qaytish- va bizning vazifamiz tayyor.

Buni chaqirish va tasodifiy satrimizda kerakli sonlarni parametr sifatida o'tkazish qoladi, masalan:

Echo random_string (16, $ str_characters);

Natijada, biz mutlaqo mos kelmaydigan narsani olamiz, masalan:

ATq4Lh9PNEm8cCxp

Maqsadga erishildi va endi biz o'z vazifamizni ijodiy ravishda kerak bo'lganda qo'llashimiz mumkin.

Albatta, bizning vazifamiz universaldir va rus tilida ham yaxshi ishlaydi. Yuqoridagi kodda siz qatorning boshqa variantini ko'rishingiz mumkin $ str_characters(izoh berilgan) kiril alifbosidan iborat.

Buni tekshirish uchun biz birinchi qatorni sharhlashimiz mumkin $ str_characters(lotin harflari bilan) va ikkinchisiga izoh bermang.

Endi, agar biz sahifani yangilasak, shunga o'xshash narsani olamiz:

Ju4d70y779w5

Shunday qilib, siz xohlagan belgilarni ishlatishingiz mumkin. Buning uchun siz ularni mavjud qatorga qo'shishingiz yoki yangisini yaratishingiz mumkin.

Va nihoyat, foydali bo'lishi mumkin bo'lgan bitta izoh.

Ishonchim komilki, siz foydalanuvchi sifatida tasodifiy yaratilgan parollarni uchratgansiz, unda qanday ramz ekanligini tushunish qiyin:

Yoki "l" kichik harfi yoki "1" raqami;
- yo ruscha "c", yoki inglizcha "c";
- yo ruscha "y", yoki inglizcha "y";
- yo nol, yoki "o" harfi (yana rus yoki inglizcha);
- va hokazo.

Shuning uchun, agar siz boshqa foydalanuvchilar uchun qandaydir mag'lubiyatni o'zingiz yaratgan bo'lsangiz, ular uchun tushunarli ekanligiga ishonch hosil qilishingiz kerak. Tasavvur qiling, siz boshqa odamning o'rnida turibsiz va hayron bo'lasiz: "Bu nima?", "Bu harfmi yoki raqammi, la'natmi?"

Men sizning e'tiboringizni PHP -da html -ni yaratish uchun echimni taklif qilaman. Vazifa ahamiyatsiz bo'lib tuyuladi, lekin men uni kengaytiruvchi, qisqacha, lekin ayni paytda yaxshi funksionallik bilan bo'lishini istardim. Bu yomon emasdek tuyuldi.

Men darhol aytishim kerak (ko'pchilik sharhlarga ishonganidek), vazifa shablon dvigatelini yozish emas (ulardan ko'pi bor) va JavaScript shablon mexanizmini almashtirish emas. Haqiqiy yo'l html va ma'lumotlarni ajratish ekanligini juda yaxshi bilaman. Lekin men yii -dagi CGridView kabi ramka komponentlarini yaratish uchun sinflarga html yozishim kerak edi, html -ni bunday joylarga joylashtirishga arziydimi? alohida fayllar Siz qaror qilasiz.

Asosiy maqsad - sinflar va funktsiyalarda html -dan qutulish.

Oddiy misol, oddiy tugma:

CHtml :: create () -> p () -> a (qator ("href" => "http://habrahabr.ru", "class" => "btn")) -> matn ("O'tish" ) -> ko'rsatish ();
Natija:

Ga o'ting

Hech qanday murakkab narsa yo'q, buni cheklash mumkin, lekin men ilmoqlarni xohlardim:
$ arr = array ("1" => "Birinchi", "2" => "Ikkinchi"); CHtml :: create () -> ($ variantlari) -> har birini tanlang (CHtml :: plainArray ($ arr, "qiymat", "matn")) -> variant ("qator (" qiymat "=> $ ma'lumotlar-> qiymat) ") -> matn (" $ data-> matn ") -> tugatish () -> endEach ()
Bu erda massivni shaklga aylantiradigan plainArray () funktsiyasini chaqirish kerak edi:
$ arr = qator (qator ("qiymat" => "1", "matn" => "Birinchi"), qator ("qiymat" => "2", "matn" => "Ikkinchi")));
Loop ichidagi teglar funktsiyalari yoki satrlarni o'z ichiga olishi mumkin.

$ ustunlar = qator (qator ("id" => "NAME", "label" => "Ism"), qator ("id" => "YOSH", "label" => "Yosh")); $ data = qator (qator ("NAME" => "Piter", "AGE" => 29), qator ("NAME" => "Vasiliy", "AGE" => 32)); CHtml :: create () -> table () -> thead () -> tr () -> har bir ($ ustunlar) -> th () -> matn (funksiya ($ ustun)) ($ ustunini qaytaring ["label" ];)) -> oxiri () -> endEach () -> oxiri () -> oxiri () -> tbody () -> har biri ($ ma'lumotlar) -> tr () -> har biri ($ ustunlari) -> td () -> matn (funktsiya ($ satr, $ ustun) ($ qatorini qaytaring [$ ustun ["id"]];)) -> oxiri () -> endEach () -> oxiri () -> endEach ( ) -> ko'rsatish ();

Yopiq teglar avtomatik ravishda yopiladi.

Sinf shakllarda foydalanish uchun kengaytirilishi mumkin. Siz uni meros yoki qaramlik in'ektsiyasi orqali kengaytira olasiz, chunki har bir teg qanday ko'rsatilishi va uning atributlari bitta funktsiyadan foydalaniladi, shuning uchun siz bu xatti -harakatni osongina bekor qila olasiz.

CMyHtml klassi CHtml (umumiy funktsiya a ($ options = array ()) ($ default = array ("href" => "javascript: void (0)"); parent :: a (array_replace ($ default, $ options) )))))

CForm klassi (xususiy $ _lastLabel = ""; umumiy funktsiya __construct (CModel $ model, CHtml $ html = null) ($ this -> _ model = $ model; $ this -> _ html = $ html ?: CHtml :: create ();) umumiy funktsiya __call ($ method, $ ps) ($ options = $ ps? $ ps: array (); if ($ method === "label") ($ this -> _ lastLabel = isset ($) variantlar ["for"])?? $ this -> _ model-> getLabel ($ options ["for"] uchun): "";) if ($ method === "text" && $ this -> _ lastLabel) ( $ options = $ options?: $ this -> _ lastLabel; $ this -> _ lastLabel = "";) $ this -> _ html -> $ method ($ options); $ this;))

Yechimni o'zi ko'rish va sinab ko'rish mumkin