What is the use of the @ symbol in PHP? What is the use of the @ symbol in PHP? php php

What is the use of the @ symbol in PHP?


It suppresses error messages — see Error Control Operators in the PHP manual.


It suppresses errors.

See Error Control Operators in the manual:

PHP supports one error control operator: the at sign (@). When prepended to an expression in PHP, any error messages that might be generated by that expression will be ignored.

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 @...


The @ symbol is the error control operator (aka the "silence" or "shut-up" operator). It makes PHP suppress any error messages (notice, warning, fatal, etc) generated by the associated expression. It works just like a unary operator, for example, it has a precedence and associativity. Below are some examples:

@echo 1 / 0;// generates "Parse error: syntax error, unexpected T_ECHO" since // echo is not an expressionecho @(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"

What exactly happens if you use a custom error handler instead of the standard PHP error handler:

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 @.

This is illustrated in the following code example:

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"

The error handler did not check if @ symbol was in effect. The manual suggests the following:

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