<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Raphael da Silva</title>
    <description>The latest articles on DEV Community by Raphael da Silva (@raphaeldasilva).</description>
    <link>https://dev.to/raphaeldasilva</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F429382%2Ff83b7d78-2d8c-4729-b55b-0b02073df32e.png</url>
      <title>DEV Community: Raphael da Silva</title>
      <link>https://dev.to/raphaeldasilva</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raphaeldasilva"/>
    <language>en</language>
    <item>
      <title>Injeção de dependência, interfaces e Laravel</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Tue, 05 Sep 2023 17:14:43 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/injecao-de-dependencia-interfaces-e-laravel-3g4l</link>
      <guid>https://dev.to/raphaeldasilva/injecao-de-dependencia-interfaces-e-laravel-3g4l</guid>
      <description>&lt;p&gt;Em 2020 eu fiz um repositorio com o Laravel, o objetivo era testar o framework, busquei usar inferfaces para desacoplar o código. Nisso injetei nos controllers a dependencia para uma interface, que é programar voltado para abstrações, pois isso desacopla o código, o que significa poder trocar de implementações.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;stdClass&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;UserFinder&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Http\Controllers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Contracts\Support\Renderable&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\UserFinder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UserDetailsController&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Controller&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$userFinder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;UserFinder&lt;/span&gt; &lt;span class="nv"&gt;$userFinder&lt;/span&gt;
    &lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;userFinder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$userFinder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Renderable&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;view&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user-details'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'user'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;userFinder&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ou seja, a interface &lt;code&gt;UserFinder&lt;/code&gt; permite criar qualquer classe para buscar um usuário. A implementação padrão foi usando os componentes (as classes) de acesso a banco de dados o Laravel, pois essa implementação em questão busca usuários no banco de dados. Mas poderia ser em qualquer outra fonte de dados (um arquivo XML, um arquivo JSON).&lt;/p&gt;

&lt;p&gt;E o acesso ao banco de dados do Laravel é um monte de método estático (agrupado num namespace chamado DB, que significa DataBase) do qual nao gosto muito, mas a beleza da coisa é que isso nao importa porque todo esse código está abstraido com a interface, apenas a implementação (&lt;code&gt;LaravelDBUserFinder&lt;/code&gt;) usa esses métodos estáticos que são pertinentes a como o Laravel faz as coisas no seu ecossistema.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\UserFinder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Illuminate\Support\Facades\DB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="n"&gt;stdClass&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\ModelNotFoundException&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LaravelDBUserFinder&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;UserFinder&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;User&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;DB&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;is_null&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ModelNotFoundException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'User not found.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Eu nao sou fluente em Laravel, nem domino esse framework, o máximo que fiz com ele foi testes para vagas de emprego (porque ele é muito usado pelo mercado, virou uma espécie de convenção), mas tento observar a arquitetura das coisas e busco desacoplar o código no paradigma da orientacao a objetos. Então gosto de ver as interfaces aplicadas e como isso traz legibilidade e desacoplamento para o código.&lt;/p&gt;

&lt;p&gt;Link para o repositório: &lt;a href="https://github.com/raphael-da-silva/testando-o-laravel"&gt;https://github.com/raphael-da-silva/testando-o-laravel&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Originalmente publicado em: &lt;a href="https://raphael-da-silva.github.io/injecao-de-dependencia-laravel/"&gt;https://raphael-da-silva.github.io/injecao-de-dependencia-laravel/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>laravel</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Aprendendo a arquitetura das coisas com o produtor musical 9th Wonder</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Mon, 03 Apr 2023 12:50:41 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/aprendendo-a-arquitetura-das-coisas-com-o-produtor-musical-9th-wonder-29bp</link>
      <guid>https://dev.to/raphaeldasilva/aprendendo-a-arquitetura-das-coisas-com-o-produtor-musical-9th-wonder-29bp</guid>
      <description>&lt;p&gt;Na internet tem obras de desenvolvedores da comunidade que escreveram artigos e fizeram hangouts com o objetivo de propagar conhecimento, ter acesso a isso me possibilitou estudar os assuntos de programação de uma forma um pouco mais aprofundada.&lt;/p&gt;

