Qu'est-ce qu'une assertion PHP ? Comment l'utiliser ?

王林
Libérer: 2023-02-23 13:30:01
avant
7926 Les gens l'ont consulté

Les assertions en PHP sont souvent utilisées pour le débogage afin de vérifier si une expression ou une instruction est FAUX. Cet article vous amènera à re-comprendre la puissance de la fonction PHP assert().

Cet article est basé sur PHP version 7.1.28

1 Qu'est-ce que l'assertion

Lors de l'écriture d'un programme, certaines hypothèses sont L'assertion est souvent utilisée pour capturer des exceptions hypothétiques. Nous pouvons également considérer les assertions comme une forme particulière d'exceptions.

Les assertions sont généralement utilisées pour juger de la structure d'exécution du programme et ne peuvent pas être utilisées pour traiter des processus métier. Le scénario le plus couramment utilisé est celui des tests unitaires, et les frameworks généraux de tests unitaires utilisent des assertions.

assert(1 == 2);
// 运行结果:
// Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25
Copier après la connexion

2. Assertions en PHP

En PHP, utilisez la fonction assert() pour affirmer des expressions.

// PHP 5assert ( mixed $assertion [, string $description ] ) : bool
// PHP 7assert ( mixed $assertion [, Throwable $exception ] ) : bool
Copier après la connexion

4. Méthode d'assertion traditionnelle

L'assertion de paramètre prend en charge à la fois les expressions et les chaînes d'expression (certaines seront utilisées dans des scénarios spécifiques). , comme déterminer si une expression de chaîne est légale)

Si l'assertion est une chaîne, elle sera exécutée en tant que code PHP par assert(). L'avantage d'être une assertion sous forme de chaîne est qu'elle est moins coûteuse lorsque les assertions sont désactivées et que le message contiendra l'expression de l'assertion lorsque l'assertion échoue.

