Mi sono trovato in una situazione unica in cui instanceofnon potevo essere usato (in particolare tratti spaziali) e avevo bisogno del nome breve nel modo più efficiente possibile, quindi ho fatto un piccolo punto di riferimento. Include tutti i diversi metodi e variazioni dalle risposte a questa domanda.
$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());
Un elenco di tutto il risultato è qui ma ecco i punti salienti:
- Se avete intenzione di utilizzare la riflessione in ogni modo, utilizzando
$obj->getShortName()sia il metodo più veloce però ; usando la riflessione solo per ottenere il nome breve è quasi il metodo più lento.
'strrpos'può restituire un valore errato se l'oggetto non si trova in uno spazio dei nomi, quindi mentre 'safe strrpos'è un po 'più lento direi che questo è il vincitore.
- Per rendere
'basename'compatibile tra Linux e Windows devi usare ciò str_replace()che rende questo metodo il più lento di tutti.
Una tabella di risultati semplificata, la velocità viene misurata rispetto al metodo più 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% |
+-----------------+--------+