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 ;
use Symfony\Component\Debug\Exception\UndefinedMethodException ;
/**
* ErrorHandler for undefined methods .
*
* @ author Grégoire Pineau < lyrixx @ lyrixx . info >
*/
class UndefinedMethodFatalErrorHandler implements FatalErrorHandlerInterface
{
/**
* { @ inheritdoc }
*/
public function handleError ( array $error , FatalErrorException $exception )
{
preg_match ( '/^Call to undefined method (.*)::(.*)\(\)$/' , $error [ 'message' ], $matches );
if ( ! $matches ) {
return ;
}
$className = $matches [ 1 ];
$methodName = $matches [ 2 ];
$message = sprintf ( 'Attempted to call an undefined method named "%s" of class "%s".' , $methodName , $className );
2017-02-02 16:28:38 -08:00
if ( ! class_exists ( $className ) || null === $methods = get_class_methods ( $className )) {
// failed to get the class or its methods on which an unknown method was called (for example on an anonymous class)
return new UndefinedMethodException ( $message , $exception );
}
2015-08-17 17:00:26 -07:00
$candidates = array ();
2017-02-02 16:28:38 -08:00
foreach ( $methods as $definedMethodName ) {
2015-08-17 17:00:26 -07:00
$lev = levenshtein ( $methodName , $definedMethodName );
if ( $lev <= strlen ( $methodName ) / 3 || false !== strpos ( $definedMethodName , $methodName )) {
$candidates [] = $definedMethodName ;
}
}
if ( $candidates ) {
sort ( $candidates );
$last = array_pop ( $candidates ) . '"?' ;
if ( $candidates ) {
$candidates = 'e.g. "' . implode ( '", "' , $candidates ) . '" or "' . $last ;
} else {
$candidates = '"' . $last ;
}
2017-02-02 16:28:38 -08:00
2015-08-17 17:00:26 -07:00
$message .= " \n Did you mean to call " . $candidates ;
}
return new UndefinedMethodException ( $message , $exception );
}
}