Was ist eine PHP-Behauptung? Wie benutzt man es?

王林
Freigeben: 2023-02-23 13:30:01
nach vorne
7847 Leute haben es durchsucht

Assertions in PHP werden häufig zum Debuggen verwendet, um zu überprüfen, ob ein Ausdruck oder eine Anweisung FALSE ist. In diesem Artikel erfahren Sie, wie leistungsfähig die Funktion „asser()“ von PHP ist.

Dieser Artikel basiert auf PHP Version 7.1.28

1. Was ist eine Behauptung?

Bestimmte Annahmen gelten beim Schreiben eines Programms Die Behauptung wird häufig verwendet, um hypothetische Ausnahmen zu erfassen. Wir können uns Behauptungen auch als eine besondere Form von Ausnahmen vorstellen.

Behauptungen werden im Allgemeinen zur Beurteilung der Programmausführungsstruktur verwendet und können nicht zur Verarbeitung von Geschäftsprozessen verwendet werden. Das am häufigsten verwendete Szenario ist Unit-Test, und allgemeine Unit-Test-Frameworks verwenden Behauptungen.

assert(1 == 2);
// 运行结果:
// Warning: assert(): assert(1 == 2) failed in /Users/shocker/Desktop/demo.php on line 25
Nach dem Login kopieren

2. Behauptungen in PHP

Verwenden Sie in PHP die Funktion assert(), um Ausdrücke zu bestätigen.

// PHP 5assert ( mixed $assertion [, string $description ] ) : bool
// PHP 7assert ( mixed $assertion [, Throwable $exception ] ) : bool
Nach dem Login kopieren

4. Traditionelle Assertionsmethode

Parameter-Assertion unterstützt sowohl Ausdrücke als auch Ausdruckszeichenfolgen (einige). Es wird in bestimmten Szenarien verwendet , wie z. B. die Bestimmung, ob ein String-Ausdruck zulässig ist)

Wenn die Behauptung eine Zeichenfolge ist, wird sie von Assertion() als PHP-Code ausgeführt. Der Vorteil der Assertion als Zeichenfolge besteht darin, dass es kostengünstiger ist, wenn Assertionen deaktiviert sind, und die Nachricht den Assertionsausdruck enthält, wenn die Assertion fehlschlägt.

Bestätigen Sie, dass diese Funktion nur zum Debuggen verwendet werden sollte. Sie sollten es für Plausibilitätsprüfungen verwenden, um zu testen, ob eine Bedingung immer WAHR sein sollte, um auf einen Programmfehler hinzuweisen oder um das Vorhandensein bestimmter Funktionen (z. B. Erweiterungsfunktionen oder bestimmte Systemeinschränkungen und -fähigkeiten) zu überprüfen.

Assertions sollten nicht für normale Laufzeitvorgänge verwendet werden, wie etwa die Überprüfung von Eingabeparametern. Als Faustregel gilt, dass Ihr Code auch dann ordnungsgemäß ausgeführt werden sollte, wenn Zusicherungen deaktiviert sind.

Beispiel:

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');
Nach dem Login kopieren

Ergebnis ausführen:

Assertion Failed:
    File '/Users/shocker/Desktop/demo.php'
    Line '29'
    Code '1 == 2'
    Desc '1 不可能等于 2'
Nach dem Login kopieren

5. Unterstützen Sie Ausnahmezusicherungen

in PHP 7, Assert () ist eine Sprachstruktur, die es ermöglicht, dass verschiedene Maßnahmen in unterschiedlichen Umgebungen wirksam werden. Weitere Informationen finden Sie in der Konfiguration zend.assertions.

Darüber hinaus wird auch das Abfangen von Fehlern über AssertionError unterstützt.

Verwendungsbeispiel:

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

Ergebnis ausführen:

True is not false!
Nach dem Login kopieren

6. Kontrollieren Sie das Assertionsverhalten

PHP unterstütztassurance_options() Die Funktion konfiguriert die Assertion, und Sie können sie auch mit ini festlegen