&lt;p&gt;Todo esse conhecimento compartilhado por terceiros (como o código da pasta vendor que é baixada pelo Composer) me permitiu construir uma base de conhecimento para trabalhar com objetos e ter interesse suficiente para querer escrever sobre o tema.&lt;/p&gt;

&lt;p&gt;Na atividade musical existe a prática de samplear (principalmente no Rap), essa prática consiste em extrair partes/pedaços de músicas antigas já existentes para compor um instrumental de uma música nova.&lt;/p&gt;

&lt;p&gt;Todo o conhecimento sobre o paradigma que consumi foram as coisas “sampleadas” por mim, é como se eu estivesse sampleando o conhecimento difundido na área para compor uma nova obra, que aqui não é uma nova batida, mas sim este blog e posts como esse.&lt;/p&gt;

&lt;p&gt;O produtor de Rap 9th Wonder foi a minha inspiração para começar a tentar fazer batidas, ele tem uma visão sobre a pratica de samplear que é muito rica e traz uma sabedoria. Em um tweet ele fala o seguinte:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In short…our whole culture is a sample, our government, our buildings, holidays, our way of life….we spend our day saying slang and using terms that were NOT create by any of us, but saying it like it’s ours….&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Traduzindo fica o seguinte:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Em suma … toda a nossa cultura é um sample, nosso governo, nossos edifícios, feriados, nosso modo de vida… passamos o dia dizendo gírias e usando termos que NÃO foram criados por nenhum de nós, mas que dizemos como se fosse nosso….&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Toda essa ideia de que tudo se constrói com base em alguma coisa usando a arte de samplear foi algo que fez sentido para mim, pois se conectou com o meu entusiasmo com a construção de batidas de rap, construção essa que envolve a programação de timbres dentro de um padrão, são sons programados para operar e se repetir dentro de um BPM, é um outro tipo de programação que eu fazia antes de entrar na programação de objetos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--t2WIfeQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6y6g982tv5ozasgigfc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--t2WIfeQy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b6y6g982tv5ozasgigfc.jpg" alt="9th Wonder" width="500" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O produtor 9th Wonder&lt;/p&gt;




&lt;p&gt;&lt;a href="https://raphael-da-silva.github.io/arquitetura-9thwonder/"&gt;Este post foi originalmente publicado no meu blog:&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A tal da alta coesão e baixo acoplamento</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Wed, 09 Jun 2021 19:24:16 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/a-tal-da-alta-coesao-e-baixo-acoplamento-1d8g</link>
      <guid>https://dev.to/raphaeldasilva/a-tal-da-alta-coesao-e-baixo-acoplamento-1d8g</guid>
      <description>&lt;p&gt;Quando tive os primeiros contatos com a Orientação a Objetos, eu ouvia a frase "Alta coesão e baixo acoplamento" diversas vezes. O problema é que aquilo ficava vago, pois não era mostrado como obter essas vantagens. &lt;/p&gt;

&lt;p&gt;O acoplamento é o grau de ligação entre classes, se o acoplamento for alto as classes são engessadas, logo estão limitadas. Para ter baixo acoplamento entra em jogo as abstrações possibilitando trocar as implementações entre objetos.&lt;/p&gt;

&lt;p&gt;O conceito de coesão é utilizado para definir o quanto as operações presentes em um objeto estão relacionadas umas com as outras. Basicamente, um objeto é coeso quando faz exatamente o que se propõe, sem ir além disso. Ou seja, é quando ele que possui operações que estão focadas em compor uma determinada responsabilidade, sem misturar conceitos que não estão relacionados entre si.&lt;/p&gt;

&lt;p&gt;Por exemplo, &lt;a href="https://raphael-da-silva.github.io/responsabidade-coesa/"&gt;um objeto feito para salvar um cadastro no banco de dados e também gerar mensagens de log não é coeso, pois a responsabilidade de gerar uma mensagem de log não deveria estar nele.&lt;/a&gt; Para que esse objeto fosse coeso, ele deveria ter somente métodos relacionados ao cadastro no banco de dados e os detalhes necessários para realizar esse tipo de operação. Já o log deveria ter uma classe própria para ele.&lt;/p&gt;

