<?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>Forem: João Vitor</title>
    <description>The latest articles on Forem by João Vitor (@joaovitorss).</description>
    <link>https://forem.com/joaovitorss</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%2F876989%2Faa7b1c77-e797-4918-8a64-8392ebbc9a98.jpg</url>
      <title>Forem: João Vitor</title>
      <link>https://forem.com/joaovitorss</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joaovitorss"/>
    <language>en</language>
    <item>
      <title>PHP as a stateless language</title>
      <dc:creator>João Vitor</dc:creator>
      <pubDate>Thu, 13 Feb 2025 00:43:46 +0000</pubDate>
      <link>https://forem.com/joaovitorss/php-as-a-stateless-language-3k81</link>
      <guid>https://forem.com/joaovitorss/php-as-a-stateless-language-3k81</guid>
      <description>&lt;p&gt;If you've worked with PHP or web development, you've probably heard of &lt;strong&gt;stateless&lt;/strong&gt;. But what does it mean? And why is it so important?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To start, let’s ask: What is stateless?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stateless means "without state." In other words, the server doesn’t keep track of what happened before. Each request is independent, as if it were the first one. In PHP, this means that when a script runs, it does what it needs to do, sends a response to the browser, and... that’s it! On the next request, it starts from scratch, remembering nothing.&lt;/p&gt;

&lt;p&gt;This doesn’t mean it’s a bad thing. In fact, it has some advantages, and PHP has ways to work around it when we need to store information (like login details or shopping carts).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, how does PHP handle stateless?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PHP is stateless by nature, but it has a few "tricks" up its sleeve to store information between requests. The main ones are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sessions&lt;/strong&gt;: Store data on the server and use a cookie in the browser to identify the user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookies&lt;/strong&gt;: Store information directly in the user’s browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: For more permanent stuff, like user data or orders.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;But are there really advantages to this?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Since each request is independent, it’s easy to distribute the workload across multiple servers. This is great for applications that need to grow.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t need to manage state all the time. Each request is handled in isolation, which makes life easier for developers.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Reliability&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If one server goes down, another can take over without issues, since there’s no state to recover.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Easy Caching&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stateless requests are easier to cache, which improves performance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compatibility with RESTful APIs&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;REST APIs are stateless by nature, so PHP fits perfectly into this model.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Here’s where things get tricky: the disadvantages of stateless in PHP&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Manual State Management&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For things like login or shopping carts, you need to use sessions, cookies, or databases. This can add some extra work.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Communication Overhead&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In each request, you might need to send extra information (like cookies), which can increase network traffic.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Not Ideal for Real-Time&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you need real-time functionality (like a chat), the stateless model might not be the best. WebSockets are better suited for these cases.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Some examples of how to use sessions in PHP&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Using Sessions in PHP
Sessions are super useful for storing information between requests.
&lt;/li&gt;
&lt;/ol&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;// Start the session&lt;/span&gt;
&lt;span class="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Store the user’s name in the session&lt;/span&gt;
&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieve the name from the session&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Welcome, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this mini script above, the user’s name is stored in the session and can be retrieved on other pages.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Using Cookies in PHP
Cookies are another way to store information, but in the user’s browser.
&lt;/li&gt;
&lt;/ol&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;// Create a cookie that expires in 1 hour&lt;/span&gt;
&lt;span class="nb"&gt;setcookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Retrieve the cookie value&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_COOKIE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&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;echo&lt;/span&gt; &lt;span class="s2"&gt;"Welcome, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$_COOKIE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&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;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cookie not set."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Authentication with Sessions
A classic example is a login system:
&lt;/li&gt;
&lt;/ol&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="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Simulate a login&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'1234'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'logged_in'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Login successful!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid credentials."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Check if the user is logged in&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'logged_in'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'logged_in'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="s2"&gt;"Welcome, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'username'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Shopping Cart with Sessions
A shopping cart is a great example of something that needs state, after all, no one wants their cart to empty on every page refresh:
&lt;/li&gt;
&lt;/ol&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="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Add a product to the cart&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cart'&lt;/span&gt;&lt;span class="p"&gt;][]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'product'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Display the cart&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="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cart'&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="s2"&gt;"Shopping Cart:"&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;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'cart'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$product&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="s2"&gt;"&amp;lt;li&amp;gt;"&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;htmlspecialchars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$product&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;/li&amp;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;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cart is empty."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;PHP is stateless by default, which brings several advantages like scalability and simplicity. But when we need to store information (like login details or shopping carts), we just use sessions, cookies, or databases, and everything works out.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>O PHP como uma linguagem stateless</title>
      <dc:creator>João Vitor</dc:creator>
      <pubDate>Thu, 13 Feb 2025 00:38:29 +0000</pubDate>
      <link>https://forem.com/joaovitorss/o-php-como-uma-linguagem-stateless-aec</link>
      <guid>https://forem.com/joaovitorss/o-php-como-uma-linguagem-stateless-aec</guid>
      <description>&lt;p&gt;Se você já mexeu com PHP ou desenvolvimento web, provavelmente já ouviu falar em &lt;strong&gt;stateless&lt;/strong&gt;. Mas o que isso significa? E por que é tão importante?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Para começar, podemos perguntar: O que é stateless?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stateless quer dizer "sem estado". Traduzindo: o servidor não guarda informações sobre o que aconteceu antes. Cada requisição é independente, como se fosse a primeira. No PHP, isso significa que, quando um script roda, ele faz o que precisa fazer, manda a resposta para o navegador e... acabou! Na próxima requisição, ele começa do zero, sem lembrar de nada.&lt;/p&gt;

