internet pencereler Android

Jeneratör php'de nasıl çalıştığını üretir. PHP rasgele sayı üretimi

Bu makalede, Yineleyici arabiriminin ek yükü ve karmaşıklığı olmadan basit yineleyicileri uygulamanın kolay bir yolunu sağlayan oluşturucuları keşfedeceğiz.

Jeneratörler nasıl çalışır?

Wikipedia'ya göre, jeneratör "Jeneratörün parametrelere sahip olduğu bir dizi döndüren bir işleve çok benzer, onu adlandırabilir ve bir değerler dizisi oluşturabilirsiniz"... Bir jeneratör temelde bir fonksiyon gibidir, ancak bir değer döndürmek yerine gerektiği kadar çok değer verir. Bir işleve benzer, ancak yineleyici gibi davranır.

Üreticiler, return yerine getiri anahtar sözcüğünü kullanır. Döndürmeye benzer şekilde davranır, çağıran işlevin değerini döndürür, ancak işlevi yığından çıkarmak yerine verim durumunu kaydeder. Bu fonksiyon, tekrar çağrıldığında olduğu yerden devam etmenizi sağlar. Aslında, yürütmeyi sonlandırmak için döndürülmeyen bir değer kullanabilseniz de, bir üreteç değeri döndüremezsiniz.

PHP kılavuzu diyor ki: "Bir üreteç işlevi çağrıldığında, hareket ettirilebilen bir nesne döndürür." Oluşturucu iç sınıfının bir nesnesidir ve yineleyici arabirimini aynı şekilde uygular. PHP, bu nesne üzerinde yineleme yaparak, her değere ihtiyaç duyduğunda üreteci çağırır. Bu durum yalnızca bir sonraki değer gerektiğinde korunur.

Yukarıdaki kodun çıktısı şöyle olacaktır:

Jeneratör başladı

0

1

2 sağlar

3 sağlar

4 gösteriliyor

Jeneratör tükendi

İlk jeneratörümüz

Jeneratörler yeni bir kavram değildir ve C#, Python, JavaScript ve Ruby gibi dillerde zaten mevcuttur ve genellikle kullanımlarıyla tanımlanır. teslim olmak anahtar kelime. Aşağıda Python'da bir örnek verilmiştir:

Def file_lines (dosya adı): dosya = dosyadaki satır için açık (dosya adı): file_lines ("bir dosya") satırı için verim satırı file.close () : .................

PHP'deki Python üretecinin üzerine yazalım. (Her iki parçacığın da herhangi bir hata denetimi gerçekleştirmediğini unutmayın.)

Oluşturucu işlevi dosyayı açar ve ardından dosyanın her satırını gerektiği gibi okur. Jeneratör her çağrıldığında kaldığı yerden devam eder. Eylem onaylandığında durumu kaydedildiği için baştan başlamaz. Tüm satırlar okunduktan sonra jeneratör kapanır ve döngü sona erer.

Anahtarları döndürme

PHP yineleyiciler, anahtar/değer çiftlerinden oluşur. Örneğimizde, yalnızca değer döndürüldü ve bu nedenle tuşlar sayısaldı (sayısal tuşlar varsayılandır). İlişkili bir çift döndürmek istiyorsanız, dizi sözdizimini kullanarak anahtarı dahil etmek için verimi değiştirin.

$ satırı; ...) foreach (file_lines ("somefile") as $ key => $ line) (.............)?>

Bir değer girme

verim sadece değer döndürmekle kalmaz, aynı zamanda dışarıdan da değer alabilir. Bu, bir değeri de iletmek istiyorsanız, değeri olan bir nesne üzerinde oluşturucunun send() yöntemini çağırarak yapılır. Bu değer daha sonra hesaplamalarda veya başka şeylerde kullanılabilir.

gönder ("durdur"); ) echo "($v)n"; )?>

Çıktı aşağıdaki gibi olacaktır:

Jeneratörlerle hafıza koruma

Jeneratörler büyük kümeleri hesaplamak için kullanışlıdır ve tüm sonuçlar için aynı anda bellek ayırmak istemiyorsanız veya bilmiyorsanız, tüm sonuçlara ihtiyacınız olacaktır. Sonuçların işlenme şekli nedeniyle, yalnızca geçerli sonuç için bellek ayrılarak bellek miktarı en aza indirilebilir.