&lt;p&gt;Na minha visão, a frase "alta coesão e baixo acoplamento" usa palavras rebuscadas e complexas que não ajudam muito os iniciantes. Talvez se a frase "Alta coesão e baixo acoplamento" fosse traduzida por "Objetos flexíveis e com responsabilidades limitadas" as coisas seriam mais intuitivas logo de início. &lt;/p&gt;

&lt;p&gt;Ou melhor, se a frase fosse traduzida por "use abstrações como parâmetros e mantenha só uma responsabilidade" tudo ficaria ainda mais evidente. &lt;/p&gt;

&lt;h3&gt;
  
  
  O papel da linguagem (não a de programação)
&lt;/h3&gt;

&lt;p&gt;O propósito desse artigo foi fazer essa simplificação didática que evita o uso desses termos complexos e pouco intuitivos para quem inicia a aventura de entender melhor a Orientação a Objetos. &lt;/p&gt;

&lt;p&gt;A linguagem rebuscada e complexa dos termos do paradigma foi uma barreira que encontrei no começo, ou seja, a barreira não foi a linguagem da programação, mas sim a linguagem usada entre programadores no seu vocabulário.&lt;/p&gt;

</description>
      <category>oop</category>
      <category>ptbr</category>
    </item>
    <item>
      <title>POO - Revisando o princípio da inversão de dependência (DIP)</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sat, 10 Oct 2020 13:01:07 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/poo-revisando-o-principio-da-inversao-de-dependencia-dip-19cj</link>
      <guid>https://dev.to/raphaeldasilva/poo-revisando-o-principio-da-inversao-de-dependencia-dip-19cj</guid>
      <description>&lt;p&gt;Eu sempre entendi o princípio da inversão de dependência (DIP) como dependender de abstrações (interfaces e classes abstratas), essa visão veio do contato que tive com esse princípio no meio do aprendizado da injeção de dependência, que é incentivada com abstrações para seguir o principio DIP. Só que essa visão era limitada e focada em um só lado do conceito.&lt;/p&gt;

&lt;p&gt;Além depender de abstrações (usando a injeção de dependência), existe um outro lado na inversão de dependência que é mais conceitual e consiste em módulos de alto nível (mais próximos no usuário) que dependem de módulos de baixo nível (mais próximos do computador/máquina). Módulos, nesse contexto, se referem ao código (classes, interfaces e etc).&lt;/p&gt;

&lt;p&gt;O lado que eu abordava não estava errado, porém o meu foco restrito fez eu não ver o outro lado desse princípio, ou seja, a visão que eu tinha era incompleta. Antes eu não tinha me atentado e percebido essa relação entre código de alto nível e o código de baixo nível, &lt;strong&gt;essa é mais uma das revisões em orientação a objetos que me mostram que quando mais estudo, mais vejo que não sei nada.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usar camadas como Domain e Infrastructure me fizeram perceber mais ainda como é a aplicação completa do princípio DIP, pois a primeira camada é alto nível e não depende da segunda, já a segunda é baixo nível e depende da primeira. Ou seja, módulos de alto nível não dependem de módulos de baixo nível, mas sim o contrário. É justamente isso que a definição clássica do princípio DIP diz.&lt;/p&gt;

</description>
      <category>oop</category>
      <category>braziliandevs</category>
      <category>solid</category>
    </item>
    <item>
      <title>Splinter Cell + Objetos</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Wed, 15 Jul 2020 16:14:04 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/splinter-cell-oop-36jk</link>
      <guid>https://dev.to/raphaeldasilva/splinter-cell-oop-36jk</guid>
      <description>&lt;p&gt;Anos atrás eu criei algumas classes para representar o jogo Splinter Cell através de objetos e com um uso de interfaces para mostrar tipos sendo compartilhados. Basicamente, é a representação de elementos (personagens e equipamentos) do jogo Splinter Cell da ubisoft através do paradigma da orientação a objetos.&lt;/p&gt;

