<?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: Mauro Chojrin</title>
    <description>The latest articles on DEV Community by Mauro Chojrin (@mchojrin).</description>
    <link>https://dev.to/mchojrin</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%2F174937%2F9c4fe997-5174-4517-a2dd-c3b3d7f5794c.jpeg</url>
      <title>DEV Community: Mauro Chojrin</title>
      <link>https://dev.to/mchojrin</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mchojrin"/>
    <language>en</language>
    <item>
      <title>Por qué programar en Spanglish es una mala idea</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Mon, 25 Oct 2021 18:01:17 +0000</pubDate>
      <link>https://dev.to/mchojrin/por-que-programar-en-spanglish-es-una-mala-idea-4jp4</link>
      <guid>https://dev.to/mchojrin/por-que-programar-en-spanglish-es-una-mala-idea-4jp4</guid>
      <description>&lt;p&gt;Es muy común, cuando uno está dando los primeros pasos en programación, la adopción de malas prácticas. En este sentido los desarrolladores de habla hispana tenemos una ligera desventaja respecto de nuestros colegas angloparlantes: para ellos palabras como if, for o while tienen sentido por sí mismas. A nostoros en cambio nos requiere un esfuerzo… &lt;a href="https://academy.leewayweb.com/por-que-programar-en-spanglish-es-una-mala-idea/"&gt;Seguir leyendo Por qué programar en Spanglish es una mala idea&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/por-que-programar-en-spanglish-es-una-mala-idea/"&gt;Por qué programar en Spanglish es una mala idea&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reflexiones</category>
    </item>
    <item>
      <title>Functional Programming in PHP: What, Why, and How</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Thu, 21 Oct 2021 17:59:12 +0000</pubDate>
      <link>https://dev.to/mchojrin/functional-programming-in-php-what-why-and-how-3ijc</link>
      <guid>https://dev.to/mchojrin/functional-programming-in-php-what-why-and-how-3ijc</guid>
      <description>&lt;p&gt;If you’ve been around software development for a while, you have probably heard about functional programming. You’re probably wondering whether it is as interesting as people say and if you should go through the effort of learning about it. &lt;/p&gt;

&lt;p&gt;Let’s explore what functional programming (FP) is, why you should master it, and how to apply all of these concepts without leaving your language of choice: PHP. &lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Functional Programming?
&lt;/h2&gt;

&lt;p&gt;Functional programming is a paradigm (a way of thinking about solving a problem and structuring programs). Usually, when people think of programming, they think about the most common paradigm: imperative programming. &lt;/p&gt;

&lt;p&gt;In imperative programming, your job is to answer the question of how to solve a problem. You produce a set of instructions to tell a computer what it should do (and in what order) to create a specific output given an input. &lt;/p&gt;

&lt;p&gt;We’re not telling you anything you didn’t already know, right? (Other than putting a name to something you’ve been doing your entire life). Bear with us for a minute. &lt;/p&gt;

&lt;p&gt;Functional programming's basis is the principle of declarative programming, where your job is no longer to define the how but what and let the computer fill the gaps. &lt;/p&gt;

&lt;p&gt;It sounds like magic, doesn’t it? Well, I bet you’re already using some of it. Think SQL.&lt;/p&gt;

&lt;p&gt;When you write &lt;code&gt;SELECT * FROM users&lt;/code&gt;, you’re not telling the database engine &lt;em&gt;how&lt;/em&gt; to get the user information from the disk, build the record set, and more. You’re simply stating your wishes out loud and letting the genie do its work. &lt;/p&gt;

&lt;p&gt;Functional programming is a similar idea. &lt;/p&gt;

&lt;p&gt;In imperative programming, a function is another name, a routine (a chunk of code you can call any time without re-writing it repeatedly). In functional programming, a function is more closely related to the mathematical concept, as in mapping. This concept creates a more abstract view where the actual mapping computation for a particular input is a secondary concern. &lt;/p&gt;

&lt;p&gt;Let’s look at a simple example. Say you have an array of N elements, and you want to find the biggest. Using imperative programming, you’d express the solution somewhat like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Function GetMaxValue(a): 

Max = a[0] 

For i = 1 to len(a): 
  If a[i] &amp;gt; max: 
    max = a[i] 

Return max 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In FP, you’d write the solution like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Function GetMaxValue(a): 

If len(a) == 1: 
  return a[0] 
Else: 
  return max(a[0], GetMaxValue(a[1..len(a)])) 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Of course, this on its own doesn’t constitute a whole paradigm. One feature of every functional language is that functions are first-class values. The distinction between function and variable is somewhat blurry. &lt;/p&gt;

