Posso adicionar a uma função interna?

5

Eu quero ser capaz de reescrever o código de uma função PHP existente de uma maneira abstrata.

Aqui está um exemplo:

scandir () varre um diretório para arquivos e pastas, e retorna os caminhos relativos '.' e '..'.

Enquanto eu poderia apenas criar uma nova função para executar scandir () e remover essas entradas, eu quero tentar reescrever o código para scandir () para permitir um parâmetro extra e adicionar um sinalizador para não incluir esses caminhos.

Então, em vez disso:

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

Eu posso fazer isso:

$files = scandir($path, true);

Isso é possível sem reescrever a totalidade de scandir () com override_function ()?

    
por Stonestorm 27.06.2016 / 12:47
fonte

1 resposta

1

Você pode adicionar a uma função interna? Sim, mas você realmente não deveria. Outro código pode contar com os diretórios . e .. mostrando os resultados, quebrando assim outro código.

Em vez disso, opte por itens como DirectoryIterator ou crie sua própria 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 para usá-lo:

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

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

A solução correta é criar sua própria função ou classe para encapsular o comportamento especializado que você está procurando.

    
por 26.10.2016 / 22:41
fonte