PHPning sirli olamiga sayohat
Loyihani qo'llab quvvatlash uchub buyerga bosing
PHPda heredocdan menimcha yoshlar unchalik ham foydalanmasa kerak)) Lekin nima ekanligini tushungan odam uchun yaxshi matah. Herodoc sintatsisi uzun va ko’plab qatorlarga ega matnlar uchun qulay hisoblanadi.
Misol:
$string = <<<EOT
<div>
<h1>Sample title</h1>
</div>
EOT;
O’zgaruvchilardan foydalanish:
$js = <<<EOS
var data = {{$jsObjectData}};
EOS;
Ana endi aynan shu o’zgaruvchilar mavzusidan keyin bir muammoga duch kelish mumkin. Ya’ni heredoc sintatsisi orasida funksiyalarga murojaat qilish imkonsiz. Lekin qalovini topsang qor ham yonadi.
Birinchi usul
Bu phpdangi string funksiyasidan foydalanish. Ya’ni php o’zgaruvchiga string shaklida biriktirilgan funsksiya nomiga ham murojaat qila oladi.
function sayhello(){
echo "Hello world!";
}
$fn = 'fn';
$string = <<<EOT
Dastur: {$fn(time())}
EOT;
Ikkinchi usul
Bunisi sizni hayratlantirishi mumkin. Bu usulni PHP parseri(kompilyator)ni chetlab o’tish orqali amalga oshirish mumkin. Parserni chalg’itish o’zgaruvchidan foydalanish mumkin bo’lgan joyda ixtiyoriy ifodalardan foydalanishga imkon beradi. Keling, buni ko’rib chiqaylik:
1-misol:
function someFuncCall(){
return "str";
}
echo ${!${''} = 'str'};
echo ${!${''} = (function(){return 'str';})()};
echo ${!${''} = someFuncCall()};
2-misol:
global ${${!${''} = (function(){return 'str';})()}}; // global $str
var_dump( gettype( $str ) );
3-misol obyektlar doirasida:
//Yangi obyekt yaratish
new ${!${''} = (new class() {
function className() : string
{
return 'StdClass';
}
})->className()}();
//Obyektning qiymati yoki metodiga kirish
(new A)->${!${''} = (function(){return 'b';})()}(); // A->b()
//Obyektning statik qiymati yoki metodiga kirish
A::${!${''} = 'b'}(); // A::b()
Yuqoridagi misollarga birinchi marotaba qaragan odam uchun sistaksis juda g’alati va tushunarsiz ko’rinishi mumkin. Ammo anglashingiz mumkinki bu usul interpolyatsiya ishlaydigan istalgan blokda qo’l keladi.
Ho’sh bu qanday ishlaydi?
Keling, php parseri kodlaridan oddiy o’zgaruvchi yaratish qoidasini ko’raylik:
simple_variable:
T_VARIABLE { $$ = $1; }
| '$' '{' expr '}' { $$ = $3; }
| '$' simple_variable { $$ = zend_ast_create(ZEND_AST_VAR, $2); }
;
Yuqoridagi qoidada ko’rish mumkinki o’zgaruvchi nomi oldiga dollar belgisi qo’yilgan va qavs orasida bo’lgan holda istalgan ifodadan tashkil topishi mumkin. Quyidagi ifoda yaratish qoidasida esa expr_without_variable qismini ko’rishimiz mumkin.
expr:
variable { $$ = $1; }
| expr_without_variable { $$ = $1; }
;
expr_without_variable:
...
| variable '=' expr
{ $$ = zend_ast_create(ZEND_AST_ASSIGN, $1, $3); }
| ...
;
Ikki qoidadan shuni anglash mumkinki, PHP grammatikasi topshiriqlarni o’zgaruvchi nomlari sifatida berishga imkon beradi, chunki topshiriqlarning o’zi ifodadir. Xo’sh qanday chetlab o’tish mumkin? PHP ifodalarni ichkaridan tasqariga qarab baholaydi:
Misol:
<?php
${!${''} = 'str'};
Parcha:
${''} = 'str' // ichki blok
!'str' // qaytarilgan qiymatni rad etish
${''} // yuqoridagi inkor qilingan ifoda bu yerda oʻzgaruvchi nomiga aylanadi
- Avvaliga topshiriqdagi o’zgaruvchi baholanadi va bu ${’’} o’zgaruvchisiga ‘str’ qiymatini o’rnatadi.
- Topshiriqdan qaytarilgan qiymat false (bo’sh satrga ekvivalent) hosil qilish uchun teskari aylantiriladi.
- Tashqi o’zgaruvchi yangi tayinlangan ${’’} uning qiymatini qaytaradi.
Turli vaziyatlarda foydalanish:
<?php
function funcCall() : string {return 'str';}
${!${false} = $a->b()};
${!!!${''} = 'str'};
${!!${true} = func()};
${${funcCall()} = 'str'};
${!${!${''}=++$str}}
Heredoc uchun qo’llash
funtion sayhello( $name ){
return $name;
}
$string = <<<EOT
Salom ${!${''} = sayhello('Eshmat']) }
EOT;
echo $string;
Xulosa
PHP sintaksisi odatda vaxshiylarcha ko’rinsada aslida o’z ichiga juda ko’plab sirlarni olgan. Sirlarni ochish uchun esa uning qanday ishlashiga qiziqishning o’zi yetarli.