&lt;p&gt;You can think about functions like a particular data type that happens to be callable. In that sense, there’d be nothing weird about an assignment such as &lt;code&gt;F = GetMaxValue&lt;/code&gt; (note the difference between this assignment and &lt;code&gt;F = GetMaxValue([1, 2, 3])&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Also, since a function is nothing but a datatype, nothing prevents you from returning a function from a function or receiving one as a parameter. That’s where it gets interesting. &lt;/p&gt;

&lt;p&gt;However, before going deeper, we need to address an important question: why should you care? &lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Should Learn About Functional Programming
&lt;/h2&gt;

&lt;p&gt;FP creates code that is easier to read, maintain, re-use, and test. It also allows for elegant meta-programming, as you’ll see in the examples below. &lt;/p&gt;

&lt;p&gt;Now, let’s jump into the nitty-gritty of PHP implementation. &lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use Functional Programming in PHP
&lt;/h2&gt;

&lt;p&gt;While PHP is not a functional language, it enables you to take advantage of many exciting functional features. PHP uses tools to implement FP: the &lt;a href="https://www.php.net/manual/en/language.types.callable.php"&gt;callable&lt;/a&gt; type and the &lt;a href="https://www.php.net/manual/en/class.closure.php"&gt;Closure Class&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Let’s examine some simple examples to see those tools in action. &lt;/p&gt;

&lt;p&gt;Say you have an array of Person objects with a method &lt;code&gt;getAge()&lt;/code&gt;, and you want to create a list of &lt;code&gt;Persons&lt;/code&gt; ordered by age. Using non-functional programming, your code looks somewhat like:&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;Person&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;int&lt;/span&gt; &lt;span class="nv"&gt;$age&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="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;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&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;getAge&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&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;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&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;isOlderThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$otherPerson&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&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;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$otherPerson&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&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="nv"&gt;$persons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; 

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[]&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;Person&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;"Before: "&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&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;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="o"&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;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&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;isOlderThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
      &lt;span class="nv"&gt;$aux&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
      &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; 
      &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$aux&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;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"After:"&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&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;"After:"&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code works just fine, but since usort enables you to sort an array based on any criteria you want, wouldn’t it be better to use it? See how the new version looks:&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;Person&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;int&lt;/span&gt; &lt;span class="nv"&gt;$age&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="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;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&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;getAge&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;int&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;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;age&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;isOlderThan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$otherPerson&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;bool&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;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$otherPerson&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&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="nv"&gt;$persons&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; 

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[]&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;Person&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;"Before: "&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nb"&gt;usort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'personOrder'&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;"After:"&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&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;"After:"&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may wonder what that &lt;code&gt;personOrder&lt;/code&gt; is that suddenly appeared. It is a good, old function defined like 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="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;personOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$p1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$p2&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="nv"&gt;$p1&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;$p2&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&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="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;elseif&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$p1&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$p2&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&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="mi"&gt;1&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;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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;As you can see, the order criteria are entirely isolated from the looping code, making it easy to change if needed (for instance, if you must present the list in descending order). In this case, the string &lt;code&gt;'personOrder'&lt;/code&gt; constitutes the callable, which passes to the &lt;a href="https://www.php.net/manual/en/function.usort.php"&gt;usort function&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Another common use of this kind of construct is creating a new array based on a given function’s sequential application to every element in an array, like 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="nv"&gt;$ages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt; 

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;$ages&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&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;getAge&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;"Ages: "&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ages&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can translate into:&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="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Ages: "&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; 
    &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$p&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;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
    &lt;span class="p"&gt;},&lt;/span&gt; 
    &lt;span class="nv"&gt;$persons&lt;/span&gt; 
&lt;span class="p"&gt;));&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example introduces two new concepts. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The function &lt;a href="https://www.php.net/manual/en/function.array-map.php"&gt;array_map&lt;/a&gt;, which takes a function as an argument and returns the result of applying it as a second parameter to every element in the array (this is called a higher-order function) &lt;/li&gt;
&lt;li&gt;The definition of an anonymous function (a closure). &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think about this inline function definition as similar to using a literal value (string, int, float, or others) instead of a variable. It is handy if you’re using it one time. Otherwise, it can backfire.&lt;/p&gt;

&lt;p&gt;The last general example is about getting some elements out of an array, also known as filtering. &lt;/p&gt;

&lt;p&gt;For filtering, PHP offers you the function &lt;a href="https://www.php.net/manual/en/function.array-filter.php"&gt;array_filter&lt;/a&gt;, which takes a function as an argument. The code evaluates this function for each element of the array. Those functions evaluating to true will be present in the resulting collection. &lt;/p&gt;

