2015-08-17 17:00:26 -07:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\Debug\FatalErrorHandler ;
use Symfony\Component\Debug\Exception\FatalErrorException ;
2018-11-23 12:29:20 +00:00
use Symfony\Component\Debug\Exception\UndefinedFunctionException ;
2015-08-17 17:00:26 -07:00
/**
* ErrorHandler for undefined functions .
*
* @ author Fabien Potencier < fabien @ symfony . com >
*/
class UndefinedFunctionFatalErrorHandler implements FatalErrorHandlerInterface
{
/**
* { @ inheritdoc }
*/
public function handleError ( array $error , FatalErrorException $exception )
{
2018-11-23 12:29:20 +00:00
$messageLen = \strlen ( $error [ 'message' ]);
2015-08-17 17:00:26 -07:00
$notFoundSuffix = '()' ;
2018-11-23 12:29:20 +00:00
$notFoundSuffixLen = \strlen ( $notFoundSuffix );
2015-08-17 17:00:26 -07:00
if ( $notFoundSuffixLen > $messageLen ) {
return ;
}
if ( 0 !== substr_compare ( $error [ 'message' ], $notFoundSuffix , - $notFoundSuffixLen )) {
return ;
}
$prefix = 'Call to undefined function ' ;
2018-11-23 12:29:20 +00:00
$prefixLen = \strlen ( $prefix );
2015-08-17 17:00:26 -07:00
if ( 0 !== strpos ( $error [ 'message' ], $prefix )) {
return ;
}
$fullyQualifiedFunctionName = substr ( $error [ 'message' ], $prefixLen , - $notFoundSuffixLen );
if ( false !== $namespaceSeparatorIndex = strrpos ( $fullyQualifiedFunctionName , '\\' )) {
$functionName = substr ( $fullyQualifiedFunctionName , $namespaceSeparatorIndex + 1 );
$namespacePrefix = substr ( $fullyQualifiedFunctionName , 0 , $namespaceSeparatorIndex );
$message = sprintf ( 'Attempted to call function "%s" from namespace "%s".' , $functionName , $namespacePrefix );
} else {
$functionName = $fullyQualifiedFunctionName ;
$message = sprintf ( 'Attempted to call function "%s" from the global namespace.' , $functionName );
}
$candidates = array ();
foreach ( get_defined_functions () as $type => $definedFunctionNames ) {
foreach ( $definedFunctionNames as $definedFunctionName ) {
if ( false !== $namespaceSeparatorIndex = strrpos ( $definedFunctionName , '\\' )) {
$definedFunctionNameBasename = substr ( $definedFunctionName , $namespaceSeparatorIndex + 1 );
} else {
$definedFunctionNameBasename = $definedFunctionName ;
}
if ( $definedFunctionNameBasename === $functionName ) {
$candidates [] = '\\' . $definedFunctionName ;
}
}
}
if ( $candidates ) {
sort ( $candidates );
$last = array_pop ( $candidates ) . '"?' ;
if ( $candidates ) {
$candidates = 'e.g. "' . implode ( '", "' , $candidates ) . '" or "' . $last ;
} else {
$candidates = '"' . $last ;
}
$message .= " \n Did you mean to call " . $candidates ;
}
return new UndefinedFunctionException ( $message , $exception );
}
}