Me encontré en una situación única en la instanceof
que no se podía usar (rasgos específicamente con espacios de nombres) y necesitaba el nombre corto de la manera más eficiente posible, así que he hecho un pequeño punto de referencia propio. Incluye todos los diferentes métodos y variaciones de las respuestas en esta pregunta.
$bench = new \xori\Benchmark(1000, 1000); # https://github.com/Xorifelse/php-benchmark-closure
$shell = new \my\fancy\namespace\classname(); # Just an empty class named `classname` defined in the `\my\fancy\namespace\` namespace
$bench->register('strrpos', (function(){
return substr(static::class, strrpos(static::class, '\\') + 1);
})->bindTo($shell));
$bench->register('safe strrpos', (function(){
return substr(static::class, ($p = strrpos(static::class, '\\')) !== false ? $p + 1 : 0);
})->bindTo($shell));
$bench->register('strrchr', (function(){
return substr(strrchr(static::class, '\\'), 1);
})->bindTo($shell));
$bench->register('reflection', (function(){
return (new \ReflectionClass($this))->getShortName();
})->bindTo($shell));
$bench->register('reflection 2', (function($obj){
return $obj->getShortName();
})->bindTo($shell), new \ReflectionClass($shell));
$bench->register('basename', (function(){
return basename(str_replace('\\', '/', static::class));
})->bindTo($shell));
$bench->register('explode', (function(){
$e = explode("\\", static::class);
return end($e);
})->bindTo($shell));
$bench->register('slice', (function(){
return join('',array_slice(explode('\\', static::class), -1));
})->bindTo($shell));
print_r($bench->start());
Una lista del resultado completo está aquí, pero aquí están los aspectos más destacados:
- Si usted va a utilizar la reflexión de todos modos, el uso
$obj->getShortName()
es el método más rápido , sin embargo ; usando solo reflexión para obtener el nombre corto, es casi el método más lento.
'strrpos'
puede devolver un valor incorrecto si el objeto no está en un espacio de nombres, así que mientras 'safe strrpos'
es un poco más lento, diría que este es el ganador.
- Para hacer
'basename'
compatible entre Linux y Windows, debe usarstr_replace()
que hace que este método sea el más lento de todos.
Una tabla de resultados simplificada, la velocidad se mide en comparación con el método más lento:
+-----------------+--------+
| registered name | speed |
+-----------------+--------+
| reflection 2 | 70.75% |
| strrpos | 60.38% |
| safe strrpos | 57.69% |
| strrchr | 54.88% |
| explode | 46.60% |
| slice | 37.02% |
| reflection | 16.75% |
| basename | 0.00% |
+-----------------+--------+