# PHP para Iniciantes: Tipos de Dados Primitivos - Recursos

**Recursos** (`resource`) é algo que todos precisam para lidar com qualquer tipo de fonte de dados. Pode ser uma `stream`, um `curl`, `dba`, `dbase`, etc. Tem literalmente uma lista enorme de tipos de recursos que você pode encontrar na [documentação oficial do PHP](https://www.php.net/manual/pt_BR/resource.php). Pra quem nunca programou, essa tabela pode soar extremamente complexa por ter termos que você pode não conhecer.

E está tudo bem! Não tente entender os tipos pois cada um tem um contexto absolutamente complexo e o ideal é você entender os contextos que geraram os tipos, não o contrário. Mesmo que na tabela informe *quais funções geram os respectivos recursos*, você realmente vai ter como saber por que raios você precisaria chamar aquela função? Pois é.

Mas o ponto aqui é: **você nunca vai gerar um recurso**. Sempre terá uma função nativa para gerar pra você. No máximo, você irá utilizá-lo como fonte de dados (seja entrada ou saída).

> Como assim, entrada ou saída, Kiko?

Em algum artigo anterior, eu mencionei a possibilidade de manipularmos CSV. Quando digo manipular, digo que podemos tanto ler quanto escrever dados nele. Nesse caso, o tipo de recurso é o `stream` (para ambos os casos). Eu posso ler linha a linha, escrever uma planilha, etc.

```php
<?php

// stream de leitura (fopen configurado para leitura)
$stream = fopen("/diretorio/minha-planilha-s2.csv", "r"); // r de READABLE = somente leitura
$primeiraLinha = fgetcsv($stream);
fclose($stream); // remove referência da memória

// stream de escrita (fopen configurado para escrita)
$dados = [
    ["Linha 1, Coluna 1", "Linha 1, Coluna 2"],
    ["Linha 2, Coluna 1", "Linha 2, Coluna 2"],
    ["Linha 3, Coluna 1", "Linha 3, Coluna 2"],
];
$stream = fopen("/diretorio/minha-planilha-s2.csv", "w"); // w de WRITEABLE = somente escrita
fputcsv($stream, $dados);
fclose($stream);

// stream de leitura e escrita
$stream = fopen("/diretorio/minha-planilha-s2.csv", "w+");
// ....
```

**Obs.: para os recursos que precisam acessar dados em disco, é preciso revisar as permissões de acesso fornecidas ao webserver pelo sistema operacional.** No caso de rodar o PHP pela linha de comando, o seu usuário precisa ter acesso aos arquivos. Um `sudo` nesses casos resolve, porém não é recomendado.

## Garbage Collector

A grande questão sobre esse tipo de dado é que ele não é um dado real na memória do interpretador, apenas uma referência para a fonte de dados em si. Se essa referência for atribuída a uma variável, então essa conexão à fonte permanecerá ativa até que a variável seja eliminada. Esse processo é feito pelo **Garbage Collector**.

> E o que é isso, Kiko?

É um coletor de lixo, ué. /hehe
Várias linguagens desenvolvem esse carinha apenas para tirar da memória qualquer coisa que não vai ser mais útil. Dessa forma, podemos ocupar aquele espaço com algo mais útil.

> E tem isso em PHP?

Claro! Só que o Garbage Collector é tão automatizado que ninguém nem percebe, enquanto em outras linguagens você precisa limpar manualmente em todos os cenários.

Quando sua variável chega em um escopo que não é mais acionada, o interpretador vai lá e apaga a referência automaticamente, limpando a memória na mesma hora.

**PORÉM, ENTRETANTO, TODAVIA,** isso não é necessariamente válido para todos os recursos. Tem até um alerta lá na documentação: **o Garbage Collector não remove bancos de dados persistentes**. É a mesma coisa que atribuir um recurso a uma constante: a referência vai ficar fixa na memória até que você limpe manualmente!

> Como assim, Kiko?

Vamos às analogias. Imagine que você é o interpretador do PHP que usa várias canetas - referência de tinta, que é o dado que você "imprime" - para escrever alguma coisa - o resultado do script. Quando acaba de escrever, você pega todas as canetas que usou, coloca no canto da mesa e vai ao banheiro. Daí vem sua tia (Garbage Collector) e joga no lixo.

Nos casos de canetas que realmente tem sua utilidade exaurida rapidamente, isso faz sentido. Mas e as canetas Bic que duram meses? <strike>*(Alou, não tô sendo pago pra essa propaganda não hein)*</strike> Você provavelmente vai brigar com ela, rs. Então aparece a brilhante ideia de fixar as canetas na mesa com aquelas correntes de segurança que vemos em bancos e lotéricas. O único problema aqui é: essa caneta só vai pro lixo quando você desparafusar! Sua tia não vai mais mexer do nada, mas você também vai precisar fazer esse esforço de ir lá remover.

É mais ou menos isso.

## Mais um ponto de atenção

Quando falamos sobre configuração do PHP, tem uma aplicação bem interessante chamada **JIT**, que significa **J**ust **I**n **T**ime. Com isso, nós conseguimos "compilar" algumas coisas para deixar o interpretador ainda mais rápido, deixando boa parte da execução preparada na memória. Chamamos essa parte de **bootstrap**, que é tudo que há de comum entre todas as execuções do seu projeto, para não ter de ficar reprocessando a mesma introdução toda vez.

> O que isso tem a ver com recursos, Kiko?

Tudo. Se parte das execuções vão estar prealocadas na memória, é certo dizer que você vai precisar controlar o Garbage Collector se quiser manter uma boa performance. Usar estratégias como **Singletons** pode ser um bendito tiro no pé. Tudo isso precisa ser verificado para não acumular referências na memória de forma desnecessária.

Dito isso, não estou dizendo que é errado usar nada do que mencionei no parágrafo anterior. Apenas que é preciso estar atento pra não tomar uma rasteira do sistema operacional de repente, beleza?

E é isso! Esse tipo de dados primitivos realmente não tem nenhuma conversão (nem faz sentido isso né?) e acaba deixando o artigo bem curtinho. Pode comentar se ficou com alguma dúvida e vamos nessa para os próximos capítulos!

**Inté!**
