2017-10-12 45 views
6

Jestem nowym PHP i uczenie się przez czytanie dokumentacji na php.net - obecnie strony dla assert() wiedzieć o tych assert() i assert_options() funkcje, ale to nie wyjaśnia, dlaczego używamy ich i co te funkcje robią w prostych słowach. Czy ktoś może powiedzieć, co te funkcje robią i dlaczego używamy ich w PHP?Dlaczego używamy assert() i assert_options() w php?

+0

Możliwy duplikat [Czy powinienem używać assert w moim kodzie PHP?] (Https://stackoverflow.com/questions/4516419/should-i-be-using-assert-in-my-php-code) – user1506104

+0

Zalecane wyświetlanie: [Rozmowa Johna Lakosa * Programowanie defensywne wykonane w prawo *] (https://www.youtube.com/watch?v=1QhtXRMp3Hg) o warunkach wstępnych, zapewnieniach i programowaniu defensywnym. Chociaż jest to rozmowa w C++, pomysły dotyczą dowolnego języka programowania, a John podaje jeden z najdokładniejszych opisów tematu, który znam. – ComicSansMS

Odpowiedz

6

Assert() to sprytna funkcja, która działa tak samo jak nasze instrukcje drukowania, ale ma ona tylko efekt, jeśli pewien warunek nie jest zgodny. Zasadniczo mówi się "assert()" To stwierdzenie musi być prawdziwe - jeśli tak nie jest, proszę powiedz mi ". Rozważmy to następujący przykład:

<?php 
    print "Stage 1\n"; 
    assert(1 == 1); 
    print "Stage 2\n"; 
    assert(1 == 2); 
    print "Stage 3\n"; 
?> 

Tutaj mamy dwie assert() s, z pierwszego zaproszenia twierdząc, że jeden musi być równa jednej i drugiej rozmowy twierdząc, że jeden musi być równa dwa. Ponieważ niemożliwe jest ponowne zdefiniowanie stałych takich jak 1 i 2, pierwsza wartość parametru assert() zawsze będzie równa true, a druga zawsze będzie równała false. Oto wyjściowy skryptu:

Etap 1 Etap 2 Uwaga: dochodzić()

[http://www.php.net/function.assert]: Twierdzenie naruszyła /home/paul/sandbox/php/assert.php na linii 5

Etap 3

Zauważ, że pierwszy assert() nie widać na wyjściu w ogóle, ponieważ ocenia się true, natomiast drugi assert() evalu do false, otrzymujemy więc warning o numerze assertion failure. Zauważ również, że widzimy "Stage 3" po stwierdzeniu failure warning, ponieważ skrypt wykonuje wykonywanie po niepowodzeniu. Dopóki twierdzenia są prawdziwe, nie mają wpływu na działanie skryptu, co oznacza, że ​​można je wstawiać w celu debugowania i nie trzeba się martwić o ich usunięcie po zakończeniu debugowania.


Jeśli martwisz się o swoich twierdzeń spowolnienie wykonanie w dół, które, chociaż hit prędkość będzie minimalna, to wciąż ważny problem, można wyłączyć wykonanie assert() za pomocą funkcji assert_options() lub poprzez ustawienie assert.active do Wyłącz w pliku php.ini. Jeśli chcesz użyć assert_options(), potrzebne są dwa parametry - opcja ustawienia i wartość, na którą chcesz ją ustawić - i istnieje wiele sposobów, które mogą sprawić, że asert() będzie potężniejszy. enter image description here

pamiętać, że wszystkie z tych opcji można ustawić w pliku php.ini tak, że są one zawsze w efekcie - najważniejsze opcje, aby zmienić to assert.active, assert.warning, assert.bail, assert.quiet_eval, and assert_callback.

ASSERT_CALLBACK to bardzo przydatne opcje, ponieważ pozwala napisać procedurę obsługi błędów, gdy kod nie powiedzie potwierdzenia. Przyjmuje nazwę ciągu funkcji do wykonania, gdy asercje się nie powiodą, a zdefiniowana funkcja musi przyjmować trzy parametry - jeden do przechowywania pliku, w którym wystąpiło potwierdzenie, jeden do zatrzymania linii i jeden do przechowywania wyrażenia. Używanie wszystkich trzech razem w funkcji wywołania zwrotnego pozwala generować znaczące komunikaty o błędach, które można łatwo usunąć z debugowania.Rozważmy następujący fragment kodu:

<?php 
    function assert_failed($file, $line, $expr) { 
     print "Assertion failed in $file on line $line: $expr\n"; 
    } 

    assert_options (ASSERT_CALLBACK, 'assert_failed'); 
    assert_options (ASSERT_WARNING, 0); 

    $foo = 10; 
    $bar = 11; 
    assert('$foo > $bar'); 
?> 

Ref: http://www.hackingwithphp.com/19/8/3/making-assertions


Przykład z oficjalnej dokumentacji

assert_options - Set/dostać różne flagi dochodzić

Przykład # 1 assert_options() przykład

<?php 
// This is our function to handle 
// assert failures 
function assert_failure() 
{ 
    echo 'Assert failed'; 
} 

// This is our test function 
function test_assert($parameter) 
{ 
    assert(is_bool($parameter)); 
} 

// Set our assert options 
assert_options(ASSERT_ACTIVE, true); 
assert_options(ASSERT_BAIL,  true); 
assert_options(ASSERT_WARNING, false); 
assert_options(ASSERT_CALLBACK, 'assert_failure'); 

// Make an assert that would fail 
test_assert(1); 

// This is never reached due to ASSERT_BAIL 
// being true 
echo 'Never reached'; 
?> 

Zgodnie php documetnation assert()

  1. Jeśli twierdzenie jest podany jako ciąg będzie oceniany jako kod PHP przez assert().
  2. Po przekazaniu warunku boolowskiego jako potwierdzenia, warunek ten nie będzie wyświetlany jako parametr funkcji potwierdzenia, który mógł zostać zdefiniowany za pomocą assert_options(). Warunek jest konwertowany na ciąg przed wywołaniem funkcji obsługi, a wartość logiczna FAŁSZ to przekształcone jako pusty ciąg.
  3. Assertions należy używać tylko jako funkcji debugging. Możesz ich używać do sprawdzania poprawności, które sprawdzają warunki, które zawsze powinny być PRAWDĄ i które wskazują błędy programistyczne, jeśli nie, lub sprawdzać obecność pewnych funkcji, takich jak funkcje rozszerzenia lub niektóre ograniczenia i funkcje systemu.
  4. Assertions nie powinny być używane do normalnych działań w czasie wykonywania, takich jak kontrole input parameter. Z reguły kod powinien zawsze działać poprawnie, jeśli sprawdzanie asercji nie jest aktywne.
  5. Zachowanie assert() może być skonfigurowany assert_options() lub .ini-settings opisane w tym możliwości ręcznego videosygnału assert_options() funkcji i/lub ASSERT_CALLBACK dyrektywy konfiguracji pozwolić funkcji zwrotną ustawiony uchwyt nieudane twierdzenia. 6. Oddzwanianie na numer assert() jest szczególnie przydatne przy budowaniu zautomatyzowanych zestawów testów, ponieważ umożliwiają one łatwe przechwytywanie kodu przekazanego do asercji wraz z informacją o tym, gdzie dokonano potwierdzenia. Podczas gdy te informacje mogą być przechwytywane za pomocą innych metod, użycie asercji sprawia, że ​​jest to znacznie szybsze i łatwiejsze!
+1

"ASSERT_CALLBACK jest bardzo użyteczną opcją, ponieważ pozwala napisać procedurę obsługi błędów, gdy kod nie powiedzie potwierdzenia, pobiera nazwę ciągu funkcji do wykonania, gdy asercje kończą się niepowodzeniem [...]" - jest to niepoprawne . Dokumentacja mówi "Oddzwonienie, aby wywołać nieudane potwierdzenia". Oznacza to, że 'ASSERT_CALLBACK' może pobierać [dowolne wywołanie] (http://php.net/manual/en/language.types.callable.php). Oznacza to, że możesz przekazywać anonimowe funkcje i wszystko, co można nazwać funkcją. –

3

Funkcja assert() to dobry sposób na zapewnienie, że pewne warunki są spełnione przez całe życie kodu. Zacytować this article Paul Hudson:

Zasadniczo assert() służy do powiedzenia "To stwierdzenie musi być prawdą - jeśli nie, to proszę mi powiedzieć".

Aby włączyć obsługę twierdzenia używać assert_options(ASSERT_ACTIVE), a także korzystać z innych argumentów assert_options() kontrolować, co się dzieje, gdy nie twierdzenia (np zakończenia wykonywania skryptu PHP, gdy twierdzenie nie powiedzie się, wywołując funk- obsługi, która mogłaby być wykorzystana do wysyłania wiadomości e-mail, rejestrowania danych w plikach i/lub tabelach bazy danych itp.). W sekcji parameters znajduje się lista wszystkich opcji i ich wyników.

Wypróbuj niektóre opcje w this playground example.

Przeczytaj that article, aby uzyskać więcej informacji na temat obu tych funkcji.