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
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
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');
Exécuter le résultat :
Assertion Failed: File '/Users/shocker/Desktop/demo.php' Line '29' Code '1 == 2' Desc '1 不可能等于 2'
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(); }
Résultat d'exécution :
True is not false!
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
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
8. Scénarios d'application
Sortie de débogage :
Regardez d'abord l'exemple :
assert('1 == 2', '1 不可能等于 2');
Résultat de l'exécution :
Warning: assert(): 1 不可能等于 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10
est similaire à :
$expression = 1 == 2; if (!($expression)) { echo "1 不可能等于 2\n"; var_dump($expression); echo __FILE__ . "\n"; }
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() 测试不通过:');
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"; }
Résultat d'exécution :
Failure evaluating code: a +== 1
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()");
所以,对于 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!