Php @ işaretinin kullanımı nedir?

5 Cevap php

Ben aşağıdaki gibi bazı fonksiyonların önünde @ kullanarak gördük:

$fileHandle = @fopen($fileName, $writeAttributes);

Bu sembolün kullanımı nedir?

5 Cevap

Bu hata iletileri bastırır - PHP kılavuzunda Error Control Operators bkz.

Ayrıca hataları gizli olmasına rağmen, herhangi bir özel hata işleyicisi ile (set set_error_handler) hala idam edilecek unutmayın!

@ sembolü error control operator ("sessizlik" ya da "kapa çeneni" operatörü aka). PHP bastırmak ilişkili ekspresyon tarafından oluşturulan hata mesajları (haber, uyarı, ölümcül, vb) yapar. Bu örneğin, bir öncelik ve birleşim vardır, sadece bir tekli operatör gibi çalışır. Aşağıda bazı örnekler şunlardır:

@echo 1 / 0;
// generates "Parse error: syntax error, unexpected T_ECHO" since 
// echo is not an expression

echo @(1 / 0);
// suppressed "Warning: Division by zero"

@$i / 0;
// suppressed "Notice: Undefined variable: i"
// displayed "Warning: Division by zero"

@($i / 0);
// suppressed "Notice: Undefined variable: i"
// suppressed "Warning: Division by zero"

$c = @$_POST["a"] + @$_POST["b"];
// suppressed "Notice: Undefined index: a"
// suppressed "Notice: Undefined index: b"

$c = @foobar();
echo "Script was not terminated";
// suppressed "Fatal error: Call to undefined function foobar()"
// however, PHP did not "ignore" the error and terminated the
// script because the error was "fatal"

Yerine standart PHP hata işleyicisi bir özel hata işleyicisi kullandığınızda tam olarak ne olur:

If you have set a custom error handler function with set_error_handler() then it will still get called, but this custom error handler can (and should) call error_reporting() which will return 0 when the call that triggered the error was preceded by an @.

Bu, aşağıdaki kod örnekte gösterilmiştir:

function bad_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    echo "[bad_error_handler]: $errstr";
    return true;
}
set_error_handler("bad_error_handler");
echo @(1 / 0);
// prints "[bad_error_handler]: Division by zero"

@ sembolü yürürlükte olsaydı hata işleyicisi onay vermedi. Manuel aşağıdaki önerir:

function better_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
    if(error_reporting() !== 0) {
        echo "[better_error_handler]: $errstr";
    }
    // take appropriate action
    return true;
}

Açık başarısız olursa, E_WARNING seviyesinde bir hata üretilir. Sen kullanabilirsiniz @ bu uyarıyı bastırmak için.