Je me suis retrouvé dans une situation unique où instanceof
je ne pouvais pas être utilisé (en particulier les traits d'espacement de noms) et j'avais besoin du nom court de la manière la plus efficace possible, alors j'ai fait un petit benchmark par moi-même. Il comprend toutes les différentes méthodes et variations des réponses à cette question.
$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());
Une liste de l'ensemble du résultat est ici mais voici les faits saillants:
- Si vous allez à la réflexion de l' utilisation de toute façon, à l' aide
$obj->getShortName()
est la méthode la plus rapide cependant ; en utilisant la réflexion uniquement pour obtenir le nom court, c'est presque la méthode la plus lente.
'strrpos'
peut renvoyer une valeur erronée si l'objet n'est pas dans un espace de noms, alors que 'safe strrpos'
c'est un tout petit peu plus lent, je dirais que c'est le gagnant.
- Pour rendre
'basename'
compatible entre Linux et Windows, vous devez utiliser str_replace()
ce qui fait de cette méthode la plus lente de toutes.
Un tableau de résultats simplifié, la vitesse est mesurée par rapport à la méthode la plus lente:
+-----------------+--------+
| 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% |
+-----------------+--------+