&lt;p&gt;Por exemplo, Sam Fisher (o protagonista do jogo) é composto por nightvision googles (óculos e visão noturna) com injeção de dependência e implementa a interface que define um agente especial.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;SplinterCellOOP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\ThirdEchelonAgent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\FourthEchelonAgent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\Goggles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SamFisher&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FourthEchelonAgent&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$goggles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;Goggles&lt;/span&gt; &lt;span class="nv"&gt;$goggles&lt;/span&gt;
    &lt;span class="p"&gt;){&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;goggles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$goggles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;actStealth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;goggles&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao implementar a inteface &lt;code&gt;FourthEchelonAgent&lt;/code&gt;, o personagem também implementa a interface &lt;code&gt;ThirdEchelonAgent&lt;/code&gt;, pois a primeira é uma extensão da segunda, já que na história do jogo, a FourthEchelon é a sucessora da ThirdEchelon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;SplinterCellOOP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\ThirdEchelonAgent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;FourthEchelonAgent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;ThirdEchelonAgent&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além de Sam Fisher, outros agentes podem implementar a mesma interface, pois fazem parte da mesma organização (sendo do mesmo tipo).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;SplinterCellOOP&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\FourthEchelonAgent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\Weapon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;SplinterCellOOP\Goggles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;IssacBriggs&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;FourthEchelonAgent&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$weapon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$goggles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;Weapon&lt;/span&gt; &lt;span class="nv"&gt;$weapon&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;Goggles&lt;/span&gt; &lt;span class="nv"&gt;$goggles&lt;/span&gt;
    &lt;span class="p"&gt;){&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weapon&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$weapon&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;goggles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$goggles&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;actStealth&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;goggles&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;weapon&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É isso! Segue o link para todo o código no &lt;a href="https://github.com/raphael-da-silva/splinter-cell-com-objetos"&gt;repositório&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>braziliandevs</category>
      <category>oop</category>
      <category>games</category>
    </item>
    <item>
      <title>Algumas das fases que passei no aprendizado de programação orientada a objetos</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Wed, 15 Jul 2020 14:45:22 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/as-minha-fases-do-aprendizado-de-poo-4e0</link>
      <guid>https://dev.to/raphaeldasilva/as-minha-fases-do-aprendizado-de-poo-4e0</guid>
      <description>&lt;p&gt;Eu passei por algumas fases diferentes no aprendizado para tentar ter um código mais orientado a objetos (desde 2014). Entre essas fases então:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Quase desistir de um curso técnico em 2011 quando tive o primeiro contato com a orientação a objetos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Aprender a fazer algumas classes ruins (usando varíaveis globais para passar a pdo para a classe) e (achar esse código ruim) o máximo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Insistir em estudar e começar a ter mais conforto com objetos por volta da metade de 2013.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ter um código com muita herança, onde tudo estava estendendo de um model mais genérico que era gigante.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Entender injeção de dependência se empolgar e querer parametrizar tudo (até o que nem precisaria variar).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Criar um framework próprio (aka framework caseiro) em 2014 e se empolgar (atualizando o código com o que eu ia aprendendo).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ler muitos artigos que questionam getters, setters, entidades e outras práticas e achar que tinha descoberto o jeito "certo" e passar a achar que determinadas práticas são sempre ruins sem analisar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ler muitos artigos e achar que código estáticos são sempre ruins, o que é uma generalização sem análise da situação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eu gosto muito do conceito de interfaces, logo acabei criando interfaces para todas as classes, até as que não precisariam de uma interface por não exigirem novas implementações diferentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ter interfaces e classes com o mesmo nome separadas por um prefixo I e não enxergar que isso era um sinal de erro de abstração.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Começar a rever as minhas posturas sobre as opniões que eu tinha formado e ir ficando menos intrasigente (mais flexível). Com isso, comecei a reavaliar as práticas que eu aplicava cegamente. Disso surgiram as etapas a seguir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ver que código estático nem sempre é um problema e pode ser aplicado para coisas simples como factorys e operações simples que agem com funções e não precisam ser trocados (através de injeção de dependência).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ver que nem toda classe precisa de interface para variar a sua implementação.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Usar array para tudo e achar entidades desnecessárias pela complexidade adicionada (sem enxergar o contexto/informação sobre o domínio/regras de negócio que elas dão).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  As mudanças de 2020
&lt;/h3&gt;

&lt;p&gt;Antes &lt;a href="https://dev.to/raphaeldasilva/poo-revisando-o-principio-da-inversao-de-dependencia-dip-19cj"&gt;eu acha que para seguir DIP era só depender de abstrações com uma interface e classe abstrata&lt;/a&gt;, sem entender a relação entre o que está baixo nível (infraestrutura) e o que está alto nível (domínio).&lt;/p&gt;

&lt;p&gt;Depois disso passei a buscar expressar o domínio de forma mais intuitiva e nítida, por isso estou tentando usar alguns conceitos mais simples de DDD (entidades, value objects). &lt;/p&gt;

&lt;p&gt;Junto com os conceitos de DDD também estou tentando aplicar a separação do código de infraestrutura e domínio, pois só depois dessa separação eu comecei a entender o que realmente significa o princípio da inversão de dependência do SOLID. &lt;/p&gt;

</description>
      <category>oop</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>POO - Relacionamentos e interfaces (de objetos)</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sun, 12 Jul 2020 14:46:11 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/relacionamentos-amorosos-e-interfaces-de-objetos-5g3o</link>
      <guid>https://dev.to/raphaeldasilva/relacionamentos-amorosos-e-interfaces-de-objetos-5g3o</guid>
      <description>&lt;p&gt;Imagine que alguém quer ter um amigo e deseja que esse amigo seja verdadeiro. Para isso, um amigo deve se comportar de certa maneira, pois para ser um amigo ele deve fazer o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Confiar&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ou seja, para ser o amigo esperado, ele deve implementar a seguinte interface e fazer as seguintes ações (operações):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Amigo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;confiar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora uma pessoa mais introvertida pode implementar essa interface fazendo as ações (a.k.a operações) do seu jeito (de acordo com a sua implementação):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaIntrovertida&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Amigo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;confiar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Estabelece um vínculo de confiança silenciosa.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além da pessoa mais introvertida, uma pessoa extrovertida também pode implementar a interface e, com isso, ser um amigo também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaExtrovertida&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Amigo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;confiar&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Estabelece um vínculo de confiança bem explícido.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para a pessoa que quer o amigo que atenda a interface &lt;code&gt;Amigo&lt;/code&gt; &lt;strong&gt;é esperado&lt;/strong&gt; alguém que &lt;strong&gt;se comporte dessa forma como a interface representa através de suas operações&lt;/strong&gt;. Segue a classe que representa a(o) quem vai ter o amigo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PessoaQueQuerUmAmigo&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;Amigo&lt;/span&gt; &lt;span class="nv"&gt;$amigo&lt;/span&gt;
    &lt;span class="p"&gt;){}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;estabelezerAmize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;amigo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;confiar&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ter um amigo é algo que expressa uma relação de composição (e injeção de dependência), pois a classe &lt;code&gt;PessoaQueQuerUmAmigo&lt;/code&gt; tem um objeto do tipo da interface &lt;code&gt;Amigo&lt;/code&gt; passada como parâmetro no seu construtor.&lt;/p&gt;

