Posso aggiungere a una funzione integrata?

5

Voglio essere in grado di riscrivere il codice di una funzione PHP esistente in modo astratto.

Ecco un esempio:

scandir () esegue la scansione di una directory per file e cartelle e restituisce i percorsi relativi "." e '..'.

Mentre I potrebbe basta creare una nuova funzione per eseguire scandir () e rimuovere queste voci, voglio provare e riscrivere il codice per scandir () a consenti un parametro extra, quindi aggiungi un flag per non includere questi percorsi.

Quindi invece di questo:

$files = [];
foreach(scandir($path) as $index =>  $ref) {
    if(!in_array(['.','..'], $ref)) {
        $files[] = $ref;
    }
}

Posso farlo:

$files = scandir($path, true);

È possibile senza riscrivere la interezza di scandir () con override_function ()?

    
posta Stonestorm 27.06.2016 - 12:47
fonte

1 risposta

1

Puoi aggiungere a una funzione integrata? Sì, ma davvero non dovresti. Un altro codice potrebbe contare sulle directory . e .. che mostrano i risultati, rompendo così altri codici.

Invece, opta per cose come DirectoryIterator o semplicemente crea la tua classe:

class DirectoryFileScanner implements Iterator
{
    public function __construct($path) {
        $this->path = $path;
        $this->position = 0;
    }

    private $files;

    private $path;

    private $position;

    private function getFiles() {
        if (!isset($this->files)) {
            $allFiles = scandir($this->path);
            $this->files = [];

            foreach($allFiles as $index =>  $ref) {
                if(!in_array(['.','..'], $ref)) {
                    $this->files[] = $ref;
                }
            }
        }

        return $this->files;
    }

    public current() {
        return $this->getFiles()[$this->position];
    }

    public key() {
        return $this->position;
    }

    public next() {
        ++$this->position;
    }

    public rewind() {
        $this->position = 0;
    }

    public valid() {
        return isset($this->getFiles()[$this->position]);
    }
}

E per usarlo:

$files = new DirectoryFileScanner('/foo');

foreach ($files as $index => $file) {
    // do stuff with $file
}

La soluzione corretta è creare la tua funzione o classe per incapsulare il comportamento specializzato che stai cercando.

    
risposta data 26.10.2016 - 22:41
fonte

Leggi altre domande sui tag