Bir dosyadaki tüm satırları dizi olarak döndüren bir dosya () işlevi hayal edin. Dosya () için basit bir referans noktasını (ölçek) manipüle ederek ve her biri Lipsum kullanarak aynı rastgele 100 paragraf metin dosyalarını kullanan file_lines () işlevinin demomuzla, dosya () işlevinin, şundan 110 kata kadar daha fazla bellek kullandığını gösterdik. jeneratör...

Jeneratörlerin tanıtılmasıyla PHP, geliştiricilerin eline güçlü bir araç koydu. Artık yineleyicileri hızlı bir şekilde yazabiliriz, bu da süreçte çok fazla bellek tasarrufu sağlar. Bu eğitimle, umarım bunları projelerinizde kullanmaya başlamaya yetecek kadar edinmişsinizdir.

Araba kullanırken hız her şey değildir. Ama içinde her şeye hız karar verir. Uygulamanız ne kadar hızlı olursa, kullanıcı deneyimi o kadar iyi olur. Tamam, bu makale hakkında PHP'de jeneratörler, peki neden hızdan bahsediyoruz? Birazdan göreceğiniz gibi, jeneratörler uygulama hızı ve bellek tüketimi açısından büyük bir fark yaratıyor.

PHP jeneratörleri nelerdir?

Eklendi 5.5 sürümünde PHP Oluşturucular, bellekte bir dizi veri oluşturmak zorunda kalmadan veriler arasında döngü oluşturmak için basit bir mekanizma sağlayan işlevlerdir. Bunun ne hakkında olduğundan hala emin değil misiniz? O zaman bir göz atalım PHP jeneratörleri Eylemde.

Dosya oluştur jeneratör_test.php aşağıdaki içerikle:


$ dizi =;
için ($ ben = 0; $ ben< $max; $i++) {
$ dizi = $ ben;
}
$ dizisini döndür;
}

Foreach (getRange (15) $ aralığı olarak) (
echo "Veri ($ aralığı)
";
}

Ardından bu dosyanın bulunduğu klasöre konsolu açın ve aşağıdakini yazın

Http: // localhost: 8000 / generator_test.php

Sonuç şöyle olacaktır:

Veri 1
Veri 2
….
Veri 15

Yukarıdaki kod oldukça basittir. Ancak, üzerinde küçük bir değişiklik yapalım:


echo "Veri ($ aralığı)
";
}

Şimdi üretilen sayıların aralığı 0 ile sabit arasında PHP_INT_MAX, yorumlayıcının temsil edebileceği en büyük tam sayı PHP... Bundan sonra, tarayıcıya geri dönün ve sayfayı yenileyin. Ancak bu sefer düz metin yerine hacmin aşıldığına dair bir mesaj alıyoruz. kullanılabilir bellek, bunun sonucunda komut dosyası anormal şekilde sonlandırıldı.

ne ayıp - sen PHP bellek yetersiz! Akla gelen ilk şey ayarı düzenlemektir. php.ini'de memory_limit... Ama kendimize soralım - gerçekten bu kadar etkili mi? Gerçekten tek bir komut dosyasının tüm kullanılabilir belleği doldurmasını istiyor muyuz?

Jeneratör kullanıyoruz

Yukarıdaki fonksiyonun aynısını yazalım, aynı değerle çağıralım. PHP_INT_MAX ve tekrar çalıştırın. Ama bu sefer biz bir üreteç işlevi oluşturalım.

işlev getRange ($ max = 10) (
için ($ ben = 1; $ ben< $max; $i++) {
verim $ ı;
}
}

Foreach (getRange (PHP_INT_MAX) $ aralığı olarak) (
echo "Veri ($ aralığı)
";
}

fonksiyon tanımlama getRange bu sefer sadece değerleri yineliyoruz ve bir çıktı oluşturuyoruz. anahtar kelime teslim olmak talimata benzer dönüş yani bir fonksiyondan bir değer döndürür, ancak tek fark şudur: teslim olmak yalnızca gerektiğinde bir değer döndürür ve tüm veri dizisini tek seferde belleğe sığdırmaya çalışmaz. Tarayıcıya gittiğinizde, sayfada görüntülenen verileri görmelisiniz. Şu gerçeğine dikkat edin PHP'deki jeneratörler yalnızca bir işlev içinden kullanılabilir.