&lt;p&gt;No uso de interfaces na comunicação entre objetos &lt;strong&gt;tudo gira em torno de ação, confiança e expectiva, assim como acontece nas relação humanas&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>braziliandevs</category>
      <category>oop</category>
      <category>interface</category>
      <category>programming</category>
    </item>
    <item>
      <title>O projeto Programador Cansado</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sat, 11 Jul 2020 22:21:01 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/o-projeto-programador-cansado-43j9</link>
      <guid>https://dev.to/raphaeldasilva/o-projeto-programador-cansado-43j9</guid>
      <description>&lt;p&gt;Eu acabei tendo a ideia de criar uma organização no Github para agrupar informações sobre saúde mental. O nome do projeto é &lt;a href="https://programador-cansado.github.io/"&gt;Programador Cansado&lt;/a&gt;, o objetivo é dedicar uma atenção para a mente e a sua saúde no contexto da programação.&lt;/p&gt;

&lt;p&gt;Eu tive algumas experiências pessoais que me atrapalharam na construção de uma carreira estável, esse projeto é uma tentativa de tentar criar algo construtivo a partir do meu fracasso pessoal ligado a sáude mental e esgotamento trabalhando com programação (por falta de autopreservação).&lt;/p&gt;

&lt;p&gt;A ideia base do projeto é a seguinte: &lt;strong&gt;antes de cuidar do código-fonte, é importante cuidar da mente, caso contrário, ela vai bugar mais que o código-fonte.&lt;/strong&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  O Objetivo de forma sintetizada
&lt;/h3&gt;