&lt;p&gt;Isso não significa que seja ruim. Na verdade, tem algumas vantagens, e com o PHP existe um jeito de contornar isso quando precisamos guardar informações (como login ou carrinho de compras).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Então, como o PHP lida com o stateless?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O PHP é stateless por natureza, mas ele tem algumas "gambiarras" na manga para guardar informações entre uma requisição e outra. &lt;br&gt;
As principais são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Sessões&lt;/strong&gt;: Guardam dados no servidor e usam um cookie no navegador para identificar o usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cookies&lt;/strong&gt;: Armazenam informações diretamente no navegador do usuário.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Banco de Dados&lt;/strong&gt;: Para coisas mais permanentes, como dados de usuários ou pedidos.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Mas realmente tem vantagens nisso?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como cada requisição é independente, é fácil distribuir o trabalho entre vários servidores. Isso é ótimo para aplicações que precisam crescer.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Simplicidade&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Não precisa ficar gerenciando estado o tempo todo. Cada requisição é tratada de forma isolada, o que facilita a vida do desenvolvedor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Confiabilidade&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se um servidor cair, outro pode assumir sem problemas, já que não há estado a ser recuperado.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Facilidade de Cache&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requisições stateless são mais fáceis de armazenar em cache, o que melhora o desempenho.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Compatibilidade com APIs RESTful&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs REST são stateless por natureza, então o PHP se encaixa perfeitamente nesse modelo.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;É aqui que o filho chora e mãe não vê, as desvantagens que vem junto do Stateless no PHP&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Precisa Gerenciar Estado Manualmente&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Para coisas como login ou carrinho de compras, você precisa usar sessões, cookies ou banco de dados. Isso pode dar um pouco mais de trabalho.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Overhead de Comunicação&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em cada requisição, você pode precisar enviar informações extras (como cookies), o que pode aumentar o tráfego de rede.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Não é Ideal para Tempo Real&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se você precisa de algo em tempo real (como um chat), o modelo stateless pode não ser o melhor. Usar WebSockets são mais indicados nesses casos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;&lt;strong&gt;Alguns exemplos de como utilizar sessão no PHP&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Usando Sessões no PHP
Sessões são super úteis para guardar informações entre requisições.
&lt;/li&gt;
&lt;/ol&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;// Inicia a sessão&lt;/span&gt;
&lt;span class="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Guarda o nome do usuário na sessão&lt;/span&gt;
&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'João'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Recupera o nome da sessão&lt;/span&gt;
&lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Bem-vindo, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nesse mini script acima, o nome do usuário é guardado na sessão e pode ser recuperado em outras páginas.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Usando Cookies no PHP
Cookies são outra forma de guardar informações, mas no navegador do usuário.
&lt;/li&gt;
&lt;/ol&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;// Cria um cookie que expira em 1 hora&lt;/span&gt;
&lt;span class="nb"&gt;setcookie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'João'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;time&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3600&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Recupera o valor do cookie&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_COOKIE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&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="s2"&gt;"Bem-vindo, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$_COOKIE&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Cookie não definido."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Autenticação com Sessões
Um exemplo clássico é o sistema de login:
&lt;/li&gt;
&lt;/ol&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="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Simulação de login&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'senha'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;'1234'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'logado'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Login bem-sucedido!"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Credenciais inválidas."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Verifica se o usuário está logado&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'logado'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'logado'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;true&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="s2"&gt;"Bem-vindo, "&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'usuario'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;ol&gt;
&lt;li&gt;Carrinho de Compras com Sessão
Um carrinho de compras é um ótimo exemplo de algo que precisa de estado, afinal, ninguém quer ter o carrinho esvaziado em cada atualização da página:
&lt;/li&gt;
&lt;/ol&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="nb"&gt;session_start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Adiciona um produto ao carrinho&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;isset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'produto'&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'carrinho'&lt;/span&gt;&lt;span class="p"&gt;][]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$_POST&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'produto'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Mostra o carrinho&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="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'carrinho'&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="s2"&gt;"Carrinho de Compras:"&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;$_SESSION&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'carrinho'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$produto&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="s2"&gt;"&amp;lt;li&amp;gt;"&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nb"&gt;htmlspecialchars&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$produto&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;/li&amp;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;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Carrinho vazio."&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O PHP é stateless por padrão, o que traz várias vantagens, como escalabilidade e simplicidade. Mas, quando precisamos guardar informações (como login ou carrinho de compras), é só utilizar as sessões, cookies ou banco de dados e tudo se resolve.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>php</category>
      <category>stateless</category>
      <category>development</category>
    </item>
    <item>
      <title>Explorando os Fundamentos dos Padrões de Projeto: Conceitos Básicos</title>
      <dc:creator>João Vitor</dc:creator>
      <pubDate>Tue, 26 Mar 2024 02:42:33 +0000</pubDate>
      <link>https://forem.com/joaovitorss/explorando-os-fundamentos-dos-padroes-de-projeto-conceitos-basicos-2haa</link>
      <guid>https://forem.com/joaovitorss/explorando-os-fundamentos-dos-padroes-de-projeto-conceitos-basicos-2haa</guid>
      <description>&lt;h1&gt;
  
  
  &lt;strong&gt;Afinal, o que são os Padrões de Projetos&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Padrões de Projeto, no desenvolvimento de software, são soluções típicas para problemas recorrentes que surgem durante o design e implementação de um software.&lt;/p&gt;

