PHP Conference Nagoya 2025

assert

(PHP 4, PHP 5, PHP 7, PHP 8)

assertSavın doğruluğuna bakar

Açıklama

assert(mixed $sav, Throwable|string|null $açıklama = null): bool

assert() beklentilerin tanımlanmasını sağlayan bir dil oluşumudur: geliştirme ve deneme ortamlarında yürürlüğe giren, ancak üretimde sıfır maliyetli olacak şekilde en iyilenmiş savlardır.

Savlar yalnızca hata ayıklama özelliği olarak kullanılmalıdır. Bir kullanımı, her zaman true olması gereken, aksi takdirde bazı yazılım hatalarını gösteren ön koşullar için tutarlılık denetimidir. Başka bir kullanımı ise, eklenti işlevleri veya belirli sistem sınırları ve özellikleri gibi belirli özelliklerin varlığını sınamaktır.

Sav denetimi devre dışı bırakılabilecek şekilde yapılandırılabileceğinden, girdilerin denetlenmesi gibi normal çalışma zamanı işlemleri için kullanılmamalıdır. Genel bir kural olarak, sav denetimi devre dışı bırakılsa bile kod beklendiği gibi davranmalıdır.

assert() oluşumu, sav ile belirtilen beklentinin geçerliliğini sınar.

assert() oluşumunun davranışı aşağıdaki INI ayarları ile değiştirilebilir:

Sav yapılandırma yönergeleri
İsim Öntanımlı Açıklama Sürüm Bilgisi
zend.assertions 1
  • 1: kodu üret ve çalıştır (geliştirme kipi)
  • 0: kodu üret ama çalışma anında etrafından dolaş
  • -1: kod üretme (üretim kipi)
 
assert.active true false ise, assert() beklentiyle ilgilenmez ve koşulsuz olarak true döndürür. PHP 8.3.0 ve sonrasında kullanımı önerilmiyor.
assert.callback null

Sav başarısız olduğunda çağrılacak kullanıcı tanımlı işlev. Sözdizimi:

assert_callback(
    string $dosya,
    int $satır,
    null $sav,
    string $açıklama = ?
): void

PHP 8.0.0 öncesinde, işlevin sözdizimi şöyle olmalıydı:

assert_callback(
    string $dosya,
    int $satır,
    string $sav,
    string $açıklama = ?
): void

PHP 8.3.0 ve sonrasında kullanımı önerilmiyor.
assert.exception 0
  • 1: Sav başarısız olursa istisnayı yavrula: Ya istisna bağımsız değişkeni ile sağlanan nesneyi ya da bir nesne sağlanmamışsa AssertionError nesnesini.
  • 0: Yukarıda açıklandığı gibi bir Throwable kullan veya oluştur, ancak o nesneyi örnekllemek yerine nesneyi temel alan bir uyarı oluştur (PHP 5 davranışıyla uyumlu)
PHP 8.3.0 ve sonrasında kullanımı önerilmiyor.
assert.bail false true ise, beklenti karşılanmazsa PHP betiğinin yürütülmesini iptal eder. PHP 8.3.0 ve sonrasında kullanımı önerilmiyor.
assert.warning true true ise, beklenti karşılanmazsa bir E_WARNING çıktılanır. Bu INI ayarı, assert.exception etkinleştirilmişse etkisizdir.  

Bağımsız Değişkenler

sav

Çalıştırılacak ve sonucu, savın başarını belirlemekte kullanılacak değeri döndüren bir ifade olmalıdır.

Uyarı

PHP 8.0.0 öncesinde, sav PHP kodu olarak yorumlanan ve eval() ile yürütülen bir dizge idi. Bu dizge geri çağırım işlevine üçüncü bağımsız değişken olarak aktarılırdı. PHP 7.2.0'da kullanımı artık ÖNERİLMEMEKTE olup PHP 8.0.0'da kullanımdan KALDIRILMIŞTIR.

açıklama

açıklama bir Throwable örneği ise, yalnızca sav yürütülüp başarısız olduğunda yavrulanır.

Bilginize:

PHP 8.0.0 ve sonrasında, bu, olası bir tanımlanmış onaylama geri çağrım işlevi çağrılmadan önce yapılır.

Bilginize:

PHP 8.0.0 ve sonrasında, nesne assert.exception yapılandırmasına bakılmaksızın yavrulanır.

Bilginize:

PHP 8.0.0 ve sonrasında, bu durumda assert.bail etkisizdir.

sav başarısız olursa başarısızlık iletisine dahil edilecek isteğe bağlı bir açıklama. açıklama bir dizge ise bir istisna veya uyarı çıktılanırsa kullanılır.

açıklama kullanılmazsa, derleme zamanında assert() çağrısı için kaynak koduna eşit öntanımlı bir açıklama oluşturulur.

istisna