&lt;p&gt;O objetivo do projeto pode ser descrito com as seguintes palavras: &lt;strong&gt;cuidando da saúde mental (para a mente não bugar).&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>mentalhealth</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>My favorite Rap producers with code</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sat, 11 Jul 2020 16:53:32 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/my-top-rap-producers-with-code-5080</link>
      <guid>https://dev.to/raphaeldasilva/my-top-rap-producers-with-code-5080</guid>
      <description>&lt;p&gt;I like Rap, I tried be a beatmaker at 16, in 2012 I started programming. In this article I mix Rap with programming. Let's start.&lt;/p&gt;

&lt;p&gt;My favorite rap producers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9th Wonder.&lt;/li&gt;
&lt;li&gt;Apollo Brown.&lt;/li&gt;
&lt;li&gt;DJ Premier.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these artists create boom bap beats, so they beats share a common type of music. A interface can represent this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Author: Raphael da Silva&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;BoomBapProducer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;makeABeat&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All producers can implement the same interface:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Author: Raphael da Silva&lt;/span&gt;

&lt;span class="n"&gt;class&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;thWonder&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;BoomBapProducer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;makeABeat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Classic soul samples.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ApolloBrown&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;BoomBapProducer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;makeABeat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Hard drums and soul sample.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DJPremier&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;BoomBapProducer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;makeABeat&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Classic NY east coast style.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I don't speak english (I try write to share ideas), please be nice with me and forgive my mistakes.&lt;/p&gt;

</description>
      <category>rap</category>
      <category>music</category>
      <category>hiphop</category>
      <category>oop</category>
    </item>
    <item>
      <title>POO - Compondo os vingadores (da marvel) com objetos</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sat, 11 Jul 2020 16:19:03 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/compondo-os-vingadores-da-marvel-com-objetos-42f4</link>
      <guid>https://dev.to/raphaeldasilva/compondo-os-vingadores-da-marvel-com-objetos-42f4</guid>
      <description>&lt;p&gt;Criar objetos do mesmo tipo e usá-los para compor outros objetos é algo que permite juntar todos os objetos em uma composição única que faz algo que reune todos eles. Para ilustrar essa união eu irei usar os hérois da Marvel que formam os vingadores.&lt;/p&gt;

&lt;p&gt;Primeiramente, será criada uma interface para representar esses heróis e seus atos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Vingador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;avante&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois disso serão criados os heróis que são implementações diferentes dessa mesma interface que representa cada um dos heróis. Segue o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CapitaoAmerica&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vingador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;avante&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Jogar o escudo'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PanteraNegra&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vingador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;avante&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Usar a tecnologia de Wakanda e artes marciais.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HomemFormiga&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vingador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;avante&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Encolher com a tecnologia do Hank Pym.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DoutorEstranho&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;Vingador&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;avante&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;'Projetar magia do plano astral.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois de ter vários objetos do mesma da mesma interface (ou seja, do mesmo tipo), será criada uma classe que é composta por todos esses objetos juntos e representa a junção de todos eles, no exemplo desse artigo essa classe junta todos os heróis e, com isso, forma os Vingadores, já que ela é composta por todos os heróis juntos (composta é a palavra-chave aqui).&lt;/p&gt;

