Ich befand mich in einer einzigartigen Situation, in der ich instanceof
nicht verwendet werden konnte (insbesondere Merkmale mit Namensraum), und ich brauchte den Kurznamen so effizient wie möglich, sodass ich selbst einen kleinen Benchmark erstellt habe. Es enthält alle verschiedenen Methoden und Variationen der Antworten in dieser Frage.
$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());
Eine Liste des gesamten Ergebnisses finden Sie hier, aber hier sind die Highlights:
- Wenn Sie sowieso Verwendung Reflexion gehen, verwenden
$obj->getShortName()
ist die schnellste Methode jedoch ; Es ist fast die langsamste Methode , Reflexion nur zu verwenden, um den Kurznamen zu erhalten.
'strrpos'
kann einen falschen Wert zurückgeben, wenn sich das Objekt nicht in einem Namespace befindet 'safe strrpos'
befindet. es also etwas langsamer ist, würde ich sagen, dass dies der Gewinner ist.
- Um die
'basename'
Kompatibilität zwischen Linux und Windows zu gewährleisten, müssen Sie diese verwenden str_replace()
, wodurch diese Methode die langsamste von allen ist.
In einer vereinfachten Ergebnistabelle wird die Geschwindigkeit im Vergleich zur langsamsten Methode gemessen:
+-----------------+--------+
| 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% |
+-----------------+--------+