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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top