&lt;p&gt;São soluções elegantes, prontas, pensadas, testadas e aprovadas para situações comuns, que surgem no cotidiano de um dev.&lt;/p&gt;

&lt;p&gt;Esses padrões auxiliam os desenvolvedores na resolução de soluções complexas de maneira mais eficaz, fornecendo uma linguagem comum e um conjunto de práticas estabelecidas. Além disso, promovem a reutilização de código, facilitando a manutenção e a evolução contínua do software.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Por que esses padrões de projeto são tão importantes?&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Soluções comprovadas&lt;/strong&gt;: Os padrões representam soluções testadas e comprovadas para problemas comuns no desenvolvimento de software. Eles foram criados a partir da experiência de desenvolvedores ao longo do tempo e fornecem uma maneira confiável de resolver problemas recorrentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reutilização do código&lt;/strong&gt;: Ao aplicar os padrões de projeto, é possível utilizar o código mais de uma vez, criando componentes. Isso promove a reutilização de código e reduz a duplicação, levando a um desenvolvimento mais eficiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Complexidade Reduzida:&lt;/strong&gt; Os padrões promovem o acoplamento flexível entre os componentes, facilitando a substituição ou a ampliação de partes do sistema sem afetar outras. Essa flexibilidade é fundamental para a adaptação às mudanças de requisitos.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Mas afinal, quais são esses padrões?&lt;/strong&gt;
&lt;/h1&gt;

&lt;h4&gt;
  
  
  Existem vários tipos de padrões de projetos, categorizados em três principais grupos:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;1. Padrões de Criação (Creational Patterns):&lt;/strong&gt;&lt;br&gt;
Esse padrão simplifica o processo de instanciação de objetos, tornando um sistema independente da forma como esses objetos são criados, compostos e representados.&lt;br&gt;
Exemplos incluem o Singleton, Factory Method, Abstract Factory, Builder e Prototype.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Padrões Estruturais (Structural Patterns):&lt;/strong&gt;&lt;br&gt;
Já esse padrão se se preocupa em como as classes e objetos são compostos para formar estruturas maiores, facilitando a criação de sistemas mais flexíveis e reutilizáveis.&lt;br&gt;
Exemplos incluem o Adapter, Bridge, Composite, Decorator, Facade e Proxy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Padrões Comportamentais (Behavioral Patterns):&lt;/strong&gt;&lt;br&gt;
Por fim, o padrão comportamental se concentra na interação entre objetos, ajudando a definir como os objetos se comunicam entre si e como o fluxo de controle é gerenciado dentro do sistema.&lt;br&gt;
Exemplos incluem o Strategy, Observer, Command, Iterator, State e Template Method.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Alguns pontos que devem ser considerados ao implementar os padrões de projetos ao seu código&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Os padrões não são pedaços de código que você pode copiar e jogar no seu software, eles são um conceito, são como plantas pré-projetadas, que podem ser alteradas para se adequar ao seu código.&lt;/p&gt;

&lt;p&gt;Quando estiver familiarizado com um padrão, descubra onde ele se encaixa no seu projeto. Seja criterioso na sua aplicação; o uso excessivo pode complicar ainda mais as coisas.&lt;/p&gt;

&lt;p&gt;Alguns padrões são complexos e podem exigir um tempo considerável para entender e implementar corretamente. Então, pode ser mais eficiente escrever uma solução direta e simples.&lt;/p&gt;

&lt;h1&gt;
  
  
  &lt;strong&gt;Conclusão&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Embora os padrões de projetos possam trazer benefícios em muitos casos, é importante avaliar cada situação individualmente e decidir se a aplicação de um padrão específico é apropriada e benéfica para o seu projeto.&lt;br&gt;
O objetivo é corrigir problemas de forma rápida e eficaz e que os padrões de projeto são apenas uma maneira de fazer isso.&lt;/p&gt;

&lt;p&gt;Este artigo apenas apresenta conceitos simples e uma breve introdução aos Padrões de Projeto.&lt;/p&gt;

&lt;p&gt;Cada um desses padrões pode ser explorado com muito mais profundidade, com exemplos e variações mais complexas para atender a requisitos específicos.&lt;/p&gt;

</description>
      <category>patterns</category>
      <category>php</category>
      <category>architecture</category>
      <category>designpatterns</category>
    </item>
  </channel>
</rss>