&lt;p&gt;Let’s see how we’d go about getting a list of every person above 18 years old:&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="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Over 18: "&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$p&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;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;18&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;Now let’s say you don’t want to hardcode the age threshold but receive it via a command-line interface (CLI) parameter. &lt;/p&gt;

&lt;p&gt;To bring that context information into your anonymous function, you use the keyword &lt;code&gt;use&lt;/code&gt;, like 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="nv"&gt;$threshold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&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;"Over &lt;/span&gt;&lt;span class="nv"&gt;$threshold&lt;/span&gt;&lt;span class="s2"&gt;: "&lt;/span&gt;&lt;span class="mf"&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="nb"&gt;print_r&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;array_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$persons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  
    &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Person&lt;/span&gt; &lt;span class="nv"&gt;$p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$threshold&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;$p&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;getAge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$threshold&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;By now, you’re probably thinking that this is a little too much work just to save yourself from writing a couple of foreach here and there, right? Well, of course, this is just the tip of the iceberg. You can do much more using FP. &lt;/p&gt;

&lt;p&gt;Consider the following code, for example:&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;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$g&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;$p1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; 
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$p2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$p1&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;$g&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$p1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$p2&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;echo&lt;/span&gt; &lt;span class="nf"&gt;f&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&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;$arg1&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;$arg2&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;$arg1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nv"&gt;$arg2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code looks strange, right? When would you possibly need something like this? &lt;/p&gt;

&lt;p&gt;Let's examine a couple of real-life examples using these structures. &lt;/p&gt;

&lt;h2&gt;
  
  
  Real-Life Functional Programming in PHP Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Generic Cache Mechanism Based on Callbacks
&lt;/h3&gt;

&lt;p&gt;Consider a company producing and maintaining a social network for amateur travelers. At one point, they discovered some website pages were taking way too much time to render since someone had created them using many heavy SQL queries. &lt;/p&gt;

&lt;p&gt;The developers came up with an idea to cache parts of these pages and stored this pre-generated content in in-memory key-value storage. They implemented this by creating a class responsible for serving the cached content if available or producing it otherwise. &lt;/p&gt;

&lt;p&gt;To achieve this goal, the developers wrote a method within that class that looked somewhat like 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="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getCachedContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;Closure&lt;/span&gt; &lt;span class="nv"&gt;$generationFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$generationParams&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nv"&gt;$string&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;isContentAvailable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&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="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="nb"&gt;call_user_func_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$generationFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
      &lt;span class="nv"&gt;$generationParams&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;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$key&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;Note: the actual code is a little more complex due to some infrastructure concerns beyond the purpose of this post. It’s a little rusty, but you can still check it out on &lt;a href="https://github.com/mchojrin/dist-cache"&gt;GitHub&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;The whole idea here is that the developers completely separated the cache management code from the code to produce the cached contents by using a few FP tricks. Note how the &lt;code&gt;getCachedContent()&lt;/code&gt; method has no clue whatsoever about the function it will eventually call nor its parameters. &lt;/p&gt;

&lt;h3&gt;
  
  
  Lazy Dependency Injection Container
&lt;/h3&gt;

&lt;p&gt;A different project had a peculiarity: several helper classes performed a wide array of tasks. This project needed these helpers in all sorts of combinations depending on the actual request served. Since there were many simultaneous users, if the developers were not careful with memory and CPU use, the situation could deteriorate quite fast. &lt;/p&gt;

&lt;p&gt;The project had a little dependency injection container (a simple class to store all these helpers and access them as needed). The problem is, on every request, the developers had to create all the helpers’ instances instead of just those to produce the response. &lt;/p&gt;

&lt;p&gt;The solution is to switch from a structure such as:&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="nv"&gt;$depContainer&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;DependencyInjectionContainer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 
&lt;span class="nv"&gt;$depContainer&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addDependency&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;HelperClass&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To:&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="nv"&gt;$depContainer&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;DependencyInjectionContainer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; 

&lt;span class="nv"&gt;$depContainar&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;addDependencyFactory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;HelperClass&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HelperClass&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;This way, the code only creates helpers when actually needed. It’s the container’s job to check if the object is available and, if not, call the appropriate factory function and return the newly-created instance. &lt;/p&gt;

&lt;p&gt;This method results in much more efficient memory use and reduced time to render a page since the code does not execute constructors for unused classes. &lt;/p&gt;

&lt;h2&gt;
  
  
  Go Functional!
&lt;/h2&gt;

&lt;p&gt;In this article, you learned (a little) what functional programming is all about, why you should pay attention to it, and how to implement it using PHP. Granted, it’s not easy, but the benefits are palpable after you get past the initial friction. &lt;/p&gt;