PHP 7'de, ikinci bağımsız değişken açıklayıcı bir dizge yerine bir Throwable nesnesi olabilir; sav başarısız olursa ve assert.exception yapılandırma yönergesi de etkinse bu nesne örneklenir.

Dönen Değerler

Aşağıdakilerin en az biri doğruysa ise true döner.

  • zend.assertions=0
  • zend.assertions=-1
  • assert.exception=1
  • assert.bail=1
  • açıklamada özel bir istisna nesnesi belirtilmiş.

Koşulların hiçbiri doğru değilse ancak sav doğru ise assert() true yoksa false ile döner.

Sürüm Bilgisi

Sürüm: Açıklama
8.3.0 assert. INI ayarlarının hiçbirinin kullanımı artık önerilmiyor.
8.0.0 açıklama bir Throwable örneği ise, yalnızca sav yürütülüp başarısız olduğunda yavrulanır.
8.0.0 açıklama bir Throwable örneği ise, atanmış olsa bile geri çağırım işlevi çağrılmaz.
8.0.0 assert() artık dizge savları değerlendirmeye almıyor, herhangi bir bağımsız değişken gibi ele alıyor. Örneğin, assert('$a == $b') yerine artık assert($a == $b) kullanılması gerekiyor. assert.quiet_eval php.ini yönergesi ve ASSERT_QUIET_EVAL sabiti de kaldırıldı ve artık herhangi bir etkisi olmayacak.
8.0.0 Bir isim alanı içinde assert() adlı bir işlevin bildirilmesine artık izin verilmiyor ve böyle bir bildirim olursa E_COMPILE_ERROR çıktılanıyor.
7.3.0 Bir isim alanı içinde assert() adlı bir işlev bildirimi artık önerilmiyor ve böyle bir bildirim olursa bir E_DEPRECATED uyarısı veriliyor.
7.2.0 Sav olarak bir dizge kullanımı artık önerilmiyor. Artık hem assert.active hem de zend.assertions için 1 atanmışsa bir E_DEPRECATED uyarısı veriliyor.

Örnekler

Örnek 1 - assert() örneği

<?php
assert
(1 > 2);
echo
'Hi!';
?>

Savlar etkin olduğunda (zend.assertions=1 yukarıdaki örneğin çıktısı:

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

Savlar etkin olmadığında (zend.assertions=0 veya zend.assertions=-1) yukarıdaki örneğin çıktısı:

Hi!

Örnek 2 - Özel ileti kullanımı

<?php
assert
(1 > 2, "Birin ikiden büyük olması bekleniyor");
echo
'Hi!';
?>

Savlar etkinken yukarıdaki örneğin çıktısı:

Fatal error: Uncaught AssertionError: Expected one to be greater than two in example.php:2
Stack trace:
#0 example.php(2): assert(false, 'Expected one to...')
#1 {main}
  thrown in example.php on line 2

Savlar etkin değilken yukarıdaki örneğin çıktısı:

Hi!

Örnek 3 - Özel istisna sınıfı kullanımı

<?php
class ArithmeticAssertionError extends AssertionError {}

assert(1 > 2, new ArithmeticAssertionError("Expected one to be greater than two"));
echo
'Hi!';

Savlar etkinken yukarıdaki örneğin çıktısı:

Fatal error: Uncaught ArithmeticAssertionError: Expected one to be greater than two in example.php:4
Stack trace:
#0 {main}
  thrown in example.php on line 4

Savlar etkin değilken yukarıdaki örneğin çıktısı:

Hi!

Ayrıca Bakınız

add a note

User Contributed Notes 2 notes

up
33
hodgman at ali dot com dot au
16 years ago
As noted on Wikipedia - "assertions are primarily a development tool, they are often disabled when a program is released to the public." and "Assertions should be used to document logically impossible situations and discover programming errors— if the 'impossible' occurs, then something fundamental is clearly wrong. This is distinct from error handling: most error conditions are possible, although some may be extremely unlikely to occur in practice. Using assertions as a general-purpose error handling mechanism is usually unwise: assertions do not allow for graceful recovery from errors, and an assertion failure will often halt the program's execution abruptly. Assertions also do not display a user-friendly error message."

This means that the advice given by "gk at proliberty dot com" to force assertions to be enabled, even when they have been disabled manually, goes against best practices of only using them as a development tool.
up
9
sven at rtbg dot de
9 months ago
With the current changes made in PHP 8.3 (deprecating the INI settings affecting assertions) and the increasing amount of open source libraries utilizing `assert()` as an easy means to ensure obscure return cases of PHP core function calls are in fact not triggered (e.g. no NULL or FALSE has been returned, but the useful value), the comment made about assertions only being a tool used during development should be considered invalid.

In addition, static code analysis tools use the knowledge gained from `assert($x instanceof MyClass)` to know the type or types that are possible.

Assertions are actively being used in production code, they are useful, and disabling them would only gain minimal performance benefits because the asserted expression usually is very small.

Use this tool where applicable!
To Top