Come posso verificare se una funzione esiste già nello stack SPL?
-
13-11-2019 - |
Domanda
Sto cercando di usare spl_autoload_register
E voglio creare un if()
Dichiarazione che verificherà se il metodo di classe è già stato registrato.
Per esempio:
if (spl_autoload_function(array($this, '_loadClass'))
// Then do nothing
else
// Then run spl_autoload_register(array($this, '_loadClass));
È possibile qualcosa di simile al codice/metodo sopra?
Soluzione
Sto provando a fare un caricatore automatico e voglio creare un'istruzione IF che controllerà se il metodo di classe è già stato registrato.
Non dovresti. Non è necessario fare l'istruzione IF; spl_autoload_register
Ignorerà solo una seconda chiamata con gli stessi argomenti:
<?php
$foo = function( $class ) {
return false;
};
spl_autoload_register( $foo );
var_dump( spl_autoload_functions( ) );
spl_autoload_register( $foo );
var_dump( spl_autoload_functions( ) );
L'output mostra che sebbene abbiamo chiamato spl_autoload_register
due volte, c'è ancora solo uno autoloader;
array(1) {
[0]=>
object(Closure)#1 (1) {
["parameter"]=>
array(1) {
["$class"]=>
string(10) "<required>"
}
}
}
array(1) {
[0]=>
object(Closure)#1 (1) {
["parameter"]=>
array(1) {
["$class"]=>
string(10) "<required>"
}
}
}
Se vuoi assicurarti che una classe non si registra due volte, puoi ovviamente impostarlo in una sorta di membro statico;
<?php
class Foo {
protected static $registered = false;
public function register( ) {
if( self::$registered !== false ) {
return;
}
echo "spl_autoload_register( \$this, '_loadClass' );\n";
self::$registered = true;
}
}
$foo = new Foo( );
$foo->register( );
$bar = new Foo( );
$bar->register( );
L'output è ovviamente una riga:
spl_autoload_register( $this, '_loadClass' );
Detto questo, perché scrivi il tuo caricatore automatico? Ci sono già numerosi là fuori, è difficile credere che nessuno di loro soddisfi le tue esigenze.
Altri suggerimenti
Disclaimer: Non sono pienamente fiducioso di aver capito la tua domanda, ma sono abbastanza sicuro che ho pensato di provare a rispondere.
Non c'è spl_*
funzione per farlo. Il più vicino che ottieni è spl_autoload_functions()
che restituisce le funzioni utilizzate da SPL per caricare, non le funzioni caricate.
Soluzione:
Scrivi il tuo caricatore che registra quando una funzione/classe è stata caricata e registralo con spl_autoload_register
.
Per rispondere al commento: Se hai una classe che carica le funzioni, avvicinarla a una serie di classi interne che ha già caricato.
class Autoloader {
protected $loaded = array();
function autoload($class) {
// find class location
// if it is found:
// include class
$this->loaded[] = $class;
}
function hasLoaded($class) {
return in_array($class, $this->loaded);
}
}
$autoloader = new Autoloader();
spl_autoload_register(array($autloader, 'autoload'));
Se non ti interessa sapere se è stato caricato dall'autoloader, puoi semplicemente verificare l'uso dell'esistenza class_exists
.