..

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

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.