Jeneratörler neden gereklidir?

Zaman zaman, bu tür görevler, büyük miktarda veriyi (örneğin, günlük dosyaları) işlememiz, veritabanından büyük örnekler üzerinde hesaplamalar yapmamız vb. gerektiğinde ortaya çıkar. Ve biz hiçbir şekilde bu işlemlerin mevcut tüm hafızayı almasını istemiyoruz, bu yüzden hafızayı mümkün olduğunca korumaya çalışmalıyız. Verilerin büyük olması gerekmez - PHP jeneratörleri verinin boyutu ne olursa olsun etkilidir. Ve amacımızın uygulamayı hızlı ve aynı zamanda mümkün olduğunca az bellek tüketecek şekilde yapmak olduğunu unutmayın.

Anahtarları döndürme

Yalnızca bir değer değil, bir anahtar/değer çifti döndürmemiz gereken zamanlar vardır. Jeneratörleri kullanırken, aşağıdaki gibi anahtar/değer çiftleri üretebiliriz.

işlev getRange ($ max = 10) (
için ($ ben = 0; $ ben< $max; $i++) {
$ değer = $ ben * mt_rand();
verim $ i => $ değer;
}
}
?>

Bu işlevi basit bir diziyle aynı şekilde kullanabiliriz:

Foreach (getRange (PHP_INT_MAX) $ anahtarı => $ değeri olarak) (
echo "Anahtar ($ tuşu) ($ değeri)";
}

Jeneratörlere Değer Gönderme

Jeneratörler de değerler alabilir. Bununla, üreteçlerin, bir komutun bir görünümü veya başka bir şey olabilen değerler eklememize izin verdiğini kastediyoruz. Örneğin, jeneratörümüze yürütmeyi durdurma veya çıktıyı değiştirme ihtiyacını bildiren bir değer gönderebiliriz. Aşağıda örnek bir kod verilmiştir:

işlev getRange ($ max = 10) (
için ($ ben = 1; $ ben< $max; $i++) {
$ enjekte = verim $ i;
if ($ enjekte === "dur") dönüş;
}
}

$ üreteç = getRange (PHP_INT_MAX);

Foreach ($ aralığı olarak $ üreteci) (
if ($ aralığı === 10000) (
// jeneratöre bir mesaj gönder
$ üreteci -> gönder ("durdur");
}
print "Değer ($ aralığı)
";
}

Talimatı kullanarak unutmayın dönüş v jeneratör fonksiyonları bu işlevden hemen çıkışla sonuçlanacaktır.

Son olarak jeneratörlerin göz ardı edemeyeceğimiz önemli bir performans artışı sunduğunu belirtmek isterim. Çoğu zaman, kodumuzu yürütmek için güçlü sunuculara ihtiyacımız yok - sadece biraz yeniden düzenleme yapmamız gerekiyor. Ve jeneratörler, onları aşırı kullanmadan daha sık kullanmamız gereken çok kullanışlı bir araçtır.

Bu arada, jeneratörler hakkında Dersimde ayrıntılara giriyorum. Malzemeyi daha iyi özümsemenize yardımcı olacak örnekler ve ödevler de vardır.

Ve şimdi hazır bir şifre oluşturma işlevi alıyoruz ve site kullanıcılarınız için yeni bir şifre oluşturmak veya kurtarmak için bir komut dosyası yazıyoruz.

Şifre kurtarma komut dosyası

Bir komut dosyası genellikle nasıl yazılır?

Her zaman olduğu gibi, adım adım yapmamız gereken adım adım bir şema hazırlanır. Her şey tek bir dosyada olur, hatırlatıcı.php

1. Komut dosyasını yalnızca belirli bir değişken varsa çalıştırın, örneğin $ action;

2. Parola oluşturma sürecini başlatmak için kullanıcı şunları belirtir: e$ _POST [`ema'l`]; Kodu basitleştirmek için atadık verilen değer değişken $ e-posta.

3. ile kontrol edin düzenli ifadeler kullanıcının e-posta adresini doğru bir şekilde belirttiğinden emin olmak için tüm karakterler. Değilse, bir hata görüntüleyin, komut dosyasını sonlandırın. Her şey doğruysa, devam edelim.

