Chyták
Školení, která pořádám
Mám tady jeden chyták: (stáhnout)
<?php
if ( )
?>
Bude tento kód fungovat? A proč? Vyvolá nějaké chyby?
Než se podíváte do komentářů, zkuste se nad tím zamyslet, případně si i kód spustit. Ale pozor, je to opravdu chyták.
Diskuse
Tipuji, že ten kód tak jak je vlastně vůbec nic nedělá, tak ani nic vypsat nemůže. Neboli když nic, tak nic.
Tak jsem ho zkoušel pustit a doopravdy mi nevypsal vůbec nic. Používám WampServer, nejnovější verzi.
Juraj Hajdúch:
Parse error: syntax error, unexpected ')' in K:\pokusy\jakubvrana\chytak.php on line 2
Ono to asi nejakú definíciu tej podmienky predsa len vyžaduje. Takto vlastne nevie, čo má robiť. No neviem. Na nič iné som neprišiel.
Juraj Hajdúch:
Jasné, lebo aj nasledujúci kód vyvolá tú istú chybu.
<?php
if(){
print "clear";
}
else{
print "else";
}
?>
Marek Hám:
Stiahnite si súbor pomocou odkazu stáhnout. Copy & Paste mi nefungovalo.
Lukáš:
Myslím, že to nebude fungovat ... viděl bych to na parse error, prazdný if být imho nemůže.
Marek Hám:
Kód fungovať bude, ale vyvolá Notice: Use of undefined constant  - assumed ' ' in C:\www\ps\tests\test-001.php on line 2
Je to naozaj chyták :), kedy sa v definícii podmienky nachádza "biely" znak dec(160). PHP to vyhodnotí ako použitie nedefinovanej konštanty a použije namiesto nej textovú hodnotu.
carnero:
Jak komu (resp. jak které PHP)...
Juraj Hajdúch:
MÁM TO, díky Marek Hám, ono k tej podmienke naozaj pristupuje ako ku konštante
<?php
define(" ",true);
if ( ){
echo "if";
}
else{
echo "else";
}
// kód vypíše "if"
?>
ale
<?php
define(" ",false);
if ( ){
echo "if";
}
else{
echo "else";
}
// kód vypíše "else"
?>
...ak som zase dačo nepoplietol :o)
Miloslav Pojman:
Tohle je můj oblíbený:
<?php
System.out.print("Hello world!");
?>
Tool:
ja teda nevím, ale co je na tom za chyták? Dělá to přesně to, co se dá čekat...
Jakub Vrána :
Diskutující už odhalili, že uvnitř závorek je pevná mezera, kterou PHP uznává jako platný identifikátor (stejně jako všechny znaky z horní poloviny ASCII tabulky). PHP to vyhodnotí jako konstantu, která neexistuje, takže se vyvolá chyba úrovně E_NOTICE a použije se její řetězcová hodnota. Ta se vyhodnotí jako pravda (nejde o prázdný řetězec ani řetězec "0"), takže se vnitřek podmíněného příkazu vykoná.
Ten je ale prázdný, protože PHP příkaz lze ukončit buď středníkem nebo koncem bloku PHP kódu (nikoliv koncem souboru).
Uvedená ukázka je tedy platným PHP kódem, s pevnou mezerou jsem se v reálném kódu už setkal (šlo nicméně jen o překlep, který kromě vyvolání E_NOTICE neměl žádný postranní vliv).
Srigi:
Uz od zaciatku mi bolo jasne, ze bez zapnutych E_NOTICE nema cenu ani zapinat editor. Typujem, ze Tomas Kulda ich ma vypnute.
carnero:
O té platnosti bych s dovolením pochyboval...
> Parse error: syntax error, unexpected ')' in test.php on line 2
PHP 5.2.9
Jakub Vrána :
Zjevně sis příklad nestáhl, ale zkopíroval přes schránku a tvůj prohlížeč změnil pevnou mezeru na normální.
carnero:
Ah, to je ono. Díky. Čekal jsem že je to chyták v PHP, ne v zadání. Jdu tím trápit kolegy... (to sis naběhl Kubo, to sis naběhl).
Juraj Hajdúch:
Tiež som sa takto oklamal. :o)
bukaJ:
Oh, dobrý chyták. S pevnou mezerou jsem se zapotil v minulém týdku a zjistil to až náhodou při exportu kódu do HTML, kdy se z toho stalo . Pak jsem zjistil co to umí.
Ale jako kanadský žertím by to mohlo být dobré, někomu v jeho souborech za pár proměnných přihodit pár pevných mezer :) Škoda, že Apríl je za námi.
těžkotonážní pusa:
Myslím, že zas tak dlouho by netrvalo, než by na to přišel. Navíc,
<?php if ( ) ?> by rychle odhalil, že tam něco chybí (nebo v tomto případě spíš přebývá). Něco jiného by bylo přidat mu ji do nějakého výrazu, ve kterém figurují nadefinované konstanty.
Já mám takovou „štábní kulturu”, ve které mezery ve výrazech nepíšu.
Minor:
podle mě ten kód bude házet error, protože příkaz není zakončen středníkem...
krata:
nemusí být ukončený středníkem.
u mě na testovacím serveru to hodí
HTTP Error 503. The service is unavailable.
Windows 7 a IIS7 a php 5.2.9
ggg:
nerobi nic, vo View Source je po stazeni
<?php
if (Â )
?>
tak mi ( ) meni na (Â )
nic, nic
ggg:
aha, jasne
<pre>
<span style="color: #0000BB"><?php</span>
<span style="color: #007700">if (</span>
<span style="color: #0000BB"> </span>
<span style="color: #007700">)</span>
<span style="color: #0000BB">?></span>
</pre>
Diskuse je zrušena z důvodu spamu.