&lt;p&gt;Segue a classe que representa os Vingarores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="cd"&gt;/**
 *
 * @author Raphael da Silva
 *
 */&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Vingadores&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nv"&gt;$vingadores&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;Vingador&lt;/span&gt; &lt;span class="mf"&gt;...&lt;/span&gt;&lt;span class="nv"&gt;$vingadores&lt;/span&gt;
    &lt;span class="p"&gt;){&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;vingadores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$vingadores&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;avanteVingadores&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;vingadores&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$vingador&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;vingador&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;avancar&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para usar as classes o código e juntar tudo na prática ficaria da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nv"&gt;$vingadores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Vingadores&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CapitaoAmerica&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PanteraNegra&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HomemFormiga&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;DoutorEstranho&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nv"&gt;$vingadores&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;avanteVingadores&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora todos os hérois em formação podem ir avante!&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;O autor do desenho do banner é o artista &lt;a href="https://pt.wikipedia.org/wiki/Rafael_Gramp%C3%A1"&gt;Rafael Grampá&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ptbr</category>
      <category>braziliandevs</category>
      <category>marvel</category>
      <category>interface</category>
    </item>
    <item>
      <title>PHP - Funções anônimas estáticas</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sat, 11 Jul 2020 16:16:31 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/funcoes-anonimas-estaticas-5f24</link>
      <guid>https://dev.to/raphaeldasilva/funcoes-anonimas-estaticas-5f24</guid>
      <description>&lt;p&gt;Olhando um repositório no Github (uma dia antes da criação desse post) me achamou a atenção o uso da palavra reservada &lt;code&gt;static&lt;/code&gt; em uma função anônima, pois eu nunca tinha visto isso e, portanto, não sabia que existia essa possibilidade no PHP. Depois de estudar resolvi &lt;a href="https://raphael-da-silva.github.io/escrita-io/"&gt;escrever&lt;/a&gt; sobre isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  A finalidade
&lt;/h3&gt;

&lt;p&gt;Fui pesquisar e entendi o porquê do uso de uma função anônima assim. Basicamente, ao declarar a função estática a variável &lt;code&gt;$this&lt;/code&gt; não existirá no escopo da função, ou seja, a função não irá referenciar um contexto de onde ela foi declarada. Segue o exemplo em código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contexto&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;exemplo&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;

        &lt;span class="nv"&gt;$funcaoSemContexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;

            &lt;span class="c1"&gt;// Essa variável é indefinida no escopo dessa função.&lt;/span&gt;
            &lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="nv"&gt;$funcaoSemContexto&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sem usar a palavra reservada &lt;code&gt;static&lt;/code&gt;, a variável &lt;code&gt;$this&lt;/code&gt; iria apontar para uma instância da classe &lt;code&gt;Contexto&lt;/code&gt;, já que foi nessa classe que a função anônima foi criada e, consequentemente, ela seria o contexto dessa função. Como a função foi declara estática, o seguinte erro aparece:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Fatal error: Uncaught Error: Using $this when not in object context&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Troca de contexto
&lt;/h3&gt;

&lt;p&gt;Vale lembrar que uma função anônima no PHP é uma instância da classe (interna do PHP) &lt;a href="https://www.php.net/closure"&gt;Closure&lt;/a&gt; e essa classe tem métodos como o método &lt;code&gt;bindTo&lt;/code&gt;, que é responsável por adicionar um novo contexto (aka a variável &lt;code&gt;$this&lt;/code&gt;) em uma função anônima. &lt;/p&gt;

&lt;p&gt;Só que trocar de contexto não é possível em uma função declarada como estática, já que ela impossibilita ter contexto. Em outras palavras, não dá para usar o método &lt;code&gt;bindTo&lt;/code&gt; em função anônima quando ela é estática.&lt;/p&gt;

&lt;p&gt;Segue isso exemplificado mantendo o exemplo de código criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Contexto&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; 

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;exemplo&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;

        &lt;span class="nv"&gt;$funcaoSemContexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;

            &lt;span class="c1"&gt;// Essa variável é indefinida no escopo dessa função.&lt;/span&gt;
            &lt;span class="nb"&gt;var_dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="p"&gt;};&lt;/span&gt;

        &lt;span class="nv"&gt;$novoContexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;stdClass&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nv"&gt;$novoContexto&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;texto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Esse objeto é o novo contexto.'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Isso não é possível porque a função foi criada estática&lt;/span&gt;
        &lt;span class="nv"&gt;$funcaoSemContexto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$funcaoSemContexto&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bindTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$novoContexto&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$funcaoSemContexto&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ao executar o código acima, o erro a seguir aparece por conta da função anônima ser estática.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Warning: Cannot bind an instance to a static closure&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Finalizando