Affirmez que cette fonctionnalité ne doit être utilisée que pour le débogage. Vous devez l'utiliser pour des contrôles d'intégrité afin de tester si une condition doit toujours être VRAIE, pour indiquer une erreur de programme ou pour vérifier la présence de fonctionnalités spécifiques (comme des fonctions d'extension ou des limitations et capacités spécifiques du système).

Les assertions ne doivent pas être utilisées pour les opérations d'exécution normales, telles que la vérification des paramètres d'entrée. En règle générale, votre code devrait également s'exécuter correctement lorsque les assertions sont désactivées.

Exemple :

function my_assert_handler($file, $line, $code, $desc){    echo "Assertion Failed:
    File '{$file}'
    Line '{$line}'
    Code '{$code}'
    Desc '{$desc}'
";
}
// 设置回调函数
assert_options(ASSERT_CALLBACK, 'my_assert_handler');
// 让一则断言失败
assert('1 == 2', '1 不可能等于 2');
Copier après la connexion

Exécuter le résultat :

Assertion Failed:
    File '/Users/shocker/Desktop/demo.php'
    Line '29'
    Code '1 == 2'
    Desc '1 不可能等于 2'
Copier après la connexion

5. Prise en charge des assertions d'exception

en PHP 7, assert () est une structure de langage qui permet à différentes mesures de prendre effet dans différents environnements. Pour plus de détails, voir la configuration zend.assertions.

De plus, la détection des erreurs via AssertionError est également prise en charge.

Exemple d'utilisation :

assert_options(ASSERT_EXCEPTION, 1); 
// 在断言失败时产生异常
try {    
// 用 AssertionError 异常替代普通字符串
    assert(true == false, new AssertionError('True is not false!'));
} catch (Throwable $e) {    
echo $e->getMessage();
}
Copier après la connexion

Résultat d'exécution :

True is not false!
Copier après la connexion

6. Contrôler le comportement d'assertion

PHP prend en charge assert_options() La fonction. configure l'assertion, et vous pouvez également utiliser ini pour la définir

Dans la configuration suivante, l'indicateur constant est utilisé pour la fonction assert_options() à configurer, et le paramètre ini est utilisé pour la fonction ini_set() paramètre, l'effet est le même

Quest-ce quune assertion PHP ? Comment lutiliser ?

zend.assertions est une configuration spéciale (PHP >= 7.0.0 pris en charge) qui contrôle le comportement des assertions dans différents environnements d'exploitation et ne peut être défini qu'avec ini_set(). De plus, s'il est défini sur 1, il ne peut pas être défini sur -1, et vice versa. Les autres ne sont pas restreints.

1 : Compilez le code et exécutez-le (mode développement)

0 : Modifiez le code, mais ignorez-le lors de l'exécution

-1 : Ne compilez pas le code ( mode production)

7. Incompatibilité de version

PHP >= 5.4.8, la description peut être fournie comme quatrième paramètre du mode ASSERT_CALLBACK. Fonction de rappel

En PHP 5, l'assertion de paramètre doit être une chaîne exécutable, ou une expression dont le résultat est une valeur booléenne

En PHP 7, l'assertion de paramètre peut être n'importe quelle expression, et utiliser son fonctionnement sert de base aux assertions

En PHP 7, l'exception de paramètre peut être un objet Throwable, qui est utilisé pour capturer les erreurs d'exécution d'expression ou les résultats d'assertion qui échouent. (Bien sûr, assert.exception doit être activé)

PHP >= 7.0.0, prend en charge les configurations et fonctionnalités liées à zend.assertions, assert.exception

PHP >= À partir de version 7.2, les paramètres L'assertion ne prend plus en charge la chaîne

Deprecated: assert(): Calling assert() with a string argument is deprecated
Copier après la connexion

8. Scénarios d'application

Sortie de débogage :

Regardez d'abord l'exemple :

assert('1 == 2', '1 不可能等于 2');
Copier après la connexion

Résultat de l'exécution :

Warning: assert(): 1 不可能等于 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10
Copier après la connexion

est similaire à :

$expression = 1 == 2;
if (!($expression)) {
    echo "1 不可能等于 2\n";
    var_dump($expression);
    echo __FILE__ . "\n";
}
Copier après la connexion

Cependant, nous ne pouvons pas connaître l'expression spécifique de $expression, ni le nombre spécifique d'exécution lignes.

9. Test unitaire

function arraySum(array $nums) {
    $sum = 0;    foreach ($nums as $n) {
        $sum += $n;
    }    return $sum;
}

assert(arraySum([1, 2, 3]) == 6, 'arraySum() 测试不通过:');
assert(is_numeric(arraySum([1, 2, 3])), 'arraySum() 测试不通过:');
Copier après la connexion

10. Expression de vérification

Conseil :

À partir de PHP 7, une nouvelle classe Error a été ajoutée pour capturer les erreurs intégrées à PHP, y compris les erreurs de syntaxe. L'erreur et l'exception précédente héritent toutes deux de Throwable, donc à partir de la version 7.0.0, Throwable peut détecter toutes les erreurs et exceptions.

L'exemple suivant montre comment vérifier si une expression de chaîne est une expression PHP légale :

try {
    assert('a +== 1');
} catch (Throwable $e) {    
    echo $e->getMessage(), "\n";
}
Copier après la connexion

Résultat d'exécution :

Failure evaluating code: 
a +== 1
Copier après la connexion

Dix 1. Sécurité problèmes

Quel sera le résultat si le code suivant est utilisé ?

function demo(){
    file_put_contents('data.log', 'shockerli.net');
    return true;
}

$func = $_GET["func"];
assert("$func()");
Copier après la connexion

所以,对于 assert 函数,正常情况下是不建议用于生产环境的。

与 eval 一样会执行任何 PHP 代码,危害极大。这也是 PHP 从 7.2 开始废弃支持字符串表达式的原因

感谢您的阅读,如有错误请指出。

相了解更多相关问题请访问PHP中文网:PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!