搜索
首页后端开发php教程Phalcon自动加载(PHP自动加载),phalcon加载php_PHP教程

Phalcon自动加载(PHP自动加载),phalcon加载php

自动加载(phalcon\Loader)

转载请注明来源

一、php文件引入

  通过 include() 或 require() 函数,可以在PHP程序执行之前在该文件中插入一个文件的内容。

<p>区别:<span>处理错误的方式不同</span>。<strong>include() 函数</strong>会生成一个<span><strong>警告</strong></span>(但是脚本会继续执行),而 <strong>require()</strong> 函数会生成一个<span><strong>致命错误</strong></span>(fatal error)(在错误发生后脚本会停止执行)</p>

  * 正因为在文件不存在或被重命名后脚本不会继续执行,因此我们推荐使用 require() 而不是 include()。

二、php类自动加载

参考文章:php手册  和  PHP的类自动加载机制

  在php5之前,各php框架实现类的加载,一般要按照某种约定实现一个遍历目录,自动加载符合约定条件的文件类或函数。因此在php5之前类的使用并没有现在频繁。

  在php5之后,当加载php类的时候,如果类所在文件夹并没有被包含进来或是类名出错时,Zend引擎会自动调用__autoload函数。__autoload函数需要用户自己实现。

  在php5.1.2版本之后,可以使用spl_autoload_register函数自定义加载处理函数。当没有调用此函数,默认情况下会使用spl自定义的spl_autoload函数。

 

1. php自动加载之__autoload

 

<span>function</span> __autoload(<span>$className</span><span>) {
    </span><span>$file</span> = <span>$className</span> . '.php'<span>;
    </span><span>if</span> (<span>is_file</span>(<span>$file</span><span>)) {
        </span><span>require</span>(<span>$file</span><span>);
    }</span><span>else</span><span>{
        </span><span>echo</span> 'no this ' . <span>$className</span> . ' class file'<span>;
    }
}
</span><span>$demo</span> = <span>new</span> Demo();

 事实上,我们可以看到__autoload至少需要做三件事(“三步走”),它们分别是:

在第一步和第二步中,我们必须约定类名与文件的映射方法,只有这样我们才能够依据类名找到其所对应的文件,实现加载。

因此__autoload自动加载中,最重要的就是指定类名与其所在文件的对应关系。当有大量的类需要包含进来的时候,我们只需要确立相应的规则,然后将类名与其对应的文件进行映射,就能够实现惰性加载(lazy loading)了。

<p><strong>Tip:</strong>spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。</p>

2. php自动加载之spl_autoload_register

引言:如果在一个php系统实现中,使用了很多的其他类库,这些类库可能是由不同的工程师进行开发的,因此类名与其所在文件的映射规则不尽相同。这时候如果要实现类库的自动加载,就必须在__autoload函数中将所有的映射规则全部实现。这就会导致__autoload会非常复杂,甚至无法实现。同时还会使得__autoload函数十分臃肿。为将来系统的维护和性能带来很大的负面影响。(__autoload的弊端)

spl_autoload_register:

  注册给定的函数作为__autoload的实现。简单来说就是将函数注册之SPL的__autoload函数栈中,并移除系统默认的__autload()函数。

<span>function</span> __autoload(<span>$className</span><span>) {  
    </span><span>echo</span> 'autload class:', <span>$className</span>, '<br />'<span>;  
}  
</span><span>function</span> classLoader(<span>$className</span><span>) {  
    </span><span>echo</span> 'SPL load class:', <span>$className</span>, '<br />'<span>;  
}  
spl_autoload_register(</span>'classLoader'<span>);  
</span><span>new</span> Test();<span>//</span><span>结果:SPL load class:Test </span>

 

<p><strong>Tip:</strong></p>

函数说明

<pre class="code"><span><strong><code>bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )
</code></strong></span>
  • autoload_function【可选】添加到自动加载栈的函数。默认为spl_autoload()。
    • 还可以调用spl_autoload_register()函数以注册一个回调函数,而不是为函数提供一个字符串名称。如提供一个如array('class','method')这样的数组,使得可以使用某个对象的方法
  • throw【可选】无法成功注册时,是否抛出异常
  • prepend【可选】是否将将该函数添加到队列之首,而不是队列的尾部。
<p><strong>备注:</strong>SPL自动加载功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函数提供的。</p>

三、Phalcon的类自动加载

Phalcon\Loader 通用类加载器(Universal Class Loader),意在根据协议帮助项目自动加载项目中的类(This component helps to load your project classes automatically based on some conventions)。Phalcon支持四种类加载方式,先后顺序分别是注册类名、注册命名空间、注册前缀和注册文件夹的方式。

Phalcon的默认文件后缀为php,当然你自己也可以配置(setExtensions())。

