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.

Jakub Vrána, Výuka, 11.5.2009, diskuse: 25 (nové: 0)

Diskuse

Tomáš Kulda:

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.

Tomáš Kulda:

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.

funtom:

A je ten if opravdu prázdný?

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.

ikona 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...

ikona Jakub Vrána OpenID:

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.

ikona carnero:

O té platnosti bych s dovolením pochyboval...

> Parse error: syntax error, unexpected ')' in test.php on line 2

PHP 5.2.9

ikona Jakub Vrána OpenID:

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í.

ikona 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)

ikona 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 &nbsp;. 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.

těžkotonážní pusa:

Souvisí s tímto:
http://php.vrana.cz/nove-operatory.php

ikona 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">&lt;?php</span>
<span style="color: #007700">if (</span>
<span style="color: #0000BB"> </span>
<span style="color: #007700">)</span>
<span style="color: #0000BB">?&gt;</span>
</pre>

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.