 Boa tarde a todos, sejam bem-vindos a mais uma sessão do World Camp Lisboa 2023, daqui a breves instantes vamos de novo fazer uma viagem até ao futuro próximo. Lucas de Giovanni é o CTO da Verzó, uma empresa portuguesa da agência de marketing, é também o fundador da Ankle Technology, no Brasil. Lucas tem 10 anos de experiência no desenvolvimento web e no PHP e também tem diversas contribuições para a comunidade open source. Esta vai ser uma apresentação em inglês, altura de fazer a mudança de linguagem. Hoje, o Lucas vai nos dar uma olhada e uma entrevista sobre o que está acontecendo para as grandes features do PHP 8. Então, bem-vindos, bem-vindos ao Lucas. Olá, pessoal. Muito bom estar aqui. Então, é isso. Eu acho que o Filipe falou com as fronteiras no sessão. Agora é minha turnê para falar com as regras no sessão. Vamos falar um pouco sobre o PHP e a jornada entre os 5,3 até 8,2 agora. O ponto do sessão é apresentar novos features do PHP 8 e, bem, como podemos usar os novos features. É muito comum que, como desenvolver um PHP, um desenvolver de regras, você apenas update o PHP no seu serviço, mas você não realiza o que é novo e como você pode melhorar o seu código e você ainda pode pensar no mesmo jeito que você fez antes, como quando você estava escrevendo code em 5 ou PHP 7, certo? Mas, sim, é eu. Eu sou o Lucas, sou o sessão do Vezoa Digital Market Agents aqui em Portugal, e também o PHP Portugal Co-Organizador com meu amigo Caneko aqui. Nós estamos fazendo algumas metabas em Portugal, é muito legal. Você pode me enganar no Twitter, mas como é que vai funcionar hoje? Eu vou te mostrar um pedaço de code, geralmente em uma versão muito velha do PHP e vamos falar sobre os problemas do code e como você pode melhorar e como você pode aplicar esses novos features do PHP 8 no code, certo? Para melhorar. Mas antes disso, apenas uma breve overview das versões do PHP que está fora lá fora, nós estamos agora oficialmente no PHP 8.2 que significa que a família inteira do PHP 7 não é longa suportada pela comunidade, então, mesmo para suportação activa ou para suportação segura, não é suportada ainda mais. E o PHP 8 também está perdendo sua suportação como suportação segura. Então, em novembro ou setembro, eu não estou bastante seguro. Nós vamos suportar também para o PHP 8.0, o que significa que o PHP 8.1 e 8.2 são o melhor opção para seus novos projetos e se você não update seus projetos ou seu serviço ainda, é melhor fazer isso porque, mesmo para a segurança, é o melhor way to go, certo? Então, vamos entrar em algum code e ver como podemos melhorar o code, certo? Então, imagina essa classe que temos aqui. É uma classe muito simples. É um, bem, um pet. Nós temos um pet classe e, bem, tudo o que a minha classe aqui tem é que a minha pet tem um nome, certo? Então, eu tenho um nome de propriedade, que é um string, e eu tenho duas metodas para seteir o nome da minha pet e para pegar o nome da minha pet. Isso é muito simples porque é um nome, é só um string, certo? Então, bem, nós podemos ver que eu estou type aqui um string direto nas minhas propriedades e nas metodas também, nas metodas das minhas metodas. Então, claro que se eu iniciai essa classe e setei o nome para bingo, por exemplo, eu vou pegar um string de volta, certo? Isso é muito direto, isso é legal, tudo bem, todo mundo faz isso. Mas antes de PHP 8.0, o que é esse tipo de situação? O que eu tenho, por exemplo, uma classe de jogo, onde eu tenho um score, que poderia ser uma intrusão ou uma float. Antes de PHP 8, não foi possível ir com essas situações, certo? Bem, eu vou precisar colocar um type aqui, eu posso usar um type porque pode ser intrusão ou pode ser float. E mesmo nas minhas metodas, eu poderia receber qualquer coisa. O que a gente normalmente faz com essa situação é ter a notação, certo? A notação lá, para ajudar com a id, por exemplo, para nos ajudar para setar como intrusão ou float. O problema com isso é que é só a notação lá, se eu iniciar essa classe e setar esse score como um string, isso vai funcionar. E eu tento voltar esse score como um string, isso vai funcionar, porque esse aqui é só uma notação, certo? Antes de PHP 8.0, não é possível ter essa inside. Nós podemos tentar fixar esse code para colocar algo assim. Nós podemos ter um if dentro da minha set method, tipo a, para ver se é realmente um intrusão ou uma float. E se não, eu posso justiá-lo com uma exceção, para dizer, eu só preciso aqui intrusão e float para isso. Mas é muito trabalho, certo? Eu preciso fazer isso como cada classe ou cada método para ver, etc. Então, antes de PHP 8.0, não é possível fazer isso diferente. E PHP 8.0 nos presenta com types unos, que é exatamente tendo a possibilidade de definir diferentes ou múltiplos tipos para as minhas propriedades ou para as minhas metodas. Então, aqui no exemplo, o mesmo que fizemos antes de validar os tipos das minhas metodas, eu poderia usar o pibe aqui e ter agora uma validação dentro da runtime de PHP, que significa que agora, se eu tentar setar um string, a PHP itself pode validar para mim e dizer que, ei, você só precisa, você só pode usar o intrusão ou float na situação. Bem, isso é muito bom. É muito bom ter a segura no seu code. E você não está limitado a apenas dois tipos. Você pode usar mais de um tipo, mais de dois tipos. Você pode fazer algo assim. Eu prometi que o número vai dar pra você, se você fizer isso, eu quero aceitar tudo. Imagine que eu tenho a coleção de livros e um item pode ser qualquer coisa. Você pode fazer isso. Mas a PHP também fez você esse mix, que é basicamente tudo. Então, se você quiser, você pode usar algo assim. Então, esses são os tipos de união na PHP. E isso é muito bom para a segurança da sua coleção com tipos. Bem, vamos para o próximo exemplo. Um outro pedaço de code que podemos tentar melhorar com a PHP. Imagine a situação em que eu tenho um suíte, é muito comum, nós escrevemos suíte todo o tempo, mas o que é o problema aqui com o default do suíte na PHP? Imagine que eu tenho um valor aqui, que é um suíte 2. E eu tenho três casos, 0, 1 e 2. O que acontece se eu tentar esconder o suíte variable? Vai funcionar, vai setar o suíte variable para a Boa, porque o suíte na PHP não é um comparação de suíte. Se eu tenho um suíte aqui e eu tenho um suíte aqui, vai funcionar. Vai setar o suíte variable como a Boa. Então, isso pode ser um problema, porque não é um comparação de suíte, pode lê-lo para algum erro de algum tempo. E outra situação é que se você não tem um caso, se eu mudar aqui para o número 3, por exemplo, e você não tem algum caso que matche o suíte, a PHP vai apenas te warnar que esse suíte variable não foi setado, porque eu estou setando o suíte variable dentro do caso. Você pode ver aqui? Eu estou setando o suíte variable dentro do caso. Então, se eu tentar esconder o suíte variable aqui, a PHP vai só me warnar, não vai me trocar em algum tipo de erro. Então, se eu tentar usar o suíte variable ao longo do meu código e em outra parte do meu código, pode lê-lo em algum erro, porque você não tem o suíte variable definido. Bem, podemos tentar fixar isso de novo. Nós podemos ter um default no nosso suíte que realmente vai dar uma exceção e dizer que, ei, não há um caso para um valor, então vá lá e, bem, usarei um caso correto para isso. Mas nós ainda não estamos validando o nosso, bem, o suíte. E, se eu tentar esconder isso agora, porque do meu default, vai me dar uma exceção. PHP 8 nos deu a expressão de match, que é provavelmente uma das minhas favoritas, o que é um novo jeito de fazer um tipo de suíte caso, um suíte fã de suíte caso, onde você pode, bem, ter um lote de opções e um lote de suíte na sua coda. Para começar, o match é uma expressão, que significa que eu posso, basicamente, esconder diretamente ou eu posso voltar diretamente ou eu posso even attachar a um variable, vamos ver isso mais rápido. É um comparação do suíte, então, se eu tenho aqui um valor que é um dois, precisa ser um interesse, que significa que precisa matchar um dos casos na minha esquerda da minha matcha, a esquerda da matcha é as suas condições e a direita é a retorno relacionada a essa condição. Então, isso é um comparação do suíte, então, que significa que você precisa ser o mesmo tipo. Então, aqui em esta situação é o mesmo que fizemos antes com o suíte, o todo o suíte da coda pode ser replacido, este inteiro assim. Eu vou, bem, se eu tentar esconder isso, vou esconder, sim, o suíte. Você vê que está matchando e estricando, matchando lá embaixo. Se eu tentar suíte, se eu tentar validar um diferente, um diferente valor, não existe a minha matcha, você vê que o PHP próprio já tem cuidado com isso e já trouxe um erro dizendo que não é um valor, um valor definido, não é um valor definido na sua matcha, certo? Então, a toda a coda que tínhamos com o suíte pode ser replacida inteiro com esta matcha. Como eu disse, é uma expressão muito poderosa e um feature de PHP. É uma expressão, você pode attachedar a variable. Então, se você quiser definir uma variable, você pode, direitamente, setar um match aqui e a retorno de essa validação vai ser attachada a essa variable. Então, é muito, é muito clínico, é muito legal de ter. Como eu disse, você pode retornar direitamente, imagina que você tem uma função e você quer fazer uma validação, você não tem que attachar variables, etc. Você pode retornar direitamente da sua coda aqui. Se matches a expressão e você tem uma condição na esquerda e a retorno na direita, você pode também fazer qualquer tipo de condições na parte esquerda e qualquer tipo de retornos na direita. O que significa isso é que, imagina que eu tenho essa função, bar, por exemplo, que aceita uma coda de interesse e você quer verificar se a pessoa é under 18 ou over 18. Eu posso retornar direitamente uma expressão matcha e ver que eu tenho a condição já aqui na esquerda. Eu não preciso fazer qualquer coisa ou qualquer coisa assim. Eu posso fazer a condição direitamente aqui na esquerda aqui. Então, o PHP vai tentar matches todas as condições. A primeira que aceita isso vai ser retornada na função. Eu posso fazer o mesmo aqui, por exemplo, com isso eu posso validar e eu posso ter um valor default. É igual a que temos com o Sweet Case. Eu posso ter valores defaults no nosso match também. Então aqui, por exemplo, eu tenho um valor default que qualquer coisa que tem que matches vai ser muito, muito poderosa. Eu posso chamar funções no meu match também. Então, imagina que eu tenho uma função que eu preciso validar se retornar por dentro. Isso vai retornar por dentro da minha função aqui. Eu posso chamar métodos dentro da mesma classe. Eu posso, mesmo que duas validações na mesma linha. Então, isso significa que eu posso ter esse x sendo evaluado como 1 ou 5 quando eu usei uma comma aqui. E também na minha direita parte do match eu posso chamar funções também. Então, em este código, e este pedaço de code especificamente, eu tenho 5 validados aqui e vai retornar, vai ter atenção a esse variable, o retorno desta função. É muito poderoso fechar esse PHP para nós e, bem, nós podemos ter isso para melhorar o nosso código, para melhorar a habilidade de nosso código, certo? E falando da habilidade, a próxima coisa que eu quero mostrar para vocês é que o PHP 8 nos trouxe. É uma coisa muito interessante. Imagina esta array. Eu tenho uma array que tem uma integer e eu tenho algumas cidades no app, certo? E eu quero fazer um filtro. Eu quero filtrar meu array para só ter integers. Então, eu vou usar o array filter. Eu passei. A primeira parte do método aqui é os itens. E depois eu passei um callback, uma função que vai ver se é integer ou não. Bem, o array filter é uma das funções de PHP que nós usamos todo o tempo, certo? Então, nós sabemos como usar. Eu não preciso ir para o Google ou qualquer coisa para ver como usar o array filter. Eu sei que a primeira é a array e a segunda variable, a segunda método aqui é a segunda parâmetro aqui é o callback, certo? Eu não preciso ver isso. É bem. Mas, o que é isso? O array filter, certo? Não é uma função que nós usamos todo o tempo. E nós não sabemos, só olhando, você não sabe o que está fazendo. Eu sei que vai criar um array que começa com um clima e tem uma length, mas só olhando, eu posso ver o que está fazendo, certo? Eu preciso talvez ir para o Google ou talvez ter a ajuda de minha ID para ver o que está fazendo. E o que o actual está fazendo é que nós temos que criar um array com a length 3 que começa com o clima 2. E todos os valores são fritos, por exemplo. Mas só olhando, se eu não usar essa função todo o tempo, eu não sei como o que está fazendo, certo? E é onde o PHP nos deu um nome e argumentos, que é uma maneira muito bonita para... Bem, para usar a coda, e para ter uma forma mais redabilitada do seu codo, certo? Então, a mesma coisa como aqui, nós podemos usar o nome e o argumentos. Os argumentos agora têm naves, então você pode usar. Então, agora, você pode ver que é diferente? Eu posso só olhar esse array e agora eu posso realmente ver o que está fazendo, certo? Eu posso ver que eu estou criando um array que começa com um clima 2, que é um clima 3 e todos os valores vão ser fritos. Lucas, desculpe, você pode mudar um pouco o microfone de seu microfone para ir mais perto da boca, porque... É melhor? Muito melhor. Obrigado. Tudo bem. Então, você pode ver que agora você pode realmente ver, só pelo olhar esse codo, você pode ver o que está fazendo, certo? E especialmente porque a parte mais importante do codo de coda não é o codo de coda para a máquina, é o codo de coda para outros desenvolvedores, certo? Provavelmente alguém vai ler o codo de coda depois, então você precisa ser... Você precisa ser muito fácil de ler. Claro que você não... Você pode usar isso em seus próprios métodos, em seus próprios clases, então imagine que você tem um clima de emprego, você tem uma construção que tem, tipo, um nome, um sexo. Então, eu posso começar o meu clima, eu posso iniciar o meu clima como esse, nome, sexo, etc. Esse é um exemplo muito fácil, provavelmente você não vai querer usar argumentos de nome todo o tempo, isso é muito direto, nome e sexo, então talvez você não precisa usar isso, mas uma situação como essa, onde você tem, por exemplo, uma classe de usuário, e você tem... recebemos três argumentos aqui, que o primeiro é um value de Boolean, o segundo é um value de Boolean, se é activo ou não, e você tenta iniciar esse clima como esse, poderia ser um pouco, bem, difícil de ler, certo? Faltos, mas o que significa faltos? Se você usar o nome, argumentos, você pode ter algo como esse para iniciar o seu clima, então você pode começar a dizer, tipo, sim, isso é um ademínio, isso é activo, e isso é a regra, certo? É muito, muito direto quando você começar a ler. Você pode usar o nome, argumentos, em qualquer ordem random, então eu tenho, eu posso, bem, eu posso, se eu tenho valores de default, eu posso, bem, eu posso usar eles em ordem random, então, o que significa que eu posso, eu não preciso seguir as ordens, se eu estou usando argumentos de nome, eu tenho a, b e c, eu posso começar com b, e depois com c, e depois a, então eu posso usar isso em ordens random, também pode ser opcional, o que significa que se eu tenho valores de default para todos os meus argumentos, por exemplo, eu posso esquiar um, eu posso, eu estou esquiando a, por exemplo, antes de isso eu preciso passar o primeiro argumento, e depois o segundo que eu quero mudar, mas agora eu posso usar os segundo argumentos, por exemplo, é muito direto, eu posso esquiar eles, então se eu tenho aqui, por exemplo, três argumentos, produção, língua e inversão, eu, bem, você vê que eu estou esquiando um de outros, mas se eu estou tentando, se eu começar fazendo o, o argumentos de nome, eu não posso usar no meio, se eu começar usando argumentos de nome, eu preciso continuar com os argumentos de nome, eu posso esquiar no início, mas eu não posso esquiar depois de começar usando, porque, bem, PHP não vai saber qual é a forma de ir, certo? Isso foi o nome dos argumentos, eu estou esquiando um pouco por causa do tempo, o último que eu quero mostrar para vocês é, imagina essa classe, é uma classe de status, nós temos uma classe de status na sua coda, e você tem um array aqui que diz, é um array de protetor que combina os status na sua database, eu tenho a minha database aqui, o valor zero, um, dois, que é correlado para draft, publish e archived, e eu tenho uma função que me retorna a status correta, se eu passar para essa função aqui, uma integer, vai me retornear a string, se eles fazem o opposito, vai me me dar a integer relacionada, certo? Veja aqui, eu tenho muitas validações dentro, eu tenho, se é integer, eu tenho aqui, veja se é algo valido, se não, eu vou botar uma exceção e coisas assim, bem, é muito, e depois eu preciso usar como isso, pôr, passar em draft, é muito, tem um lote de codes para tentar ter isso que está funcionando, certo? Então, o que PHP nos é enum, é uma nova forma de criar, criar classes, criar enum, que fazem todos esses tipos de validações para você, então você simplesmente precisa definir, por exemplo, um status enum, você tem seus casos, draft, publish, archived, que correlado para algum valor interno, pode ser na sua database, e depois você pode, direto, começar a usar, você pode pegar as variables, tipo status, e depois você tem publish, e você tenta pegar o valor, eu vou retornear para você, se você tem o opposito e você tem seu integer, e você tenta pegar o nome do valor de enum, você tem ele aqui, e depois você pode usar ele como um tipo, também, e se você tem um post class, e você quer receber os status de seu post, você pode usar isso como um tipo, que significa que agora, para criar um novo post, você precisa realmente passar um instante de este enum aqui, certo? Desde que é um class base, você pode adicionar funções para isso, então, por exemplo, eu tenho uma função color, um método color aqui, para combinar uma das minhas, minhas, minhas status, eu defini esta função aqui, retornei o, o color, e eu posso usar isso assim, se eu iniciar um enum status archive, eu posso chamar o método color, por exemplo, e ter o correto color relacionado com isso. Bem, você vê que isso é um monte de coisas, novas coisas no PHP, isso é apenas uma parte mais pequena, eu espero que isso lhe dê alguns inscritos e começar você a olhar mais para o PHP, e é isso. Lucas Giovanni. Então, temos tempo para uma pergunta, duas, talvez se... perguntas. Lucas, isso é para você, primeiro. Obrigado por estar no WordCamp Lisbon. Algumas perguntas? Em um, em dois, em três, em um, em dois, três. Sem perguntas. Realmente? Ok. Lucas, obrigado. Bem, se você é chai, por favor.