1 . 注册类名

<?<span>php
</span><span>$loader</span> = <span>new</span><span> \Phalcon\Loader();
</span><span>$loader</span>-><span>registerClasses(
    </span><span>array</span><span>(
        </span>"Some"         => "library/OtherComponent/Other/Some.php",
        "Example\Base" => "vendor/example/adapters/Example/BaseClass.php",<span>
    )
);
</span><span>$loader</span>-><span>register();    
</span><span>//</span><span> i.e. library/OtherComponent/Other/Some.php</span>
<span>$some</span> = <span>new</span> Some();

 

<p>具体实现:</p>

2. 注册命名空间

<?<span>php
</span><span>$loader</span> = <span>new</span><span> \Phalcon\Loader();
</span><span>$loader</span>-><span>registerNamespaces(
    </span><span>array</span><span>(
       </span>"Example\Base"    => "vendor/example/base/",
       "Example\Adapter" => "vendor/example/adapter/",
       "Example"         => "vendor/example/",<span>
    )
);
</span><span>$loader</span>-><span>register();
</span><span>//</span><span> vendor/example/adapter/Some.php</span>
<span>$some</span> = <span>new</span> Example\Adapter\Some();

 

使用命名空间或外部库组织代码时,你可以利用注册命名空间的方式来自动加载其包含的库。

对于命名空间对应的路径,要其末尾加一个斜杠。

<p>具体实现:</p>

3. 注册前缀

<?<span>php
</span><span>$loader</span> = <span>new</span><span> \Phalcon\Loader();
</span><span>$loader</span>-><span>registerPrefixes(
    </span><span>array</span><span>(
       </span>"Example_Base"     => "vendor/example/base/",
       "Example_Adapter"  => "vendor/example/adapter/",
       "Example_"         => "vendor/example/",<span>
    )
);    
</span><span>$loader</span>-><span>register();    
</span><span>//</span><span> vendor/example/adapter/Some.php</span>
<span>$some</span> = <span>new</span> Example_Adapter_Some();

 

类似于命名空间,从2.1.0开始phalcon将不再支持前缀。

<p>具体实现:</p>

4. 注册文件夹

<?<span>php
</span><span>$loader</span> = <span>new</span><span> \Phalcon\Loader();    
</span><span>$loader</span>-><span>registerDirs(
    </span><span>array</span><span>(
        </span>"library/MyComponent/",
        "library/OtherComponent/Other/",
        "vendor/example/adapters/",
        "vendor/example/"<span>
    )
);    
</span><span>$loader</span>-><span>register();    
</span><span>//</span><span> i.e. library/OtherComponent/Other/Some.php</span>
<span>$some</span> = <span>new</span> Some();

 

可以自动加载注册目录下的类文件。但是该方法在性能方面并不被推荐,因为Phalcon将在个文件夹下大量查找与类名相同的文件。在使用注册目录自动加载时,要注意注册目录的相关性,即将重要的目录放在前面。

<p>具体实现:</p>

5. 修改当前策略(Modifying current strategies)

即为当前自动加载数据添加额外的值。

<?<span>php
</span><span>//</span><span> Adding more directories</span>
<span>$loader</span>-><span>registerDirs(
    </span><span>array</span><span>(
        </span>"../app/library/",
        "../app/plugins/"<span>
    )</span>,
    <span>true</span><span>
);</span>

 

注册时添加第二个参数值true,使其与原数组合并。

6. 安全层(Security Layer)

没有进行任何安全检查的自动加载器,如下:

<?<span>php
</span><span>//</span><span>Basic autoloader</span>
spl_autoload_register(<span>function</span>(<span>$className</span><span>) {
    </span><span>if</span> (<span>file_exists</span>(<span>$className</span> . '.php'<span>)) {
        </span><span>require</span> <span>$className</span> . '.php'<span>;
    }
});</span>

 

假如我们没有进行任何安全检查时,如果误启了自动加载器,那么恶意准备的字符串就回作为参数访问程序中的重要文件。

<?<span>php

</span><span>//</span><span>This variable is not filtered and comes from an insecure source</span>
<span>$className</span> = '../processes/important-process'<span>;

</span><span>//</span><span>Check if the class exists triggering the auto-loader</span>
<span>if</span> (<span>class_exists</span>(<span>$className</span><span>)) {
    </span><span>//</span><span>...</span>
}

 

Phalcon的做法是删除任何无用的字符串,减少被攻击的可能性。

7. 自动加载事件

在下面的例子中,而不必使用类加载器,使我们获得调试信息的流程操作:

<?<span>php
</span><span>$eventsManager</span> = <span>new</span><span> \Phalcon\Events\Manager();
</span><span>$loader</span> = <span>new</span><span> \Phalcon\Loader();
</span><span>$loader</span>->registerNamespaces(<span>array</span><span>(
       </span>'Example\\Base' => 'vendor/example/base/',
       'Example\\Adapter' => 'vendor/example/adapter/',
       'Example' => 'vendor/example/'<span>
));
</span><span>//</span><span>Listen all the loader events</span>
<span>$eventsManager</span>->attach('loader', <span>function</span>(<span>$event</span>, <span>$loader</span><span>) {
    </span><span>if</span> (<span>$event</span>-><span>getType</span>() == 'beforeCheckPath'<span>) {
        </span><span>echo</span> <span>$loader</span>-><span>getCheckedPath();
    }
});
</span><span>$loader</span>->setEventsManager(<span>$eventsManager</span><span>);
</span><span>$loader</span>->register();

 

Phalcon自动加载支持以下事件:

  • beforeCheckClass,自动加载的过程开始前触发,当返回布尔假可以停止活动操作。
  • pathFound,当一个类装入器定位触发
  • afterCheckClass,自动加载的过程完成后触发。

8. 注意事项(Troubleshooting)

 

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1092699.htmlTechArticlePhalcon自动加载(PHP自动加载),phalcon加载php 自动加载(phalcon\Loader) 转载请注明来源 一、php文件引入 通过 include() 或 require() 函数,可以在PH...
声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
哪些常见问题会导致PHP会话失败?哪些常见问题会导致PHP会话失败?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置错误、Cookie问题和Session过期。1.配置错误:检查并设置正确的session.save_path。2.Cookie问题:确保Cookie设置正确。3.Session过期:调整session.gc_maxlifetime值以延长会话时间。

您如何在PHP中调试与会话相关的问题?您如何在PHP中调试与会话相关的问题?Apr 25, 2025 am 12:12 AM

在PHP中调试会话问题的方法包括:1.检查会话是否正确启动;2.验证会话ID的传递;3.检查会话数据的存储和读取;4.查看服务器配置。通过输出会话ID和数据、查看会话文件内容等方法,可以有效诊断和解决会话相关的问题。

如果session_start()被多次调用会发生什么?如果session_start()被多次调用会发生什么?Apr 25, 2025 am 12:06 AM

多次调用session_start()会导致警告信息和可能的数据覆盖。1)PHP会发出警告,提示session已启动。2)可能导致session数据意外覆盖。3)使用session_status()检查session状态,避免重复调用。

您如何在PHP中配置会话寿命?您如何在PHP中配置会话寿命?Apr 25, 2025 am 12:05 AM

在PHP中配置会话生命周期可以通过设置session.gc_maxlifetime和session.cookie_lifetime来实现。1)session.gc_maxlifetime控制服务器端会话数据的存活时间,2)session.cookie_lifetime控制客户端cookie的生命周期,设置为0时cookie在浏览器关闭时过期。

使用数据库存储会话的优点是什么?使用数据库存储会话的优点是什么?Apr 24, 2025 am 12:16 AM

使用数据库存储会话的主要优势包括持久性、可扩展性和安全性。1.持久性:即使服务器重启,会话数据也能保持不变。2.可扩展性:适用于分布式系统,确保会话数据在多服务器间同步。3.安全性:数据库提供加密存储,保护敏感信息。

您如何在PHP中实现自定义会话处理?您如何在PHP中实现自定义会话处理?Apr 24, 2025 am 12:16 AM

在PHP中实现自定义会话处理可以通过实现SessionHandlerInterface接口来完成。具体步骤包括:1)创建实现SessionHandlerInterface的类,如CustomSessionHandler;2)重写接口中的方法(如open,close,read,write,destroy,gc)来定义会话数据的生命周期和存储方式;3)在PHP脚本中注册自定义会话处理器并启动会话。这样可以将数据存储在MySQL、Redis等介质中,提升性能、安全性和可扩展性。

什么是会话ID?什么是会话ID?Apr 24, 2025 am 12:13 AM

SessionID是网络应用程序中用来跟踪用户会话状态的机制。1.它是一个随机生成的字符串,用于在用户与服务器之间的多次交互中保持用户的身份信息。2.服务器生成并通过cookie或URL参数发送给客户端,帮助在用户的多次请求中识别和关联这些请求。3.生成通常使用随机算法保证唯一性和不可预测性。4.在实际开发中,可以使用内存数据库如Redis来存储session数据,提升性能和安全性。

您如何在无状态环境(例如API)中处理会议?您如何在无状态环境(例如API)中处理会议?Apr 24, 2025 am 12:12 AM

在无状态环境如API中管理会话可以通过使用JWT或cookies来实现。1.JWT适合无状态和可扩展性,但大数据时体积大。2.Cookies更传统且易实现,但需谨慎配置以确保安全性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能