In der folgenden Konfiguration wird das Konstanten-Flag für die zu konfigurierende Funktion „assert_options()“ und die ini-Einstellung für die Funktion „ini_set()“ verwendet Einstellung ist der Effekt derselbe

Was ist eine PHP-Behauptung? Wie benutzt man es?

zend.assertions ist eine spezielle Konfiguration (PHP >= 7.0.0 unterstützt), die das Verhalten von Assertions in verschiedenen Betriebsumgebungen steuert und kann nur mit ini_set() gesetzt werden. Wenn es auf 1 gesetzt ist, kann es außerdem nicht auf -1 gesetzt werden, und umgekehrt sind andere nicht eingeschränkt.

1: Kompilieren Sie den Code und führen Sie ihn aus (Entwicklungsmodus)

0: Bearbeiten Sie den Code, aber überspringen Sie ihn beim Ausführen

-1: Kompilieren Sie den Code nicht ( Produktionsmodus)

7. Versionsinkompatibilität

PHP >= 5.4.8, Beschreibung kann als vierter Parameter für den ASSERT_CALLBACK-Modus bereitgestellt werden Rückruffunktion

In PHP 5 muss die Parameterzusicherung eine ausführbare Zeichenfolge oder ein Ausdruck sein, dessen Ergebnis ein boolescher Wert ist

In PHP 7 kann die Parameterzusicherung ein beliebiger Ausdruck sein und verwendet werden seine Operationsergebnisse dienen als Grundlage für Zusicherungen

In PHP 7 kann der Parameter Ausnahme ein Throwable-Objekt sein, das zum Erfassen von Fehlern bei der Ausführung von Ausdrücken oder fehlgeschlagenen Zusicherungsergebnissen verwendet wird. (Natürlich muss Assert.Exception aktiviert sein.)

PHP >= 7.0.0, unterstützt zend.assertions, Assert.Exception-bezogene Konfigurationen und Funktionen

PHP >= Ab Version 7.2, Parameter Assertion unterstützt die Zeichenfolge

Deprecated: assert(): Calling assert() with a string argument is deprecated
Nach dem Login kopieren

nicht mehr 8. Anwendungsszenarien

Debug-Ausgabe:

Schauen Sie sich zuerst das Beispiel an:

assert('1 == 2', '1 不可能等于 2');
Nach dem Login kopieren

Laufergebnis:

Warning: assert(): 1 不可能等于 2: "1 == 2" failed in /Users/shocker/Desktop/demo.php on line 10
Nach dem Login kopieren

ähnelt:

$expression = 1 == 2;
if (!($expression)) {
    echo "1 不可能等于 2\n";
    var_dump($expression);
    echo __FILE__ . "\n";
}
Nach dem Login kopieren

Wir können jedoch weder den spezifischen Ausdruck von $expression noch die spezifische Anzahl der Ausführungen kennen Linien.

9. Unit-Test

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() 测试不通过:');
Nach dem Login kopieren

10. Verifizierungsausdruck

Tipp:

Ab PHP 7 wurde eine neue Fehlerklasse hinzugefügt, um in PHP integrierte Fehler, einschließlich Syntaxfehler, zu erfassen. Error und die vorherige Ausnahme erben beide von Throwable, sodass Throwable ab 7.0.0 alle Fehler und Ausnahmen abfangen kann.

Das folgende Beispiel zeigt, wie überprüft werden kann, ob ein Zeichenfolgenausdruck ein zulässiger PHP-Ausdruck ist:

try {
    assert('a +== 1');
} catch (Throwable $e) {    
    echo $e->getMessage(), "\n";
}
Nach dem Login kopieren

Laufendes Ergebnis:

Failure evaluating code: 
a +== 1
Nach dem Login kopieren

Zehn 1. Sicherheit Probleme

Was wird das Ergebnis sein, wenn der folgende Code verwendet wird?

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

$func = $_GET["func"];
assert("$func()");
Nach dem Login kopieren

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

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

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

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

Das obige ist der detaillierte Inhalt vonWas ist eine PHP-Behauptung? Wie benutzt man es?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:cnblogs.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!