<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>Phalcon - 标签 - 开发者技术小屋</title>
        <link>https://www.developerhome.net/tags/phalcon/</link>
        <description>Phalcon - 标签 - 开发者技术小屋</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 16 May 2017 18:13:16 &#43;0000</lastBuildDate><atom:link href="https://www.developerhome.net/tags/phalcon/" rel="self" type="application/rss+xml" /><item>
    <title>Phalcon学习记录（一）</title>
    <link>https://www.developerhome.net/archives/82/</link>
    <pubDate>Tue, 16 May 2017 18:13:16 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/82/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-82.jpg" referrerpolicy="no-referrer">
            </div><p><code>Phalcon\Di</code> 为一个容器里，用于服务的依赖注入，Di类本身只提供了注入功能，并不会默认绑定服务</p>
<p><code>Phalcon\Di\FactoryDefault</code> 为一个默认容器类，其为Di的子类，会默认注入mvc使用的大部分服务</p>
<p><code>Phalcon\Di\FactoryDefault\Cli</code> 与FactoryDefault相同，只不过默认只注入了一些用于Cli模式的服务</p>
<div class="code-block code-line-numbers" style="counter-reset: code-block 0">
    <div class="code-header language-php">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">use</span> <span class="nx">Phalcon\Di</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 此处也可以根据使用情景使用不同的Di，比如：
</span></span></span><span class="line"><span class="cl"><span class="sd"> * use Phalcon\Di\FactoryDefault as Di; 使用FactoryDefault作为Di
</span></span></span><span class="line"><span class="cl"><span class="sd"> * use Phalcon\Di\FactoryDefault\Cli as Di; 使用Cli作为Di
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="c1">// 声明一个Di的实例
</span></span></span><span class="line"><span class="cl"><span class="nv">$di</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Di</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="sd">/**
</span></span></span><span class="line"><span class="cl"><span class="sd"> * 定义一个Test类，作为后面做服务的测试
</span></span></span><span class="line"><span class="cl"><span class="sd"> */</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Test</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="nv">$id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="nv">$num1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="nv">$num2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$num1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">$num2</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="c1">// 随机生成id的值，这样以便后面观察单例模式
</span></span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">id</span> <span class="o">=</span> <span class="nx">rand</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">99999</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">num1</span> <span class="o">=</span> <span class="nv">$num1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">num2</span> <span class="o">=</span> <span class="nv">$num2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">    
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">setNum1</span><span class="p">(</span><span class="nv">$num1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">num1</span> <span class="o">=</span> <span class="nv">$num1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">setNum2</span><span class="p">(</span><span class="nv">$num2</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">num2</span> <span class="o">=</span> <span class="nv">$num2</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 注册一个名为test的服务，使用匿名函数方式
</span></span></span><span class="line"><span class="cl"><span class="nv">$test_service</span> <span class="o">=</span> <span class="nv">$di</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="k">function</span> <span class="p">(</span><span class="nv">$num1</span><span class="p">,</span> <span class="nv">$num2</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">new</span> <span class="nx">Test</span><span class="p">(</span><span class="nv">$num1</span><span class="p">,</span> <span class="nv">$num2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用数组方式注册一个服务，使用构造方式注入值
</span></span></span><span class="line"><span class="cl"><span class="nv">$test_service</span> <span class="o">=</span> <span class="nv">$di</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;className&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Test&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;arguments&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;parameter&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;value&#39;</span> <span class="o">=&gt;</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;parameter&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;value&#39;</span> <span class="o">=&gt;</span> <span class="mi">15</span>
</span></span><span class="line"><span class="cl">        <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用数组方式注册一个服务，使用赋值方式注入值
</span></span></span><span class="line"><span class="cl"><span class="nv">$test_service</span> <span class="o">=</span> <span class="nv">$di</span><span class="o">-&gt;</span><span class="na">set</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;className&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Test&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="s1">&#39;calls&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;method&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;setNum1&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;arguments&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">                <span class="p">[</span>
</span></span><span class="line"><span class="cl">                    <span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;parameter&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="s1">&#39;value&#39;</span> <span class="o">=&gt;</span> <span class="mi">11</span>
</span></span><span class="line"><span class="cl">                <span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="p">],</span>
</span></span><span class="line"><span class="cl">        <span class="p">[</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;method&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;setNum2&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">            <span class="s1">&#39;arguments&#39;</span> <span class="o">=&gt;</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">                <span class="p">[</span>
</span></span><span class="line"><span class="cl">                    <span class="s1">&#39;type&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;parameter&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">                    <span class="s1">&#39;value&#39;</span> <span class="o">=&gt;</span> <span class="mi">13</span>
</span></span><span class="line"><span class="cl">                <span class="p">]</span>
</span></span><span class="line"><span class="cl">            <span class="p">]</span>
</span></span><span class="line"><span class="cl">        <span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">]);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 可以观察到test_service为一个Phalcon\Di\Service的实例
</span></span></span><span class="line"><span class="cl"><span class="nx">var_dump</span><span class="p">(</span><span class="nv">$test_service</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 可以使用两种方式来获取刚刚注册的test类实例
</span></span></span><span class="line"><span class="cl"><span class="c1">// 第一种，使用Di来获取，可以用下面几种方式
</span></span></span><span class="line"><span class="cl"><span class="nv">$di</span><span class="o">-&gt;</span><span class="na">get</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="p">[</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl"><span class="nv">$di</span><span class="o">-&gt;</span><span class="na">getTest</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用数组方式时注册的匿名函数不能有参数
</span></span></span><span class="line"><span class="cl"><span class="nv">$di</span><span class="p">[</span><span class="s1">&#39;test&#39;</span><span class="p">];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用getService方式注册的匿名函数不能带有参数
</span></span></span><span class="line"><span class="cl"><span class="nv">$di</span><span class="o">-&gt;</span><span class="na">getService</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用刚刚生成的test_service来获取实例
</span></span></span><span class="line"><span class="cl"><span class="nv">$test_service</span><span class="o">-&gt;</span><span class="na">resolve</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 可以看到上面每个生成的test类的id都不一样。说明每个test类的实例都是重新生成的
</span></span></span><span class="line"><span class="cl"><span class="c1">// 作为服务，可能大部分时候都是使用单例模式，那么就需要使用setShared来注册服务。
</span></span></span><span class="line"><span class="cl"><span class="nv">$di</span><span class="o">-&gt;</span><span class="na">setShared</span><span class="p">(</span><span class="s1">&#39;test&#39;</span><span class="p">,</span> <span class="k">function</span> <span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="k">new</span> <span class="nx">Test</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">});</span></span></span></code></pre></div></div>]]></description>
</item>
</channel>
</rss>