&lt;p&gt;To go deeper into understanding functional programming concepts, read about currying, partial application, and pure functions. For specific ways to practice functional programming within PHP, check out &lt;a href="https://leanpub.com/functional-php/read"&gt;this Functional PHP book&lt;/a&gt; and &lt;a href="https://github.com/boehm-s/fun-php"&gt;this library&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>functional</category>
    </item>
    <item>
      <title>Cómo validar que un correo existe usando PHP</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Tue, 10 Aug 2021 12:32:00 +0000</pubDate>
      <link>https://dev.to/mchojrin/como-validar-que-un-correo-existe-usando-php-1n2l</link>
      <guid>https://dev.to/mchojrin/como-validar-que-un-correo-existe-usando-php-1n2l</guid>
      <description>&lt;p&gt;Seguramente alguna vez te habrás topado con la necesidad de registrar correos electrónicos de los visitantes de tu sitio, ¿cierto? Usualmente esto se hace para mantenerlos al tanto de las novedades. Claro que, aunque vos tengas las mejores intenciones, es entendible que la gente sea un poco escéptica con tanto spammer dando vueltas, por lo […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/como-validar-que-un-correo-existe-usando-php/"&gt;Cómo validar que un correo existe usando PHP&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>validación</category>
      <category>correo</category>
      <category>php</category>
    </item>
    <item>
      <title>Cómo compartir con otras personas tu proyecto PHP ya terminado</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Thu, 03 Jun 2021 17:26:00 +0000</pubDate>
      <link>https://dev.to/mchojrin/como-compartir-con-otras-personas-tu-proyecto-php-ya-terminado-4m24</link>
      <guid>https://dev.to/mchojrin/como-compartir-con-otras-personas-tu-proyecto-php-ya-terminado-4m24</guid>
      <description>&lt;p&gt;Listo. Terminado. Finito. Ah… qué placer, ¿no? Después de horas frente a la pantalla, incontables tazas de café y miles de bugs resueltos, por fin llegará el merecido descanso… sólo falta hacer la demo para el cliente. Es que si no se hace el cliente no podrá dar su visto bueno y sin él… difícil […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/como-compartir-con-otras-personas-tu-proyecto-php-ya-terminado/"&gt;Cómo compartir con otras personas tu proyecto PHP ya terminado&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>herramientas</category>
      <category>infraestructura</category>
    </item>
    <item>
      <title>Guía para solucionar problemas de DataTables con Ajax y PHP</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Mon, 10 May 2021 15:17:00 +0000</pubDate>
      <link>https://dev.to/mchojrin/guia-para-solucionar-problemas-de-datatables-con-ajax-y-php-1ka3</link>
      <guid>https://dev.to/mchojrin/guia-para-solucionar-problemas-de-datatables-con-ajax-y-php-1ka3</guid>
      <description>&lt;p&gt;Usá DataTables te dijeron. «Es el mejor plugin que vas a encontrar para mostrar datos en forma resumida» «Es súper fácil de usar» Si… claro. Armar la tabla no es muy complicado, es cierto, pero cuando le empezabas a encontrar el gustito… las cosas se complicaron. ¿Y ahora? ¿¿Qué pasa que no se cargan los […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/guia-para-solucionar-problemas-de-datatables-con-ajax-y-php/"&gt;Guía para solucionar problemas de DataTables con Ajax y PHP&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>datatables</category>
      <category>ajax</category>
      <category>php</category>
    </item>
    <item>
      <title>Cuál es la mejor librería para hacer PDF desde PHP</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Wed, 05 May 2021 13:39:30 +0000</pubDate>
      <link>https://dev.to/mchojrin/cual-es-la-mejor-libreria-para-hacer-pdf-desde-php-15jp</link>
      <guid>https://dev.to/mchojrin/cual-es-la-mejor-libreria-para-hacer-pdf-desde-php-15jp</guid>
      <description>&lt;p&gt;Si desarrollás aplicativos para empresas apuesto que te habrás topado con la necesidad de emitir reportes en PDF, ¿cierto? Un caso típico es el de generar facturas. De por sí es un tema integrarte con los webservices del fisco (Léase AFIP, SUNAT, DGI, DIAN, etc…) y cuando pensaste que todo era cuesta abajo a partir […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/cual-es-la-mejor-libreria-para-hacer-pdf-desde-php/"&gt;Cuál es la mejor librería para hacer PDF desde PHP&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>pdf</category>
    </item>
    <item>
      <title>Administrando proyectos PHP con Composer</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Wed, 21 Apr 2021 20:40:07 +0000</pubDate>
      <link>https://dev.to/mchojrin/administrando-proyectos-php-con-composer-4o1j</link>
      <guid>https://dev.to/mchojrin/administrando-proyectos-php-con-composer-4o1j</guid>
      <description>&lt;p&gt;Leer o escribir planillas de Excel, incorporar alguna pasarela de pago, autenticación vía redes sociales, etc... son necesidades muy comunes en las aplicaciones web modernas.&lt;/p&gt;

&lt;p&gt;Si bien en teoría podrías desarrollar tus propios códigos para solventar estas necesidades, es claro que perderías tiempo muy valioso haciéndolo, en lugar de concentrarte en lo que realmente importa: resolver los problemas del negocio.&lt;/p&gt;

&lt;p&gt;Por ello, lo más común es valerse de código que otros hayan desarrollado para tí.&lt;/p&gt;

&lt;p&gt;En el caso de PHP, existen diversas formas de incorporar código de terceros a tus proyectos.&lt;/p&gt;

&lt;h2&gt;
  
  
  El manejo de librerías de terceros en proyectos PHP
&lt;/h2&gt;

&lt;p&gt;Históricamente esto se realizaba simplemente descargando algún archivo comprimido y depositándolo en algún directorio que pareciera cómodo.&lt;/p&gt;

&lt;p&gt;Un tiempo más tarde apareció en escena &lt;a href="https://pear.php.net/" rel="noopener noreferrer"&gt;PEAR&lt;/a&gt; y todo mejoró bastante, sin embargo, todavía existían problemas derivados de la incompatibilidad entre versiones de diferentes librerías y lograr una aplicación de cierta envergadura se tornaba algo bastante complicado.&lt;/p&gt;

&lt;p&gt;Uno de los grandes problemas que presentaba el manejo de dependencias a través de PEAR era la dificultad de replicar los cambios realizados en forma local en otros ambientes (pruebas, producción, etc…).&lt;/p&gt;

&lt;p&gt;Todo eso cambió a partir de la aparición de &lt;a href="https://getcomposer.org/" rel="noopener noreferrer"&gt;composer&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Composer al rescate
&lt;/h2&gt;

&lt;p&gt;Composer fue realmente un &lt;em&gt;game-changer&lt;/em&gt; para los que desarrollamos utilizando php.&lt;/p&gt;

&lt;p&gt;Se trata de una herramienta de muy alto nivel que administra las dependencias de nuestros proyectos de un modo sumamente cómodo.&lt;/p&gt;

&lt;p&gt;El principal cambio que introduce composer es la incorporación de las dependencias al propio código del proyecto.&lt;/p&gt;

&lt;p&gt;Esto hace muy sencilla la igualación de ambientes ya que todo lo que se necesita para ejecutar una determinada aplicación está presente en un archivo (Que puede/debe ser subido al controlador de versiones junto con el resto del proyecto).&lt;/p&gt;

&lt;p&gt;El formato elegido para la configuración de composer es json, un formato simple de escribir y leer para humanos.&lt;/p&gt;

&lt;p&gt;Composer define una serie de claves que pueden utilizarse para declarar qué paquetes de terceros deben ser instalados para que nuestra aplicación pueda funcionar.&lt;/p&gt;

&lt;p&gt;Este es un ejemplo de archivo &lt;code&gt;composer.json&lt;/code&gt; de uno de mis proyectos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"leewayweb/followapp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"proprietary"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"minimum-stability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"stable"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"autoload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"psr-4"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"App\\"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"psr-0"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"src/"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"autoload-dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"psr-4"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"App\\Tests\\"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tests/"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"php"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^7.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ext-ctype"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ext-iconv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"abdielcs/expanded-collection-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"doctrine/doctrine-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"doctrine/doctrine-cache-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"doctrine/doctrine-migrations-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"doctrine/orm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.7"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fabpot/goutte"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"knplabs/knp-menu-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"nelexa/zip"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"phpoffice/phpspreadsheet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"scheb/yahoo-finance-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sensio/framework-extra-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^5.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sunra/php-simple-html-dom-parser"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/console"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/dotenv"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/flex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/form"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/framework-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/http-client"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/monolog-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/orm-pack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/polyfill-apcu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/security-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/swiftmailer-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/translation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/twig-pack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/validator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/web-server-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/yaml"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"twbs/bootstrap"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.3"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"require-dev"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"dama/doctrine-test-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"doctrine/doctrine-fixtures-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"easycorp/easy-deploy-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"fzaninotto/faker"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.9"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/maker-bundle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.14"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/phpunit-bridge"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^4.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/profiler-pack"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"vimeo/psalm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^3.7"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"config"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"preferred-install"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"*"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dist"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"sort-packages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"auto-scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"cache:clear"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symfony-cmd"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"assets:install %PUBLIC_DIR%"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symfony-cmd"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"post-install-cmd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"@auto-scripts"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"post-update-cmd"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="s2"&gt;"@auto-scripts"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"conflict"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony/symfony"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extra"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"symfony"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"allow-contrib"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"require"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4.4.*"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Puede parecer un poco complejo a primera vista, ¿cierto? Pues no te dejes intimidar :)&lt;/p&gt;

&lt;p&gt;Este proyecto está basado en el framework &lt;a href="https://symfony.com/" rel="noopener noreferrer"&gt;Symfony&lt;/a&gt;, con lo cual muchas de sus dependencias y configuraciones le dan soporte a esta herramienta.&lt;/p&gt;

&lt;p&gt;De todo lo que se ve, la clave más importante es &lt;code&gt;require&lt;/code&gt;, en ella se declaran todas las librerías de terceros que serán necesarias para correr la aplicación sin problemas.&lt;/p&gt;

&lt;p&gt;En este ejemplo vemos que la primera es &lt;code&gt;"php": "^7.3"&lt;/code&gt;, esto significa que para que la aplicación pueda ejecutarse el servidor debe contar con un intérprete de php en versión, al menos, 7.3.&lt;/p&gt;

&lt;p&gt;Posteriormente vemos &lt;code&gt;"ext-ctype": "*"&lt;/code&gt; y &lt;code&gt;"ext-iconv": "*"&lt;/code&gt;, lo que indica que, además de la versión de php, se requieren estas extensiones instaladas.&lt;/p&gt;

&lt;p&gt;Hasta aquí vemos las dependencias duras, aquellas que, si no se satisfacen, harán que composer arroje un error al intentar instalar/configurar la aplicación.&lt;/p&gt;

&lt;p&gt;Las siguientes dependencias siguen el patrón &lt;code&gt;vendor/package&lt;/code&gt;, esto permite inferir que se trata de paquetes escritos en php.&lt;/p&gt;

&lt;p&gt;Lo que se ve a la derecha de la definición de las dependencias es una restricción de versión, una de las partes más interesantes y complejas de composer, por ahora sólo digamos que a través de estas expresiones podemos evitar conflictos entre las diferentes dependencias.&lt;/p&gt;

&lt;p&gt;El segundo archivo importante que trae consigo composer es &lt;code&gt;composer.lock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Este archivo también tiene formato json, sin embargo no está pensado para ser editado manualmente.&lt;/p&gt;

&lt;p&gt;Su objetivo es congelar las versiones que se utilizarán efectivamente para evitar esos problemas tipo “en mi casa andaba”.&lt;/p&gt;

&lt;p&gt;¿Por qué no alcanza con el archivo composer.json?&lt;/p&gt;

&lt;p&gt;Precisamente por la existencia de expresiones de versiones.&lt;/p&gt;

&lt;p&gt;Por ejemplo, en el archivo .json encontraremos cosas como &lt;code&gt;"symfony/console": "*"&lt;/code&gt; (Usar cualquier versión del componente &lt;code&gt;symfony/console&lt;/code&gt;) y en el archivo .lock veremos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"symfony/console"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"v4.4.8"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/symfony/console.git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"reference"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"10bb3ee3c97308869d53b3e3d03f6ac23ff985f7"&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Es decir una referencia resuelta: un número de versión específico que será utilizado en nuestro proyecto.&lt;/p&gt;

&lt;p&gt;Ambos archivos deben ser incorporados al controlador de versiones que utilicemos.&lt;/p&gt;

&lt;p&gt;Veamos algunos ejemplos prácticos&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo instalar composer
&lt;/h2&gt;

&lt;p&gt;Lo primero que debemos hacer para utilizar composer es instalar la utilidad de línea de comandos.&lt;/p&gt;

&lt;p&gt;La mejor forma de hacerlo es seguir las instrucciones del sitio &lt;a href="https://getcomposer.org" rel="noopener noreferrer"&gt;getcomposer.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Al día de hoy sería:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para verificar que todo ha salida correctamente puedes correr:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php composer.phar --version&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Y deberías ver algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Composer version 2.0.11 2021-02-24 14:57:23
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Cómo crear un nuevo proyecto usando composer
&lt;/h2&gt;

&lt;p&gt;Si bien es posible escribir directamente en el archivo &lt;code&gt;composer.json&lt;/code&gt;, lo más recomendable es utilizar la herramienta que acabas de descargar.&lt;/p&gt;

&lt;p&gt;Para crear un nuevo proyecto puedes utilizar este comando:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;php composer.phar init&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;El cual te irá realizando una serie de preguntas y, en base a tus respuestas, generará el archivo apropiado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafnoz2tqfhh5f0v1uipe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fafnoz2tqfhh5f0v1uipe.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una pregunta muy importante es esta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Would you like to define your dependencies (require) interactively [yes]?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En general te recomiendo responder que sí, de esta forma podrás incorporar las librerías que utilizarás de una forma muy cómoda.&lt;/p&gt;

&lt;p&gt;No te preocupes si aún no las conoces todas, incorporarlas posteriormente será muy sencillo también.&lt;/p&gt;

&lt;p&gt;Cuando te pida &lt;code&gt;Search for a package:&lt;/code&gt; ingresa &lt;code&gt;leewayweb/ci_php&lt;/code&gt; y luego dale enter hasta el final.&lt;/p&gt;

&lt;p&gt;Muy importante contestar sí a la pregunta &lt;code&gt;Would you like to install dependencies now [yes]?&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Al hacerlo verás cómo composer descarga todo lo necesario para que puedas empezar a desarrollar tu proyecto.&lt;/p&gt;

&lt;p&gt;Al cabo de un momentito deberías ver algo como:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztfnyfqoyxynvo6mixix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztfnyfqoyxynvo6mixix.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y si pides el listado de archivos de tu directorio encontrarás:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw85vgp21fqmvcnvvfa0o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw85vgp21fqmvcnvvfa0o.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se han creado los archivos &lt;code&gt;composer.json&lt;/code&gt;, &lt;code&gt;composer.lock&lt;/code&gt; y, muy importante, el directorio &lt;code&gt;vendor&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;En ese directorio se encontrarán todas las librerías que vayas a utilizar junto con un archivo de configuración de la función de carga automática (autoload), el cual deberás incluir en tu proyecto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo utilizar librerías administradas por composer
&lt;/h2&gt;

&lt;p&gt;Lo primero que debes hacer al comenzar un nuevo archivo en el que vayas a requerir usar alguna librería instalada vía composer 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="k"&gt;require_once&lt;/span&gt; &lt;span class="s1"&gt;'vendor/autoload.php'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y luego podrás usar las clases definidas en tus librerías.&lt;/p&gt;

&lt;p&gt;En nuestro caso quedaría así:&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;require_once&lt;/span&gt; &lt;span class="s1"&gt;'vendor/autoload.php'&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;Leewayweb\CiValidator\CiValidator&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;$validator&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;CiValidator&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="nv"&gt;$validator&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;validate_ci&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&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;'Valid CI!'&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="s1"&gt;'Invalid CI!'&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="kc"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este es un ejemplo de un script que permite validar cédulas de identidad uruguayas pero del mismo modo puedes usar cualquier librería.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo incorporar nuevas librerías
&lt;/h2&gt;

&lt;p&gt;Para incorporar nuevas librerías tienes dos opciones:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Agregar manualmente una entrada en la clave &lt;code&gt;require&lt;/code&gt; del archivo &lt;code&gt;composer.json&lt;/code&gt; y ejecutar el comando &lt;code&gt;composer install&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ejecutar el comando &lt;code&gt;composer require&lt;/code&gt; y seguir las instrucciones&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Supongo que a esta altura imaginarás cuál te recomendaré :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué otras operaciones pueden hacerse con composer
&lt;/h2&gt;

&lt;p&gt;A través de composer es sumamente simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Eliminar dependencias&lt;/li&gt;
&lt;li&gt;Actualizar versiones de dependencias&lt;/li&gt;
&lt;li&gt;Verificar qué librerías requieren actualizaciones &lt;/li&gt;
&lt;li&gt;Comprender por qué una determinada dependencia no puede ser instalada&lt;/li&gt;
&lt;li&gt;Crear tus propios comandos para ser ejecutados luego de actualizar dependencias&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Entre otras que puedes conocer leyendo la documentación oficial.&lt;/p&gt;

&lt;h2&gt;
  
  
  De dónde salen los paquetes de Composer
&lt;/h2&gt;

&lt;p&gt;Supongo que para este momento te estarás preguntando de dónde sale toda esta magia.&lt;/p&gt;

&lt;p&gt;La respuesta es el sitio &lt;a href="https://packagist.org" rel="noopener noreferrer"&gt;packagist.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Se trata de un enorme repositorio de paquetes instalables vía composer disponibles en forma pública.&lt;/p&gt;

&lt;p&gt;Incluso puedes publicar tus propios paquetes ahí y contribuir a la comunidad :)&lt;/p&gt;

&lt;h2&gt;
  
  
  De aquí en adelante
&lt;/h2&gt;

&lt;p&gt;Bueno, ahora que has conocido composer espero te haya gustado tanto como a mí y te ayude a ahorrar tiempo y dolores de cabeza.&lt;/p&gt;

&lt;p&gt;Si te ha quedado alguna duda o comentario te invito a que lo dejes por aquí o me contactes a través de mis redes sociales.&lt;/p&gt;

</description>
      <category>php</category>
      <category>composer</category>
    </item>
    <item>
      <title>¿Es cierto que PHP está muerto?</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Tue, 09 Mar 2021 12:30:22 +0000</pubDate>
      <link>https://dev.to/mchojrin/es-cierto-que-php-esta-muerto-46j</link>
      <guid>https://dev.to/mchojrin/es-cierto-que-php-esta-muerto-46j</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SB-UuQqz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gxbgcbrgmxu68z84p9mc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SB-UuQqz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gxbgcbrgmxu68z84p9mc.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Leo por ahí cosas como: «He vuelto a estudiar PHP porque quiero aprender bien a programar con él y no entiendo por qué siempre se termina hablando sobre si PHP está o no muerto, personalmente lo veo muy vivo pero cuando veo tanto vídeo de ese estilo dudo un poco en seguir estudiando PHP« «No […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/es-cierto-que-php-esta-muerto/"&gt;¿Es cierto que PHP está muerto?&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>reflexiones</category>
      <category>php</category>
    </item>
    <item>
      <title>¿Cuál es la diferencia entre PDO y MySQLi?</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Wed, 17 Feb 2021 18:46:00 +0000</pubDate>
      <link>https://dev.to/mchojrin/cual-es-la-diferencia-entre-pdo-y-mysqli-2b3f</link>
      <guid>https://dev.to/mchojrin/cual-es-la-diferencia-entre-pdo-y-mysqli-2b3f</guid>
      <description>&lt;p&gt;Si me decís que estás desarrollando una aplicación web usando PHP y no me das más datos, cerrando los ojos diría que estás usando una base de datos MySQL y, seguro que en el 80% de los casos acertaría. Es un hecho: PHP y MySQL son un dúo muy común en este mundillo. Lo que […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/cual-es-la-diferencia-entre-pdo-y-mysqli/"&gt;¿Cuál es la diferencia entre PDO y MySQLi?&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
      <category>mysql</category>
      <category>pdo</category>
    </item>
    <item>
      <title>¿Qué son las extensiones de PHP?</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Tue, 16 Feb 2021 18:45:52 +0000</pubDate>
      <link>https://dev.to/mchojrin/que-son-las-extensiones-de-php-3h94</link>
      <guid>https://dev.to/mchojrin/que-son-las-extensiones-de-php-3h94</guid>
      <description>&lt;p&gt;Quién no se cruzó con mensajes como: Debes tener instalada/habilitada la extension en PHP sobre GD Pero… ¿qué es exactamente una extensión de PHP? Para comprenderlo debes conocer un poco cómo funciona PHP internamente. A continuación te daré una visión algo simplificada, si quieres una explicación completa y detallada te recomiendo este excelente tutorial de […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/que-son-las-extensiones-de-php/"&gt;¿Qué son las extensiones de PHP?&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>php</category>
    </item>
    <item>
      <title>¿Qué tan «globales» son las variables globales en PHP?</title>
      <dc:creator>Mauro Chojrin</dc:creator>
      <pubDate>Thu, 31 Dec 2020 14:27:00 +0000</pubDate>
      <link>https://dev.to/mchojrin/que-tan-globales-son-las-variables-globales-en-php-1ghn</link>
      <guid>https://dev.to/mchojrin/que-tan-globales-son-las-variables-globales-en-php-1ghn</guid>
      <description>&lt;p&gt;Parece una pregunta rara, ¿no? Seguro estás pensando «¿Dónde está la trampa?», ¿cierto? En general se entiende que una variable global es aquella que está presente (es decir, puede ser leída y modificada) en cualquier lugar de un programa. El caso de PHP es algo particular. Para comenzar si hicieras algo como esto: Esperarías ver: […]&lt;/p&gt;

&lt;p&gt;La entrada &lt;a href="https://academy.leewayweb.com/que-tan-globales-son-las-variables-globales-en-php/"&gt;¿Qué tan «globales» son las variables globales en PHP?&lt;/a&gt; se publicó primero en &lt;a href="https://academy.leewayweb.com"&gt;Leeway Academy&lt;/a&gt;.&lt;/p&gt;

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