理解 PHP 依赖注入 | Laravel IoC容器,laravelioc_PHP教程
理解 PHP 依赖注入 | Laravel IoC容器,laravelioc
Laravel框架的依赖注入确实很强大,并且通过容器实现依赖注入可以有选择性的加载需要的服务,减少初始化框架的开销,下面是我在网上看到的一个帖子,写的很好拿来与大家分享,文章从开始按照传统的类设计数据库连接一直到通过容器加载服务这个高度解耦的设计展示了依赖注入的强大之处,值得我们借鉴和学习。
-----------------------------------------------------------分割线下面是大牛的原文----------------------------------------------------------
原文连接(http://www.yuansir-web.com/2014/03/20)
首先,我们假设,我们要开发一个组件命名为SomeComponent。这个组件中现在将要注入一个数据库连接。在这个例子中,数据库连接在component中被创建,这种方法是不切实际的,这样做的话,我们将不能改变数据库连接参数及数据库类型等一些参数。
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>class</span><span> SomeComponent </span><span> 4</span> <span>{ </span><span> 5</span> <span> 6</span> <span>/*</span><span>* </span><span> 7</span> <span> * The instantiation of the connection is hardcoded inside </span><span> 8</span> <span> * the component so is difficult to replace it externally </span><span> 9</span> <span> * or change its behavior </span><span>10</span> <span>*/</span> <span>11</span> <span>public</span> <span>function</span><span> someDbTask() </span><span>12</span> <span> { </span><span>13</span> <span>$connection</span> = <span>new</span> Connection(<span>array</span><span>( </span><span>14</span> "host" => "localhost", <span>15</span> "username" => "root", <span>16</span> "password" => "secret", <span>17</span> "dbname" => "invo" <span>18</span> <span> )); </span><span>19</span> <span>20</span> <span>//</span><span> ...</span> <span>21</span> <span> } </span><span>22</span> <span>23</span> <span>} </span><span>24</span> <span>25</span> <span>$some</span> = <span>new</span><span> SomeComponent(); </span><span>26</span> <span>$some</span>->someDbTask();
为了解决上面所说的问题,我们需要在使用前创建一个外部连接,并注入到容器中。就目前而言,这看起来是一个很好的解决方案:
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>class</span><span> SomeComponent </span><span> 4</span> <span>{ </span><span> 5</span> <span> 6</span> <span>protected</span> <span>$_connection</span><span>; </span><span> 7</span> <span> 8</span> <span>/*</span><span>* </span><span> 9</span> <span> * Sets the connection externally </span><span>10</span> <span>*/</span> <span>11</span> <span>public</span> <span>function</span> setConnection(<span>$connection</span><span>) </span><span>12</span> <span> { </span><span>13</span> <span>$this</span>->_connection = <span>$connection</span><span>; </span><span>14</span> <span> } </span><span>15</span> <span>16</span> <span>public</span> <span>function</span><span> someDbTask() </span><span>17</span> <span> { </span><span>18</span> <span>$connection</span> = <span>$this</span>-><span>_connection; </span><span>19</span> <span>20</span> <span>//</span><span> ...</span> <span>21</span> <span> } </span><span>22</span> <span>23</span> <span>} </span><span>24</span> <span>25</span> <span>$some</span> = <span>new</span><span> SomeComponent(); </span><span>26</span> <span>27</span> <span>//</span><span>Create the connection</span> <span>28</span> <span>$connection</span> = <span>new</span> Connection(<span>array</span><span>( </span><span>29</span> "host" => "localhost", <span>30</span> "username" => "root", <span>31</span> "password" => "secret", <span>32</span> "dbname" => "invo" <span>33</span> <span>)); </span><span>34</span> <span>35</span> <span>//</span><span>Inject the connection in the component</span> <span>36</span> <span>$some</span>->setConnection(<span>$connection</span><span>); </span><span>37</span> <span>38</span> <span>$some</span>->someDbTask();
现在我们来考虑一个问题,我们在应用程序中的不同地方使用此组件,将多次创建数据库连接。使用一种类似全局注册表的方式,从这获得一个数据库连接实例,而不是使用一次就创建一次。
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>class</span><span> Registry </span><span> 4</span> <span>{ </span><span> 5</span> <span> 6</span> <span>/*</span><span>* </span><span> 7</span> <span> * Returns the connection </span><span> 8</span> <span>*/</span> <span> 9</span> <span>public</span> <span>static</span> <span>function</span><span> getConnection() </span><span>10</span> <span> { </span><span>11</span> <span>return</span> <span>new</span> Connection(<span>array</span><span>( </span><span>12</span> "host" => "localhost", <span>13</span> "username" => "root", <span>14</span> "password" => "secret", <span>15</span> "dbname" => "invo" <span>16</span> <span> )); </span><span>17</span> <span> } </span><span>18</span> <span>19</span> <span>} </span><span>20</span> <span>21</span> <span>class</span><span> SomeComponent </span><span>22</span> <span>{ </span><span>23</span> <span>24</span> <span>protected</span> <span>$_connection</span><span>; </span><span>25</span> <span>26</span> <span>/*</span><span>* </span><span>27</span> <span> * Sets the connection externally </span><span>28</span> <span>*/</span> <span>29</span> <span>public</span> <span>function</span> setConnection(<span>$connection</span><span>){ </span><span>30</span> <span>$this</span>->_connection = <span>$connection</span><span>; </span><span>31</span> <span> } </span><span>32</span> <span>33</span> <span>public</span> <span>function</span><span> someDbTask() </span><span>34</span> <span> { </span><span>35</span> <span>$connection</span> = <span>$this</span>-><span>_connection; </span><span>36</span> <span>37</span> <span>//</span><span> ...</span> <span>38</span> <span> } </span><span>39</span> <span>40</span> <span>} </span><span>41</span> <span>42</span> <span>$some</span> = <span>new</span><span> SomeComponent(); </span><span>43</span> <span>44</span> <span>//</span><span>Pass the connection defined in the registry</span> <span>45</span> <span>$some</span>->setConnection(Registry::<span>getConnection()); </span><span>46</span> <span>47</span> <span>$some</span>->someDbTask();
现在,让我们来想像一下,我们必须在组件中实现两个方法,首先需要创建一个新的数据库连接,第二个总是获得一个共享连接:
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>class</span><span> Registry </span><span> 4</span> <span>{ </span><span> 5</span> <span> 6</span> <span>protected</span> <span>static</span> <span>$_connection</span><span>; </span><span> 7</span> <span> 8</span> <span>/*</span><span>* </span><span> 9</span> <span> * Creates a connection </span><span>10</span> <span>*/</span> <span>11</span> <span>protected</span> <span>static</span> <span>function</span><span> _createConnection() </span><span>12</span> <span> { </span><span>13</span> <span>return</span> <span>new</span> Connection(<span>array</span><span>( </span><span>14</span> "host" => "localhost", <span>15</span> "username" => "root", <span>16</span> "password" => "secret", <span>17</span> "dbname" => "invo" <span>18</span> <span> )); </span><span>19</span> <span> } </span><span>20</span> <span>21</span> <span>/*</span><span>* </span><span>22</span> <span> * Creates a connection only once and returns it </span><span>23</span> <span>*/</span> <span>24</span> <span>public</span> <span>static</span> <span>function</span><span> getSharedConnection() </span><span>25</span> <span> { </span><span>26</span> <span>if</span> (self::<span>$_connection</span>===<span>null</span><span>){ </span><span>27</span> <span>$connection</span> = self::<span>_createConnection(); </span><span>28</span> self::<span>$_connection</span> = <span>$connection</span><span>; </span><span>29</span> <span> } </span><span>30</span> <span>return</span> self::<span>$_connection</span><span>; </span><span>31</span> <span> } </span><span>32</span> <span>33</span> <span>/*</span><span>* </span><span>34</span> <span> * Always returns a new connection </span><span>35</span> <span>*/</span> <span>36</span> <span>public</span> <span>static</span> <span>function</span><span> getNewConnection() </span><span>37</span> <span> { </span><span>38</span> <span>return</span> self::<span>_createConnection(); </span><span>39</span> <span> } </span><span>40</span> <span>41</span> <span>} </span><span>42</span> <span>43</span> <span>class</span><span> SomeComponent </span><span>44</span> <span>{ </span><span>45</span> <span>46</span> <span>protected</span> <span>$_connection</span><span>; </span><span>47</span> <span>48</span> <span>/*</span><span>* </span><span>49</span> <span> * Sets the connection externally </span><span>50</span> <span>*/</span> <span>51</span> <span>public</span> <span>function</span> setConnection(<span>$connection</span><span>){ </span><span>52</span> <span>$this</span>->_connection = <span>$connection</span><span>; </span><span>53</span> <span> } </span><span>54</span> <span>55</span> <span>/*</span><span>* </span><span>56</span> <span> * This method always needs the shared connection </span><span>57</span> <span>*/</span> <span>58</span> <span>public</span> <span>function</span><span> someDbTask() </span><span>59</span> <span> { </span><span>60</span> <span>$connection</span> = <span>$this</span>-><span>_connection; </span><span>61</span> <span>62</span> <span>//</span><span> ...</span> <span>63</span> <span> } </span><span>64</span> <span>65</span> <span>/*</span><span>* </span><span>66</span> <span> * This method always needs a new connection </span><span>67</span> <span>*/</span> <span>68</span> <span>public</span> <span>function</span> someOtherDbTask(<span>$connection</span><span>) </span><span>69</span> <span> { </span><span>70</span> <span>71</span> <span> } </span><span>72</span> <span>73</span> <span>} </span><span>74</span> <span>75</span> <span>$some</span> = <span>new</span><span> SomeComponent(); </span><span>76</span> <span>77</span> <span>//</span><span>This injects the shared connection</span> <span>78</span> <span>$some</span>->setConnection(Registry::<span>getSharedConnection()); </span><span>79</span> <span>80</span> <span>$some</span>-><span>someDbTask(); </span><span>81</span> <span>82</span> <span>//</span><span>Here, we always pass a new connection as parameter</span> <span>83</span> <span>$some</span>->someOtherDbTask(Registry::getConnection());
到此为止,我们已经看到了如何使用依赖注入解决我们的问题。不是在代码内部创建依赖关系,而是让其作为一个参数传递,这使得我们的程序更容易维护,降低程序代码的耦合度,实现一种松耦合。但是从长远来看,这种形式的依赖注入也有一些缺点。
例如,如果组件中有较多的依赖关系,我们需要创建多个setter方法传递,或创建构造函数进行传递。另外,每次使用组件时,都需要创建依赖组件,使代码维护不太易,我们编写的代码可能像这样:
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>//</span><span>Create the dependencies or retrieve them from the registry</span> <span> 4</span> <span>$connection</span> = <span>new</span><span> Connection(); </span><span> 5</span> <span>$session</span> = <span>new</span><span> Session(); </span><span> 6</span> <span>$fileSystem</span> = <span>new</span><span> FileSystem(); </span><span> 7</span> <span>$filter</span> = <span>new</span><span> Filter(); </span><span> 8</span> <span>$selector</span> = <span>new</span><span> Selector(); </span><span> 9</span> <span>10</span> <span>//</span><span>Pass them as constructor parameters</span> <span>11</span> <span>$some</span> = <span>new</span> SomeComponent(<span>$connection</span>, <span>$session</span>, <span>$fileSystem</span>, <span>$filter</span>, <span>$selector</span><span>); </span><span>12</span> <span>13</span> <span>//</span><span> ... or using setters</span> <span>14</span> <span>15</span> <span>$some</span>->setConnection(<span>$connection</span><span>); </span><span>16</span> <span>$some</span>->setSession(<span>$session</span><span>); </span><span>17</span> <span>$some</span>->setFileSystem(<span>$fileSystem</span><span>); </span><span>18</span> <span>$some</span>->setFilter(<span>$filter</span><span>); </span><span>19</span> <span>$some</span>->setSelector(<span>$selector</span>);
我想,我们不得不在应用程序的许多地方创建这个对象。如果你不需要依赖的组件后,我们又要去代码注入部分移除构造函数中的参数或者是setter方法。为了解决这个问题,我们再次返回去使用一个全局注册表来创建组件。但是,在创建对象之前,它增加了一个新的抽象层:
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>class</span><span> SomeComponent </span><span> 4</span> <span>{ </span><span> 5</span> <span> 6</span> <span>//</span><span> ...</span> <span> 7</span> <span> 8</span> <span>/*</span><span>* </span><span> 9</span> <span> * Define a factory method to create SomeComponent instances injecting its dependencies </span><span>10</span> <span>*/</span> <span>11</span> <span>public</span> <span>static</span> <span>function</span><span> factory() </span><span>12</span> <span> { </span><span>13</span> <span>14</span> <span>$connection</span> = <span>new</span><span> Connection(); </span><span>15</span> <span>$session</span> = <span>new</span><span> Session(); </span><span>16</span> <span>$fileSystem</span> = <span>new</span><span> FileSystem(); </span><span>17</span> <span>$filter</span> = <span>new</span><span> Filter(); </span><span>18</span> <span>$selector</span> = <span>new</span><span> Selector(); </span><span>19</span> <span>20</span> <span>return</span> <span>new</span> self(<span>$connection</span>, <span>$session</span>, <span>$fileSystem</span>, <span>$filter</span>, <span>$selector</span><span>); </span><span>21</span> <span> } </span><span>22</span> <span>23</span> }
这一刻,我们好像回到了问题的开始,我们正在创建组件内部的依赖,我们每次都在修改以及找寻一种解决问题的办法,但这都不是很好的做法。
一种实用和优雅的来解决这些问题,是使用容器的依赖注入,像我们在前面看到的,容器作为全局注册表,使用容器的依赖注入做为一种桥梁来解决依赖可以使我们的代码耦合度更低,很好的降低了组件的复杂性:
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>class</span><span> SomeComponent </span><span> 4</span> <span>{ </span><span> 5</span> <span> 6</span> <span>protected</span> <span>$_di</span><span>; </span><span> 7</span> <span> 8</span> <span>public</span> <span>function</span> __construct(<span>$di</span><span>) </span><span> 9</span> <span> { </span><span>10</span> <span>$this</span>->_di = <span>$di</span><span>; </span><span>11</span> <span> } </span><span>12</span> <span>13</span> <span>public</span> <span>function</span><span> someDbTask() </span><span>14</span> <span> { </span><span>15</span> <span>16</span> <span>//</span><span> Get the connection service </span><span>17</span> <span> // Always returns a new connection</span> <span>18</span> <span>$connection</span> = <span>$this</span>->_di->get('db'<span>); </span><span>19</span> <span>20</span> <span> } </span><span>21</span> <span>22</span> <span>public</span> <span>function</span><span> someOtherDbTask() </span><span>23</span> <span> { </span><span>24</span> <span>25</span> <span>//</span><span> Get a shared connection service, </span><span>26</span> <span> // this will return the same connection everytime</span> <span>27</span> <span>$connection</span> = <span>$this</span>->_di->getShared('db'<span>); </span><span>28</span> <span>29</span> <span>//</span><span>This method also requires a input filtering service</span> <span>30</span> <span>$filter</span> = <span>$this</span>->_db->get('filter'<span>); </span><span>31</span> <span>32</span> <span> } </span><span>33</span> <span>34</span> <span>} </span><span>35</span> <span>36</span> <span>$di</span> = <span>new</span><span> Phalcon\DI(); </span><span>37</span> <span>38</span> <span>//</span><span>Register a "db" service in the container</span> <span>39</span> <span>$di</span>->set('db', <span>function</span><span>(){ </span><span>40</span> <span>return</span> <span>new</span> Connection(<span>array</span><span>( </span><span>41</span> "host" => "localhost", <span>42</span> "username" => "root", <span>43</span> "password" => "secret", <span>44</span> "dbname" => "invo" <span>45</span> <span> )); </span><span>46</span> <span>}); </span><span>47</span> <span>48</span> <span>//</span><span>Register a "filter" service in the container</span> <span>49</span> <span>$di</span>->set('filter', <span>function</span><span>(){ </span><span>50</span> <span>return</span> <span>new</span><span> Filter(); </span><span>51</span> <span>}); </span><span>52</span> <span>53</span> <span>//</span><span>Register a "session" service in the container</span> <span>54</span> <span>$di</span>->set('session', <span>function</span><span>(){ </span><span>55</span> <span>return</span> <span>new</span><span> Session(); </span><span>56</span> <span>}); </span><span>57</span> <span>58</span> <span>//</span><span>Pass the service container as unique parameter</span> <span>59</span> <span>$some</span> = <span>new</span> SomeComponent(<span>$di</span><span>); </span><span>60</span> <span>61</span> <span>$some</span>->someTask();
现在,该组件只有访问某种service的时候才需要它,如果它不需要,它甚至不初始化,以节约资源。该组件是高度解耦。他们的行为,或者说他们的任何其他方面都不会影响到组件本身。
我们的实现办法¶
Phalcon\DI 是一个实现了服务的依赖注入功能的组件,它本身也是一个容器。
由于Phalcon高度解耦,Phalcon\DI 是框架用来集成其他组件的必不可少的部分,开发人员也可以使用这个组件依赖注入和管理应用程序中不同类文件的实例。
基本上,这个组件实现了 Inversion of Control 模式。基于此,对象不再以构造函数接收参数或者使用setter的方式来实现注入,而是直接请求服务的依赖注入。这就大大降低了整体程序的复杂性,因为只有一个方法用以获得所需要的一个组件的依赖关系。
此外,这种模式增强了代码的可测试性,从而使它不容易出错。
在容器中注册服务¶
框架本身或开发人员都可以注册服务。当一个组件A要求调用组件B(或它的类的一个实例),可以从容器中请求调用组件B,而不是创建组件B的一个实例。
这种工作方式为我们提供了许多优点:
我们可以更换一个组件,从他们本身或者第三方轻松创建。
在组件发布之前,我们可以充分的控制对象的初始化,并对对象进行各种设置。
我们可以使用统一的方式从组件得到一个结构化的全局实例
服务可以通过以下几种方式注入到容器:
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>//</span><span>Create the Dependency Injector Container</span> <span> 4</span> <span>$di</span> = <span>new</span><span> Phalcon\DI(); </span><span> 5</span> <span> 6</span> <span>//</span><span>By its class name</span> <span> 7</span> <span>$di</span>->set("request", 'Phalcon\Http\Request'<span>); </span><span> 8</span> <span> 9</span> <span>//</span><span>Using an anonymous function, the instance will lazy loaded</span> <span>10</span> <span>$di</span>->set("request", <span>function</span><span>(){ </span><span>11</span> <span>return</span> <span>new</span><span> Phalcon\Http\Request(); </span><span>12</span> <span>}); </span><span>13</span> <span>14</span> <span>//</span><span>Registering directly an instance</span> <span>15</span> <span>$di</span>->set("request", <span>new</span><span> Phalcon\Http\Request()); </span><span>16</span> <span>17</span> <span>//</span><span>Using an array definition</span> <span>18</span> <span>$di</span>->set("request", <span>array</span><span>( </span><span>19</span> "className" => 'Phalcon\Http\Request' <span>20</span> ));
在上面的例子中,当向框架请求访问一个请求数据时,它将首先确定容器中是否存在这个”reqeust”名称的服务。
容器会反回一个请求数据的实例,开发人员最终得到他们想要的组件。
在上面示例中的每一种方法都有优缺点,具体使用哪一种,由开发过程中的特定场景来决定的。
用一个字符串来设定一个服务非常简单,但缺少灵活性。设置服务时,使用数组则提供了更多的灵活性,而且可以使用较复杂的代码。lambda函数是两者之间一个很好的平衡,但也可能导致更多的维护管理成本。
Phalcon\DI 提供服务的延迟加载。除非开发人员在注入服务的时候直接实例化一个对象,然后存存储到容器中。在容器中,通过数组,字符串等方式存储的服务都将被延迟加载,即只有在请求对象的时候才被初始化。
<span> 1</span> <?<span>php </span><span> 2</span> <span> 3</span> <span>//</span><span>Register a service "db" with a class name and its parameters</span> <span> 4</span> <span>$di</span>->set("db", <span>array</span><span>( </span><span> 5</span> "className" => "Phalcon\Db\Adapter\Pdo\Mysql", <span> 6</span> "parameters" => <span>array</span><span>( </span><span> 7</span> "parameter" => <span>array</span><span>( </span><span> 8</span> "host" => "localhost", <span> 9</span> "username" => "root", <span>10</span> "password" => "secret", <span>11</span> "dbname" => "blog" <span>12</span> <span> ) </span><span>13</span> <span> ) </span><span>14</span> <span>)); </span><span>15</span> <span>16</span> <span>//</span><span>Using an anonymous function</span> <span>17</span> <span>$di</span>->set("db", <span>function</span><span>(){ </span><span>18</span> <span>return</span> <span>new</span> Phalcon\Db\Adapter\Pdo\<span>Mysql</span>(<span>array</span><span>( </span><span>19</span> "host" => "localhost", <span>20</span> "username" => "root", <span>21</span> "password" => "secret", <span>22</span> "dbname" => "blog" <span>23</span> <span> )); </span><span>24</span> });
以上这两种服务的注册方式产生相同的结果。然后,通过数组定义的,在后面需要的时候,你可以修改服务参数:
<span>1</span> <?<span>php </span><span>2</span> <span>3</span> <span>$di</span>->setParameter("db", 0, <span>array</span><span>( </span><span>4</span> "host" => "localhost", <span>5</span> "username" => "root", <span>6</span> "password" => "secret" <span>7</span> ));
从容器中获得服务的最简单方式就是使用”get”方法,它将从容器中返回一个新的实例:
<span>1</span> <?<span>php </span><span>2</span> <span>$request</span> = <span>$di</span>->get("request");
或者通过下面这种魔术方法的形式调用:
<span>1</span> <?<span>php </span><span>2</span> <span>3</span> <span>$request</span> = <span>$di</span>-><span>getRequest(); </span><span>4</span> <span>5</span> Phalcon\DI 同时允许服务重用,为了得到一个已经实例化过的服务,可以使用 getShared() 方法的形式来获得服务。
具体的 Phalcon\Http\Request 请求示例:
<span>1</span> <?<span>php </span><span>2</span> <span>3</span> <span>$request</span> = <span>$di</span>->getShared("request");
参数还可以在请求的时候通过将一个数组参数传递给构造函数的方式:
<span>1</span> <?<span>php </span><span>2</span> <span>3</span> <span>$component</span> = <span>$di</span>->get("MyComponent", <span>array</span>("some-parameter", "other"))

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이 튜토리얼은 PHP를 사용하여 XML 문서를 효율적으로 처리하는 방법을 보여줍니다. XML (Extensible Markup Language)은 인간의 가독성과 기계 구문 분석을 위해 설계된 다목적 텍스트 기반 마크 업 언어입니다. 일반적으로 데이터 저장 AN에 사용됩니다

JWT는 주로 신분증 인증 및 정보 교환을 위해 당사자간에 정보를 안전하게 전송하는 데 사용되는 JSON을 기반으로 한 개방형 표준입니다. 1. JWT는 헤더, 페이로드 및 서명의 세 부분으로 구성됩니다. 2. JWT의 작업 원칙에는 세 가지 단계가 포함됩니다. JWT 생성, JWT 확인 및 Parsing Payload. 3. PHP에서 인증에 JWT를 사용하면 JWT를 생성하고 확인할 수 있으며 사용자 역할 및 권한 정보가 고급 사용에 포함될 수 있습니다. 4. 일반적인 오류에는 서명 검증 실패, 토큰 만료 및 대형 페이로드가 포함됩니다. 디버깅 기술에는 디버깅 도구 및 로깅 사용이 포함됩니다. 5. 성능 최적화 및 모범 사례에는 적절한 시그니처 알고리즘 사용, 타당성 기간 설정 합리적,

문자열은 문자, 숫자 및 기호를 포함하여 일련의 문자입니다. 이 튜토리얼은 다른 방법을 사용하여 PHP의 주어진 문자열의 모음 수를 계산하는 방법을 배웁니다. 영어의 모음은 A, E, I, O, U이며 대문자 또는 소문자 일 수 있습니다. 모음이란 무엇입니까? 모음은 특정 발음을 나타내는 알파벳 문자입니다. 대문자와 소문자를 포함하여 영어에는 5 개의 모음이 있습니다. a, e, i, o, u 예 1 입력 : String = "Tutorialspoint" 출력 : 6 설명하다 문자열의 "Tutorialspoint"의 모음은 u, o, i, a, o, i입니다. 총 6 개의 위안이 있습니다

정적 바인딩 (정적 : :)는 PHP에서 늦은 정적 바인딩 (LSB)을 구현하여 클래스를 정의하는 대신 정적 컨텍스트에서 호출 클래스를 참조 할 수 있습니다. 1) 구문 분석 프로세스는 런타임에 수행됩니다. 2) 상속 관계에서 통화 클래스를 찾아보십시오. 3) 성능 오버 헤드를 가져올 수 있습니다.

PHP의 마법 방법은 무엇입니까? PHP의 마법 방법은 다음과 같습니다. 1. \ _ \ _ Construct, 객체를 초기화하는 데 사용됩니다. 2. \ _ \ _ 파괴, 자원을 정리하는 데 사용됩니다. 3. \ _ \ _ 호출, 존재하지 않는 메소드 호출을 처리하십시오. 4. \ _ \ _ get, 동적 속성 액세스를 구현하십시오. 5. \ _ \ _ Set, 동적 속성 설정을 구현하십시오. 이러한 방법은 특정 상황에서 자동으로 호출되어 코드 유연성과 효율성을 향상시킵니다.

Laravel 이메일 전송이 실패 할 때 반환 코드를 얻는 방법. Laravel을 사용하여 응용 프로그램을 개발할 때 종종 확인 코드를 보내야하는 상황이 발생합니다. 그리고 실제로 ...

laravel 일정 작업 실행 비 응답 문제 해결 Laravel의 일정 작업 일정을 사용할 때 많은 개발자 가이 문제에 직면합니다 : 스케줄 : 실행 ...

Laravel의 이메일을 처리하지 않는 방법은 LaRavel을 사용하는 것입니다.
