Aserce

Školení, která pořádám

Dopsal jsem knihu

Funkce assert provede nastavenou akci (vypíše varování, zastaví program nebo zavolá uživatelskou funkci), pokud se její parametr vyhodnotí jako false. Používá se pro účely ladění a je možné ji volat buď s parametrem typu string (tehdy se předaný kód podobně jako u funkce eval provede) nebo s jakýmkoliv jiným výrazem:

<?php
assert('$pocet == 32');
assert($pocet == 32);
?>

Z několika důvodů je lepší tuto funkci volat vždy s řetězcem obsahujícím kód:

  1. pokud je vyhodnocování asercí vypnuté, tak se kód zbytečně neprovádí
  2. pokud by výraz vrátil řetězec, tak tento řetězec funkce assert vyhodnotí jako PHP kód
  3. v případě chyby se vyhodnocovaný kód dozvíme

Aserce je vhodné používat k provádění tzv. sanity-checks – k ověření podmínek, které by za všech okolností měly být splněny. Já jsem podobný mechanismus (ovšem v Delphi) využil u mariáše, kde se např. po zamíchání karet ověřuje, zda v balíčku zůstalo 32 karet nebo zda je součet peněz jednotlivých hráčů nulový. Aserce se samozřejmě dají snadno simulovat kódem if (assertion) { obsluha }, ale proti tomuto způsobu mají několik výhod – jednak se dají snadno vypnout a jednak nabízí standardní nastavitelné ošetření neočekávaných stavů.

Jakub Vrána, Seznámení s oblastí, 24.10.2005, diskuse: 6 (nové: 0)

Diskuse

David Majda:

Podstatnou vadou na kráse PHPkovských asercí je, že narozdíl od všech rozumných programovacích jazyků nemají signaturu

assert(výraz, *informační_text*)

a tedy při porušení aserce se musím často kouknout do kódu, co se přesně stalo. Z popisu bych třeba věděl hned.

(Pokud si říkáte "z kódu přece hned poznáš, co udělal špatně", tak uvažte příklad knihovny, která je vevnitř poměrně komplikovaná, používá asserty a pak jejího uživatele, který vnitřnosti nechce znát a jen používá rozhraní knihovny a použije ho špatně, čímž vevnitř knihovny vyvolá assert. Takovému uživateli je hláška s kódem porušené podmínky uplně na nic.)

Závěr: Ve všech svých projektech si píšu assert vlastní.
# 24.10.2005 10:59:08 reagovat

ikona Jakub Vrána:

Trochu krkolomné, spíše akademické, řešení:
<?php
function my_assert($assertion, $text)
{
   
assert_options(ASSERT_CALLBACK, create_function('$file, $line, $code', "echo '" . addcslashes($text, "\\'") . "';"));
   
assert($assertion);
}

my_assert('$pocet == 32', 'Nesprávný počet karet');
?>
# 24.10.2005 11:15:53 reagovat

ikona Jakub Vrána:

Elegantní řešení je k vidění na http://llook.wz.cz/weblog/spot/assert-poznamka:
<?php
assert
('false; // poznámka k aserci');
?>
# 23.12.2005 10:29:12 reagovat

Karel Benak:

A co pouzit bud PHPUnit testy, nebo SimpleUnit testy?
# 24.10.2005 13:45:38 reagovat

cita:

OT: nechtěl byste jako jedno z dalších témat napsat něco o snmp? ?yslím ýe nejsem jedniný koho by to zajímalo. díky cita
# 26.10.2005 01:14:08 reagovat

ikona Jakub Vrána:

Bohužel se necítím v této oblasti dostatečně erudovaný.
# 26.10.2005 08:29:39 reagovat

Vložit příspěvek

Používejte diakritiku. Nelze používat HTML značky, 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:

© 2005-2010 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.