Ir para conteúdo
Fórum Script Brasil

iNosuKe 么

Membros
  • Total de itens

    3
  • Registro em

  • Última visita

Sobre iNosuKe 么

  • Data de Nascimento 12/07/2004

Últimos Visitantes

O bloco dos últimos visitantes está desativado e não está sendo visualizado por outros usuários.

iNosuKe 么's Achievements

0

Reputação

  1. Estava desenvolvendo uma class que abstrai algumas ações do file system do php, e fui tendo ideias durante a implementação de tal, no fim, esse foi o resultado: <?php declare(strict_types=1); class File { private $file; private $type; function __construct(string $filePath) { if (!file_exists($filePath)) { throw new InvalidArgumentException("Arquivo não localizado :("); } $this->type = substr($filePath, -3); $this->file = fopen($filePath, "a+"); } function __destruct() { fclose($this->file); } function write(string|array $data): int { return (match ($this->type) { "txt" => function () use ($data) { $bytesWritten = 0; if (is_string($data)) { $result = fwrite($this->file, $data . PHP_EOL); if ($result === false) { throw new RuntimeException("Erro ao tentar escrever no arquivo"); } $bytesWritten += $result; } else { foreach ($data as $line) { $result = fwrite($this->file, $line . PHP_EOL); if ($result === false) { throw new RuntimeException("Erro ao tentar escrever no arquivo"); } $bytesWritten += $result; } } return $bytesWritten; }, "csv" => function () use ($data) { if (!is_array($data)) { throw new InvalidArgumentException("Para aquivos .csv, espera-se uma estrutura de array bidimensional"); } $bytesWritten = 0; foreach ($data as $line) { if (!is_array($line)) { throw new InvalidArgumentException("Para aquivos .csv, espera-se uma estrutura de array bidimensional"); } $result = fwrite($this->file, implode(",", $line) . PHP_EOL); if ($result === false) { throw new RuntimeException("Erro ao tentar escrever no arquivo"); } $bytesWritten += $result; } return $bytesWritten; }, })(); } function read(): Generator { rewind($this->file); return (match ($this->type) { "txt" => function (): Generator { while (!feof($this->file)) { $line = fgets($this->file); if ($line === false and !feof($this->file)) { throw new RuntimeException("Erro ao tentar ler o arquivo"); } yield $line; } }, "csv" => function (): Generator { while (!feof($this->file)) { $line = fgetcsv($this->file); if ($line === false and !feof($this->file)) { throw new RuntimeException("Erro ao tentar ler o arquivo"); } yield $line; } } })(); } } Utilizei o conceito de funções geradoras, aliado ao de funções auto-executáveis. E ao se observar bem, acabou por bagunçar um pouco o conceito fundamental de coroutines, que em cenários normais acontecem entre 2 funções. Na minha implementação, a função read() está no meio das ditas "2 funções": function read(): Generator { rewind($this->file); return (match ($this->type) { "txt" => function (): Generator { while (!feof($this->file)) { $line = fgets($this->file); if ($line === false and !feof($this->file)) { throw new RuntimeException("Erro ao tentar ler o arquivo"); } yield $line; } }, "csv" => function (): Generator { while (!feof($this->file)) { $line = fgetcsv($this->file); if ($line === false and !feof($this->file)) { throw new RuntimeException("Erro ao tentar ler o arquivo"); } yield $line; } } })(); } } se executado: $f = new File("f.txt"); foreach ($f->read() as $line) { echo $line; } o forEach, implicitamente executa métodos da classe **Generator**, que permitem devolver a execução para a **função geradora read()**, mas nesse caso, a função geradora não é explicitamente a read(), mas sim a closure interna a ela. Daí acabei me confundindo um pouco, será que o php repassa a execução para a **função geradora read()**, que por sua vez devolve para sua closure internamente?
  2. A resposta para essa pergunta é: SIM O conceito de object literal (objeto literal) é muito famoso no JS e consiste em criar um objeto que possui propriedades e, claro, valores associados a essas propriedades. No exemplo a seguir, poderemos ver como esse recurso funciona no JS: const programador = { nome: "Fábio Akita", linguagem: "Ruby" }; Agora posso consultar, alterar ou até mesmo executar propriedades e métodos desse meu objeto. Exemplificando a utilização do meu objeto literal: console.log(`Olá, ${programador.nome}`); # saída: Olá, Fábio Akita Esse recurso é amplamente utilizado no mundo JS. Assista uma instrução switch ser substituída por um object literal: let day; switch (new Date().getDay()) { case 0: day = "Sunday"; break; case 1: day = "Monday"; break; case 2: day = "Tuesday"; break; case 3: day = "Wednesday"; break; case 4: day = "Thursday"; break; case 5: day = "Friday"; break; case 6: day = "Saturday"; break; default: throw new Error("Hey! We have only 7 days in the week"); } console.log(`What day of the week is today? ${day}`); Substituindo por um object literal: const dayOfTheWeek = { 0: "Sunday", 1: "Monday", 2: "Tuesday", 3: "Wednesday", 4: "Thursday", 5: "Friday", 6: "Saturday", }; console.log( `What day of the week is today? ${dayOfTheWeek[new Date().getDay()]}` ); Legal, né!? Mas daí você me pergunta, como posso replicar isso no php? Bom, o php não possui o recurso de object literal, mas calma, pois podemos alçar o mesmo resultado de duas maneiras: 1° por meio dos arrays associativos. 2° por meio da estrutura condicional match. 1° maneira: $dayOfTheWeek = [ 0 => "Sunday", 1 => "Monday", 2 => "Tuesday", 3 => "Wednesday", 4 => "Thursday", 5 => "Friday", 6 => "Saturday", ]; $today = date('w'); // Obtém o dia da semana atual (0 para domingo, 1 para segunda, etc.) echo "What day of the week is today? " . $dayOfTheWeek[$today]; 2° maneira: $today = date('w'); // Obtém o dia da semana atual (0 para domingo, 1 para segunda, etc.) $todayInt = $today + 0; // no caso do match precisamos informar um int, para que a associação seja feita corretamente $dayOfTheWeek = match($todayInt) { 0 => "Sunday", 1 => "Monday", 2 => "Tuesday", 3 => "Wednesday", 4 => "Thursday", 5 => "Friday", 6 => "Saturday", }; echo "What day of the week is today? " . $dayOfTheWeek; Bem, esse foi o tutorial, tmjt rapaziada!
×
×
  • Criar Novo...