4. Veritabanında bir kullanıcı arıyoruz, bizim durumumuzda aynı mail adresine sahip users tablosunda. Değilse, veritabanında böyle bir adres bulunmadığına dair bir hata verir ve betiği sonlandırıyoruz.

5. Veritabanında böyle bir adrese sahip bir kullanıcı var, devam edin ve yeni bir şifre oluşturma işlevini başlatın. Ayrıca e-posta adresinde veritabanından benzersiz bir kullanıcı kimliği alıyoruz ve bunu $ id değişkenine yazıyoruz;

Reg.ru: alan adları ve barındırma

Rusya'daki en büyük kayıt şirketi ve barındırma sağlayıcısı.

2 milyondan fazla alan adı hizmette.

Promosyon, etki alanı için posta, iş çözümleri.

Dünya çapında 700 binden fazla müşteri şimdiden seçimini yaptı.

Önyükleme çerçevesi: hızlı yanıt veren düzen

Bootstrap çerçevesindeki duyarlı düzenin temelleri hakkında adım adım bir video eğitimi.

Güçlü ve pratik bir araç kullanarak kolay, hızlı ve verimli bir şekilde dizgi yapmayı öğrenin.

Sipariş vermek ve ödeme almak için düzen.

* Kaydırmayı duraklatmak için farenizi üzerine getirin.

İleri geri

PHP'de rastgele diziler oluşturma

Bu kısa yazıda, PHP kullanarak nasıl rastgele bir dize oluşturabileceğinizi göstereceğim.

Benzer bir görev, çeşitli durumlarda ortaya çıkabilir, örneğin:

Önceden tanımlanmış bir dizi karakterden rastgele bir şifre oluşturma;

Bir dosya veya klasör için rastgele bir ad oluşturma (bunları gizlemek ve korumak için);

Bir süreç için geçici bir benzersiz tanımlayıcının oluşturulması;

Daha karmaşık bir komut dosyası vb. için "kaynak malzeme" olarak rastgele bir dize kullanma.

Rastgele dizeler için yaratıcı olabileceğiniz başka kullanımlar da vardır.

PHP'de bizi ilgilendiren görevi yapacak özel bir fonksiyon yoktur, bu yüzden böyle bir aracı ihtiyaçlarınıza göre kendiniz yazmanız gerekir.

Aşağıda bu sorunu çözmek için seçeneklerden biri bulunmaktadır.

// İşlev 2 parametre alır: rastgele dizenin uzunluğu ve oluşum işlevinde yer alan karakterler random_string ($ str_length, $ str_characters) ($ str_characters = dizi (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 "); // İşlev Kiril alfabesini kullanarak rastgele bir dize oluşturabilir // $ str_characters = dizi (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"); // İlk parametre sıfır ise veya bir tamsayı değilse false döndürür if (! 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;) // Sonucu döndür return $ string; )

Materyal yeni başlayanlar için tasarlandığından, bu fonksiyonun nasıl çalıştığını açıklayacağım.

Rastgele bir dize oluşturma işlevinin kendisi iki parametre alır. Birincisi, ortaya çıkan dizede görmek istediğimiz karakter sayısıdır. İkincisi, doğrudan oluştururken kullanmak istediğimiz bir karakter dizisidir.

Elde edilen dizenin uzunluğu sıfır veya negatifse işlevin yürütülmesi anlamsız olduğundan ve tamsayı olmayan bir sayı belirtilirse bozulacağından, bu durumları sağlarız ve false döndürürüz.

İlk parametre doğruysa, sayım () işlevini kullanarak dize oluşumuna katılan karakter sayısını sayar ve elde edilen sayıdan bir çıkarırız. Bunu neden yapıyoruz? Bu soruya biraz sonra cevap vereceğim ama şimdilik fonksiyona geçelim.

Bir değişken bildirerek $ dize nihai sonucu saklamak için bir döngüde rastgele bir satır oluşturmaya başlarız için.

Sayacın başlangıç ​​değeri olarak $ ben döngü, rastgele dizgede ($ str_length) görmek istediğimiz karakter sayısını gösterir.

Ardından, sayaç değeri sıfırdan büyük olduğu sürece döngünün yürütülmesi şartı gelir.