&lt;/h3&gt;

&lt;p&gt;Esse comportamento alcançado através funções anônimas estáticas é semelhante ao de classes estáticas, já que elas não tem contexto por não serem uma instância de um objeto. Declarar uma função anônima como estática dá essa mesma natureza (de não ter contexto) para a função.&lt;/p&gt;

&lt;p&gt;Esse comportamento pode ser útil se por algum motivo é necessário evitar que o &lt;code&gt;$this&lt;/code&gt; possa ser usado em uma função anônima.&lt;/p&gt;

&lt;h3&gt;
  
  
  Atualização
&lt;/h3&gt;

&lt;p&gt;Atualizei um projeto que fiz com Slim Framework para &lt;a href="https://github.com/raphael-da-silva/frases-de-filmes/commit/fe354880b55b867bed337c5dfe60f98f18d01068"&gt;usar as funções estáticas&lt;/a&gt; nos arquivos de configuração que isolam o escopo do código, pois nessas funções não existe sentido em usar o &lt;code&gt;$this&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>php</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>PHP - Nullable types vs. Parâmetros opcionais</title>
      <dc:creator>Raphael da Silva</dc:creator>
      <pubDate>Sat, 11 Jul 2020 16:15:33 +0000</pubDate>
      <link>https://dev.to/raphaeldasilva/nullable-types-vs-parametros-opcionais-4ea5</link>
      <guid>https://dev.to/raphaeldasilva/nullable-types-vs-parametros-opcionais-4ea5</guid>
      <description>&lt;p&gt;&lt;a href="https://wiki.php.net/rfc/nullable_types"&gt;Nullable Types&lt;/a&gt; é um recurso adicionado a partir da versão 7.1 do PHP, ele serve para permitir que um parâmetro possa receber nulo além do tipo definido como type hinting. A função &lt;code&gt;printName&lt;/code&gt; a seguir espera um parâmetro do tipo &lt;code&gt;StdClass&lt;/code&gt;, só que o ponto de interrogação (?) antes da declaração do tipo define esse parâmetro como nullable type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;?StdClass&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;is_null&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;sprinf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Meu nome é %s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Nenhum nome!'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como o parâmetro é nullable type, ele pode ser executado de duas formas: passando o tipo esperado ou passando um valor nulo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;StdClass&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Usuário da Silva'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Imprime 'Meu nome é Usuário da Silva'&lt;/span&gt;
&lt;span class="nf"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Imprime 'Nenhum nome!'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso difere o recurso de nullable types dos parâmetros opcionais, pois quando um parâmetro opcional é definido, significa que a função pode ser chamada sem nenhum parâmetro. Segue o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="c1"&gt;// Agora o parâmetro é opcional&lt;/span&gt;
&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;StdClass&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nb"&gt;is_null&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nf"&gt;sprinf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Meu nome é %s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'Nenhum nome!'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nc"&gt;StdClass&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Usuário da Silva'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Imprime 'Meu nome é Usuário da Silva'&lt;/span&gt;
&lt;span class="nf"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Imprime 'Nenhum nome!'&lt;/span&gt;

&lt;span class="c1"&gt;// É possível executar a função sem parâmetro.&lt;/span&gt;
&lt;span class="nf"&gt;printName&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Imprime 'Nenhum nome!'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como é possível perceber na terceira execução da função, nenhum parâmetro está sendo passado, isso é possível porque o parâmetro foi declarado como opcional. Essa é a diferença principal, já que no nullable type não dá para omitir um parâmetro, pois é necessário que ele receba um valor nulo explicitamente (além do tipo esperado, é claro).&lt;/p&gt;

</description>
      <category>ptbr</category>
      <category>php</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
