assert: Skillnad mellan sidversioner
Admin (diskussion | bidrag) (Skapade sidan med '== assert == <small>(PHP 4, PHP 5, PHP 7, PHP 8)</small> '''assert''' — Kontrollerar ett påstående === Beskrivning === <pre>assert(mixed $assertion, Throwable|string|null $description = null): bool</pre> assert() möjliggör att definiera förväntningar: påståenden som gäller i utvecklings- och testmiljöer, men som optimeras bort för att inte ha någon kostnad i produktionsmiljöer. Påståenden bör endast användas som en felsökningsfunktion. Ett användn...') |
Admin (diskussion | bidrag) Ingen redigeringssammanfattning |
||
Rad 1: | Rad 1: | ||
== assert == | == assert == | ||
([[PHP 4]], [[PHP 5]], [[PHP 7]], [[PHP 8]]) | |||
'''assert''' — Kontrollerar ett påstående | '''assert''' — Kontrollerar ett påstående | ||
=== Beskrivning === | === Beskrivning === | ||
'''assert'''(mixed '''$assertion''', Throwable|string|null '''$description''' = null): bool | |||
assert() | '''assert()''' tillåter definition av förväntningar: påståenden som är aktiva i utvecklings- och testmiljöer, men optimeras bort för att ha noll kostnad i produktion. | ||
Påståenden bör endast användas som | Påståenden bör endast användas som ett felsökningsverktyg. Ett användningsfall är att fungera som sanity-checks för förutsättningar som alltid borde vara sanna och som, om de inte upprätthålls, indikerar programmeringsfel. Ett annat användningsfall är att säkerställa närvaron av vissa funktioner som tilläggsfunktioner eller vissa systembegränsningar och funktioner. | ||
Eftersom påståenden kan konfigureras att elimineras, bör de inte användas för | Eftersom påståenden kan konfigureras för att elimineras, bör de inte användas för normala runtime-operationer som kontroll av inmatningsparametrar. Som en tumregel bör koden bete sig som förväntat även om påståendekontrollen är inaktiverad. | ||
assert() kommer att kontrollera att förväntningen som ges i | '''assert()''' kommer att kontrollera att förväntningen som ges i påståendet håller. Om inte, och därmed resultatet är falskt, kommer den att vidta lämpliga åtgärder beroende på hur '''assert()''' har konfigurerats. | ||
Beteendet hos assert() styrs av följande INI-inställningar: | Beteendet hos '''assert()''' styrs av följande INI-inställningar: | ||
=== Konfigurationsalternativ för Assert === | |||
{| class="wikitable" | {| class="wikitable" | ||
|- | |||
! Namn !! Standard !! Beskrivning !! Ändringslogg | ! Namn !! Standard !! Beskrivning !! Ändringslogg | ||
|- | |- | ||
| '''zend.assertions''' || 1 || | | '''zend.assertions''' || 1 || | ||
1: | * 1: Generera och utför kod (utvecklingsläge) | ||
0: | * 0: Generera kod men hoppa över den vid runtime | ||
-1: | * -1: Generera inte kod (produktionsläge) || | ||
|- | |- | ||
| '''assert.active''' || true || Om | | '''assert.active''' || true || Om falskt kontrollerar '''assert()''' inte förväntningen och returnerar true, oberoende. || Föråldrat sedan PHP 8.3.0. | ||
|- | |- | ||
| '''assert.callback''' || null || | | '''assert.callback''' || null || En användardefinierad funktion som anropas när ett påstående misslyckas. Dess signatur bör vara: | ||
En användardefinierad funktion som anropas när ett påstående misslyckas. Dess signatur bör vara: | |||
<pre>assert_callback( | <pre> | ||
assert_callback( | |||
string $file, | string $file, | ||
int $line, | int $line, | ||
null $assertion, | null $assertion, | ||
string $description = ? | string $description = ? | ||
): void</pre> | ): void | ||
</pre> | |||
Före PHP 8.0.0 bör signaturen vara: | Före PHP 8.0.0 bör signaturen vara: | ||
<pre>assert_callback( | |||
<pre> | |||
assert_callback( | |||
string $file, | string $file, | ||
int $line, | int $line, | ||
string $assertion, | string $assertion, | ||
string $description = ? | string $description = ? | ||
): void</pre> | ): void | ||
</pre> | |||
|| Föråldrat sedan PHP 8.3.0. | |||
|- | |- | ||
| '''assert.exception''' || true || Om true, kastar den ett AssertionError om förväntningen inte | | '''assert.exception''' || true || Om true, kastar den ett '''AssertionError''' om förväntningen inte uppfylls. || Föråldrat sedan PHP 8.3.0. | ||
|- | |- | ||
| '''assert.bail''' || false || Om true, avbryter | | '''assert.bail''' || false || Om true, avbryter den körningen av PHP-skriptet om förväntningen inte uppfylls. || Föråldrat sedan PHP 8.3.0. | ||
|- | |- | ||
| '''assert.warning''' || true || Om true, | | '''assert.warning''' || true || Om true, genererar den en '''E_WARNING''' om förväntningen inte uppfylls. Denna INI-inställning är ineffektiv om '''assert.exception''' är aktiverad. || Föråldrat sedan PHP 8.3.0. | ||
|} | |} | ||
=== Parametrar === | |||
; assertion : Detta är vilket uttryck som helst som returnerar ett värde, vilket kommer att | |||
; '''assertion''' | |||
: Detta är ett vilket uttryck som helst som returnerar ett värde, vilket kommer att utföras och resultatet används för att indikera om påståendet lyckades eller misslyckades. | |||
'''Varning:''' | |||
Före PHP 8.0.0, om '''assertion''' var en sträng tolkades den som PHP-kod och utfördes via '''eval()'''. Denna sträng skulle skickas till callback som det tredje argumentet. Detta beteende var föråldrat i PHP 7.2.0 och togs bort i PHP 8.0.0. | |||
; '''description''' | |||
: Om '''description''' är en instans av '''Throwable''', kommer den att kastas endast om påståendet utförs och misslyckas. | |||
''' | '''Notering:''' | ||
Från och med PHP 8.0.0 görs detta innan den potentiellt definierade assertions-callbacken anropas. | |||
'''Notering:''' | |||
Från och med PHP 8.0.0 kommer objektet att kastas oavsett konfigurationen av '''assert.exception'''. | |||
''' | '''Notering:''' | ||
Från och med PHP 8.0.0 har '''assert.bail'''-inställningen ingen effekt i detta fall. | |||
=== | Om '''description''' är en sträng kommer detta meddelande att användas om ett undantag eller en varning emitteras. Ett valfritt beskrivande meddelande som kommer att inkluderas i felmeddelandet om påståendet misslyckas. | ||
assert() returnerar alltid true om minst | |||
* zend.assertions=0 | Om '''description''' utelämnas skapas en standardbeskrivning som är lika med källkoden för anropet till '''assert()''' vid kompileringstid. | ||
* zend.assertions=-1 | |||
* assert.exception=1 | === Returvärden === | ||
* assert.bail=1 | '''assert()''' returnerar alltid true om minst en av följande är sann: | ||
* '''zend.assertions=0''' | |||
* '''zend.assertions=-1''' | |||
* '''assert.exception=1''' | |||
* '''assert.bail=1''' | |||
* Ett anpassat undantagsobjekt skickas till '''description'''. | * Ett anpassat undantagsobjekt skickas till '''description'''. | ||
Om | Om ingen av dessa villkor är sanna kommer '''assert()''' att returnera true om '''assertion''' är sanningsenlig och false annars. | ||
=== | === Changelog === | ||
{| class="wikitable" | {| class="wikitable" | ||
|- | |||
! Version !! Beskrivning | ! Version !! Beskrivning | ||
|- | |- | ||
| 8.3.0 || Alla assert. | | 8.3.0 || Alla '''assert.*''' INI-inställningar har föråldrats. | ||
|- | |||
| 8.0.0 || '''assert()''' kommer inte längre att utvärdera strängargument, istället behandlas de som vilket annat argument som helst. Använd '''assert($a == $b)''' istället för '''assert('$a == $b')'''. '''assert.quiet_eval''' php.ini-direktivet och '''ASSERT_QUIET_EVAL''' konstanten har också tagits bort, eftersom de inte längre har någon effekt. | |||
|- | |- | ||
| 8.0.0 || | | 8.0.0 || Om '''description''' är en instans av '''Throwable''', kastas objektet om påståendet misslyckas, oavsett värdet av '''assert.exception'''. | ||
|- | |- | ||
| 8.0.0 || Om description är en instans av Throwable, | | 8.0.0 || Om '''description''' är en instans av '''Throwable''', anropas ingen användarcallback även om den är satt. | ||
|- | |||
| 8.0.0 || Att deklarera en funktion kallad '''assert()''' inom ett namespace är inte längre tillåtet och genererar '''E_COMPILE_ERROR'''. | |||
|- | |||
| 7.3.0 || Att deklarera en funktion kallad '''assert()''' inom ett namespace blev föråldrat. Sådan deklaration emitterar nu en '''E_DEPRECATED'''. | |||
|- | |||
| 7.2.0 || Användning av en sträng som påstående blev föråldrat. Den genererar nu en '''E_DEPRECATED'''-notis när både '''assert.active''' och '''zend.assertions''' är satta till 1. | |||
|} | |} | ||
=== Exempel === | === Exempel === | ||
'''Exempel #1''' assert() exempel | |||
<pre> | <pre> | ||
<?php | <?php | ||
assert(1 > 2); | assert(1 > 2); | ||
echo ' | echo 'Hi!'; | ||
?> | ?> | ||
</pre> | </pre> | ||
Om påståenden är aktiverade (zend.assertions=1) kommer | Om påståenden är aktiverade ('''zend.assertions=1''') kommer ovanstående exempel att ge: | ||
Fatal error: Uncaught AssertionError: assert(1 > 2) in example.php:2 | Fatal error: Uncaught AssertionError: assert(1 > 2) in example.php:2 | ||
Stack trace: | Stack trace: | ||
Rad 96: | Rad 129: | ||
#1 {main} | #1 {main} | ||
thrown in example.php on line 2 | thrown in example.php on line 2 | ||
Om påståenden är inaktiverade (zend.assertions=0 eller zend.assertions=-1) kommer | Om påståenden är inaktiverade ('''zend.assertions=0''' eller '''zend.assertions=-1''') kommer ovanstående exempel att ge: | ||
Hi! | |||
'''Exempel #2''' Använda ett anpassat meddelande | |||
<pre> | <pre> | ||
<?php | |||
assert(1 > 2, "Förväntade att ett ska vara större än två"); | |||
echo 'Hi!'; | |||
?> | |||
</pre> | </pre> | ||
Om påståenden är aktiverade kommer ovanstående exempel att ge: | |||
Fatal error: Uncaught AssertionError: Förväntade att ett ska vara större än två in example.php:2 | |||
Stack trace: | |||
#0 example.php(2): assert(false, 'Förväntade att ett...') | |||
#1 {main} | |||
thrown in example.php on line 2 | |||
Om påståenden är inaktiverade kommer ovanstående exempel att ge: | |||
Hi! | |||
'''Exempel #3''' Använda en anpassad undantagsklass | |||
< | <pre> | ||
<?php | |||
class ArithmeticAssertionError extends AssertionError {} | |||
assert(1 > 2, new ArithmeticAssertionError("Förväntade att ett ska vara större än två")); | |||
echo 'Hi!'; | |||
?> | |||
</pre> | |||
Om påståenden är aktiverade kommer ovanstående exempel att ge: | |||
Fatal error: Uncaught ArithmeticAssertionError: Förväntade att ett ska vara större än två in example.php:4 | |||
Stack trace: | |||
#0 {main} | |||
thrown in example.php on line 4 | |||
Om påståenden är inaktiverade kommer ovanstående exempel att ge: | |||
Hi! | |||
[[ | === Se även === | ||
* [[assert_options()]] — Ställ in/hämta olika assert-flaggor |
Versionen från 13 oktober 2024 kl. 05.12
assert
assert — Kontrollerar ett påstående
Beskrivning
assert(mixed $assertion, Throwable|string|null $description = null): bool assert() tillåter definition av förväntningar: påståenden som är aktiva i utvecklings- och testmiljöer, men optimeras bort för att ha noll kostnad i produktion.
Påståenden bör endast användas som ett felsökningsverktyg. Ett användningsfall är att fungera som sanity-checks för förutsättningar som alltid borde vara sanna och som, om de inte upprätthålls, indikerar programmeringsfel. Ett annat användningsfall är att säkerställa närvaron av vissa funktioner som tilläggsfunktioner eller vissa systembegränsningar och funktioner.
Eftersom påståenden kan konfigureras för att elimineras, bör de inte användas för normala runtime-operationer som kontroll av inmatningsparametrar. Som en tumregel bör koden bete sig som förväntat även om påståendekontrollen är inaktiverad.
assert() kommer att kontrollera att förväntningen som ges i påståendet håller. Om inte, och därmed resultatet är falskt, kommer den att vidta lämpliga åtgärder beroende på hur assert() har konfigurerats.
Beteendet hos assert() styrs av följande INI-inställningar:
Konfigurationsalternativ för Assert
Namn | Standard | Beskrivning | Ändringslogg |
---|---|---|---|
zend.assertions | 1 |
| |
assert.active | true | Om falskt kontrollerar assert() inte förväntningen och returnerar true, oberoende. | Föråldrat sedan PHP 8.3.0. |
assert.callback | null | En användardefinierad funktion som anropas när ett påstående misslyckas. Dess signatur bör vara:
assert_callback( string $file, int $line, null $assertion, string $description = ? ): void Före PHP 8.0.0 bör signaturen vara: assert_callback( string $file, int $line, string $assertion, string $description = ? ): void |
Föråldrat sedan PHP 8.3.0. |
assert.exception | true | Om true, kastar den ett AssertionError om förväntningen inte uppfylls. | Föråldrat sedan PHP 8.3.0. |
assert.bail | false | Om true, avbryter den körningen av PHP-skriptet om förväntningen inte uppfylls. | Föråldrat sedan PHP 8.3.0. |
assert.warning | true | Om true, genererar den en E_WARNING om förväntningen inte uppfylls. Denna INI-inställning är ineffektiv om assert.exception är aktiverad. | Föråldrat sedan PHP 8.3.0. |
Parametrar
- assertion
- Detta är ett vilket uttryck som helst som returnerar ett värde, vilket kommer att utföras och resultatet används för att indikera om påståendet lyckades eller misslyckades.
Varning: Före PHP 8.0.0, om assertion var en sträng tolkades den som PHP-kod och utfördes via eval(). Denna sträng skulle skickas till callback som det tredje argumentet. Detta beteende var föråldrat i PHP 7.2.0 och togs bort i PHP 8.0.0.
- description
- Om description är en instans av Throwable, kommer den att kastas endast om påståendet utförs och misslyckas.
Notering: Från och med PHP 8.0.0 görs detta innan den potentiellt definierade assertions-callbacken anropas.
Notering: Från och med PHP 8.0.0 kommer objektet att kastas oavsett konfigurationen av assert.exception.
Notering: Från och med PHP 8.0.0 har assert.bail-inställningen ingen effekt i detta fall.
Om description är en sträng kommer detta meddelande att användas om ett undantag eller en varning emitteras. Ett valfritt beskrivande meddelande som kommer att inkluderas i felmeddelandet om påståendet misslyckas.
Om description utelämnas skapas en standardbeskrivning som är lika med källkoden för anropet till assert() vid kompileringstid.
Returvärden
assert() returnerar alltid true om minst en av följande är sann:
- zend.assertions=0
- zend.assertions=-1
- assert.exception=1
- assert.bail=1
- Ett anpassat undantagsobjekt skickas till description.
Om ingen av dessa villkor är sanna kommer assert() att returnera true om assertion är sanningsenlig och false annars.
Changelog
Version | Beskrivning |
---|---|
8.3.0 | Alla assert.* INI-inställningar har föråldrats. |
8.0.0 | assert() kommer inte längre att utvärdera strängargument, istället behandlas de som vilket annat argument som helst. Använd assert($a == $b) istället för assert('$a == $b'). assert.quiet_eval php.ini-direktivet och ASSERT_QUIET_EVAL konstanten har också tagits bort, eftersom de inte längre har någon effekt. |
8.0.0 | Om description är en instans av Throwable, kastas objektet om påståendet misslyckas, oavsett värdet av assert.exception. |
8.0.0 | Om description är en instans av Throwable, anropas ingen användarcallback även om den är satt. |
8.0.0 | Att deklarera en funktion kallad assert() inom ett namespace är inte längre tillåtet och genererar E_COMPILE_ERROR. |
7.3.0 | Att deklarera en funktion kallad assert() inom ett namespace blev föråldrat. Sådan deklaration emitterar nu en E_DEPRECATED. |
7.2.0 | Användning av en sträng som påstående blev föråldrat. Den genererar nu en E_DEPRECATED-notis när både assert.active och zend.assertions är satta till 1. |
Exempel
Exempel #1 assert() exempel
<?php assert(1 > 2); echo 'Hi!'; ?>
Om påståenden är aktiverade (zend.assertions=1) kommer ovanstående exempel att ge:
Fatal error: Uncaught AssertionError: assert(1 > 2) in example.php:2 Stack trace:
- 0 example.php(2): assert(false, 'assert(1 > 2)')
- 1 {main}
thrown in example.php on line 2
Om påståenden är inaktiverade (zend.assertions=0 eller zend.assertions=-1) kommer ovanstående exempel att ge:
Hi!
Exempel #2 Använda ett anpassat meddelande
<?php assert(1 > 2, "Förväntade att ett ska vara större än två"); echo 'Hi!'; ?>
Om påståenden är aktiverade kommer ovanstående exempel att ge:
Fatal error: Uncaught AssertionError: Förväntade att ett ska vara större än två in example.php:2 Stack trace:
- 0 example.php(2): assert(false, 'Förväntade att ett...')
- 1 {main}
thrown in example.php on line 2
Om påståenden är inaktiverade kommer ovanstående exempel att ge:
Hi!
Exempel #3 Använda en anpassad undantagsklass
<?php class ArithmeticAssertionError extends AssertionError {} assert(1 > 2, new ArithmeticAssertionError("Förväntade att ett ska vara större än två")); echo 'Hi!'; ?>
Om påståenden är aktiverade kommer ovanstående exempel att ge:
Fatal error: Uncaught ArithmeticAssertionError: Förväntade att ett ska vara större än två in example.php:4 Stack trace:
- 0 {main}
thrown in example.php on line 4
Om påståenden är inaktiverade kommer ovanstående exempel att ge:
Hi!
Se även
- assert_options() — Ställ in/hämta olika assert-flaggor