Son olarak, döngünün her yinelemesinden sonra, "-" azaltma operatörünü kullanarak sayaç değerini bir azaltırız.

Böylece döngü, son dizgedeki karakter sayısını elde etmek istediğimiz kadar yineleme gerçekleştirecektir.

Peki, şimdi döngünün gövdesine bakalım ve değişkendeki toplam karakter sayısından neden bir çıkardığımız sorusuna dönelim. $ str_characters.

Gördüğünüz gibi değişkene sırayla ekleyerek son satırı oluşturuyoruz $ dize döngüden her geçiş için bir karakter.

Hadi daha yakından bakalım.

işlevi kullanıyoruz mt_rand () ve iki parametre iletin - sıfır ve aynı değişken bir azaltılmış $ karakter uzunluğu... İşlev mt_rand () belirli bir aralıkta (yani sıfırdan $ karakter uzunluğu).

Bu işlevi kullanmanın amacı, onun yardımıyla dizi için bir dizin olarak kullanılan rastgele bir sayı oluşturmamızdır. $ str_characters.

Dizin, diziden hangi karakterin olduğunu gösterir. $ str_characters almak istiyoruz.

İşte geldik kilit noktaya. İlk elemanı şöyle bir yapı kullanarak aldıysak

$ str_characters;

o zaman son eleman aşağıdakini yazarak elde edilebilir (sonuçta dizide 62 elemanımız var):

$ str_characters;

Bu oldukça mantıklı olurdu, ancak ne yazık ki doğru değil.

Aslında, ilk öğeye şuradan erişilebilir:

$ str_characters;

ve 62 eleman (son) ile

$ str_characters;

Bu değerleri basitçe görüntüleyerek bunu doğrulayabilirsiniz.

Şimdi neden 62'den bir çıkardığımız tamamen netleşiyor. Sadece indekslerimizin aralığının 0 ile 61 arasında olması için. Bu bize, indeksi 62 olan var olmayan bir öğeye yanlışlıkla atıfta bulunma olasılığı olmadan rastgele bir dizenin doğru oluşumunu sağlayacak olan şeydir.

Bu kadar. Operatörü kullanarak bir değer döndürme dönüş- ve fonksiyonumuz hazır.

Geriye onu çağırmak ve rasgele dizgimizde istenen sayıda karakteri parametre olarak iletmek kalır, örneğin:

Echo random_string (16, $str_characters);

Sonuç olarak, tamamen tutarsız bir şey elde ederiz, örneğin:

ATq4Lh9PNEm8cCxp

Hedefe ulaşıldı ve artık işlevimizi gerektiğinde yaratıcı bir şekilde uygulayabiliriz.

Tabii ki, işlevimiz evrenseldir ve Rusça ile de harika çalışır. Yukarıdaki kodda dizinin başka bir varyantını görebilirsiniz. $ str_characters Kiril karakterlerini içeren (yorumlanır).

Bunu doğrulamak için ilk diziyi yorumlayabiliriz. $ str_characters(latin karakterlerle) ve ikincisinin yorumunu kaldırın.

Şimdi sayfayı yenilersek şöyle bir şey elde ederiz:

Ju4d70y779who5

Bu şekilde istediğiniz sembolleri kullanabilirsiniz. Bunu yapmak için, bunları mevcut bir diziye ekleyebilir veya yeni bir tane oluşturabilirsiniz.

Ve son olarak, yararlı olabilecek bir açıklama.

Bir kullanıcı olarak, bu sembolün ne olduğunu anlamanın pek mümkün olmadığı, rastgele oluşturulmuş şifrelerle karşılaştığınızdan eminim:

Ya küçük "l" harfi ya da "1" sayısı;
- Rusça "c" veya İngilizce "c";
- Rusça "y" veya İngilizce "y";
- sıfır veya "o" harfi (yine Rusça veya İngilizce);
- vesaire.

Bu nedenle, diğer kullanıcılar için kendiniz bir tür dize oluşturursanız, bunun onlar için açıkça anlaşılır olduğundan emin olmalısınız. Başka birinin yerinde olduğunuzu hayal edin ve merak edin: "Bu nedir?", "Bir harf mi yoksa bir sayı mı, kahretsin?"

PHP'de html oluşturma çözümümü dikkatinize sunuyorum. Görev önemsiz görünüyor, ancak genişletilebilir, kısa ama aynı zamanda iyi işlevselliğe sahip olmasını istiyorum. Fena görünmüyordu.

Hemen (birçoğunun yorumlara inandığı gibi) görevin bir şablon motoru yazmak olmadığını (ki zaten birçoğu var) ve JavaScript şablon motorunu değiştirmemek olduğunu söylemeliyim. Gerçek yolun html ve verileri ayırmak olduğunu çok iyi biliyorum. Ancak yii'deki CGridView gibi çerçeve bileşenleri oluşturmak için sınıflarda html yazmam gerekiyordu, bu tür yerlere html koymaya değer mi? ayrı dosyalar sen karar ver.

Ana amaç, sınıflarda ve işlevlerde html'den kurtulmaktır.

Basit bir örnek, normal bir düğme:

CHtml :: create () -> p () -> a (dizi ("href" => "http://habrahabr.ru", "class" => "btn")) -> text ("Git" ) -> render();
Sonuç:

git

Zor bir şey değil, bununla sınırlı olabilir, ancak döngüler istedim:
$ dizi = dizi ("1" => "Birinci", "2" => "İkinci"); CHtml :: create () -> ($ seçenekleri) -> her birini seçin (CHtml :: düzArray ($ dizi, "değer", "metin")) -> seçenek ("dizi (" değer "=> $ veri->) değer) ") ​​-> metin (" $ data-> metin ") -> end () -> endEach ()
Burada diziyi şu şekilde çeviren düzArray() işlevini çağırmak gerekiyordu:
$ dizi = dizi (dizi ("değer" => "1", "metin" => "Birinci"), dizi ("değer" => "2", "metin" => "İkinci"));
Döngü içindeki etiketler, herhangi bir iç içe yerleştirme, örneğin bir tablo ile eval ifadeleri içeren işlevler veya dizeler içerebilir:

$ sütunlar = dizi (dizi ("id" => "NAME", "etiket" => "Ad"), dizi ("id" => "YAŞ", "etiket" => "Yaş")); $ data = dizi (dizi ("NAME" => "Peter", "YAŞ" => 29), dizi ("İSİM" => "Vasily", "YAŞ" => 32)); CHtml :: create () -> tablo () -> thead () -> tr () -> her ($ sütun) -> th () -> metin (işlev ($ sütun) (döndür $ sütun ["etiket" ];)) -> end () -> endEach () -> end () -> end () -> tbody () -> her ($ veri) -> tr () -> her ($ sütun) -> td () -> metin (işlev ($ satır, $ sütun) (dönüş $ satır [$ sütun ["id"]];)) -> end () -> endEach () -> end () -> endEach ( ) -> render();

Kapatılmamış etiketler otomatik olarak kapatılır.

Sınıf, formlarda kullanılmak üzere genişletilebilir. Her bir etiketin nasıl görüntüleneceğini ve özniteliklerini kalıtım veya bağımlılık ekleme yoluyla genişletebilirsiniz, bir işlev kullanılır, böylece bu davranışı kolayca geçersiz kılabilirsiniz.

CMyHtml sınıfı CHtml'yi genişletir (genel işlev a ($ seçenekler = dizi ()) ($ varsayılan = dizi ("href" => "javascript: void (0)"); return parent :: a (array_replace ($ varsayılan, $ seçenekler) ));))

Sınıf CForm (özel $ _lastLabel = ""; genel işlev __construct (CModel $ model, CHtml $ html = null) ($ this -> _ model = $ model; $ this -> _ html = $html?: CHtml :: create () ;) genel işlev __call ($ yöntemi, $ ps) ($ seçenekler = $ ps? $ ps: dizi (); if ($ yöntemi === "etiket") ($ this -> _ lastLabel = isset ($ seçenekler [" için "])? $ this -> _ model-> getLabel ($ options [" for "]):" ";) if ($ method ===" text "&& $ this -> _ lastLabel) ( $ seçenekler = $ seçenekler ?: $ this -> _ lastLabel; $ this -> _ lastLabel = "";) $ this -> _ html -> $ method ($ options); return $ this;))

Çözümün kendisi şu adreste görüntülenebilir ve denenebilir: