文件加载---理解一个project的第一步
当我最开始写php的时候,总是担心这个问题:我在这儿new的一个class能加载到对应的类文件吗?毕竟一运行就报Fatal Error,什么**文件没找到,类无法实例化等等是一种很“低级”的错误,怕别人看了笑话。于是每接一个新任务,我总想把它的加载过程弄清楚(以前只知道几个html标签和样式,不知算不算web开发),有时头儿看了说还有闲心看这个,赶紧写逻辑,照这样做就行了......你妹你知道当然有把握了D:,后来发现原来流程都差不多。
在一个IDE中开发时,如C++/Java,一般是新建一个工程,通过IDE新添加一个文件到指定目录下,然后#include/Import进来即可,php则使这一步骤更加过程化,文件的加载过程基本确定了这个project(框架或者自搭的项目)的目录结构和文件的分门别类。
不管框架还是自搭的项目总得有个入口文件,这时要事先加载一些基本信息,如配置文件、通用方法等,使用的基本是手动直接加载单个文件形式,使用下面四个方法之一:
include、require、include_once、require_once
<span style="color: #0000ff;">include</span>('config.php'<span style="color: #000000;">); </span><span style="color: #0000ff;">require</span>('database.php');
涉及到类文件的加载,少部分是直接加载,比如,通用方法作为静态方法写在一个类Utilities中,因为是后边很多要用到的方法(如错误输出、curl请求、随机字符串生成...),所以用类封装起来,一般也是在加载配置文件时连带加载进来
include('Utilities.php');
而更通用的情况是:类的动态加载。首先不谈的加载的方式,来看看大概什么时候会用到一个类和实例:
1. 最明显的,$obj = new A; 它的变种$className = 'A'; $obj = $className; 都一样;
2. 类的静态方法、静态变量和常量的调用,即Utilities::httpRequest()、Utilities::$instance、Utilities::HOST;
3. 在php函数中,使用了回调函数的情况,最典型的call_user_func_array()(call_user_func),还有其他用到了callback的地方,如数组中的array_walk、array_map,它们需要一个回调函数作为参数。
回调函数非常灵活,不止可以是简单函数,还可以是对象的方法,包括静态类方法。因为可以用对象方法或静态方法,所以这钟时候也要去加载对应的类文件。自php5.3起,回调函数还可以像js中,用匿名函数来实现。
<span style="color: #0000ff;">class</span><span style="color: #000000;"> A{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> cube(<span style="color: #800080;">$var</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">return</span> <span style="color: #008080;">pow</span>(<span style="color: #800080;">$var</span>, 3<span style="color: #000000;">); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> twice(<span style="color: #800080;">$var</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">return</span> 2*<span style="color: #800080;">$var</span><span style="color: #000000;">; } } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用类的静态方法</span> <span style="color: #800080;">$num</span> = <span style="color: #008080;">call_user_func</span>('A::cube', 5<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用对象</span> <span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> A; </span><span style="color: #800080;">$num</span> = <span style="color: #008080;">call_user_func_array</span>(<span style="color: #0000ff;">array</span>(<span style="color: #800080;">$obj</span>, 'twice'), <span style="color: #0000ff;">array</span>(7));
严格来说上例中的call_user_func_array在之前已经实例化了对象,但是存在这么个用法,它完全也可以使用类静态方法。
首先要明白的是,为什么需要动态加载。php是脚本语言,我们访问时,是以脚本为可用资源,比如现在根目录有个index.php文件,它没有include任何其他文件,当我们直接以localhost/index.php来访问时,可以访问到index.php中的全部资源,如果index.php中定义了一个普通类A,在该脚本中实例化一个A的对象时,程序会这样反应:哦,我已经看到了A的定义,可以直接实例化它(不需要加载其他文件)。如果还有类B、C、D等很多类,全部写在index.php中显然不行,那就写在其他文件中,再include进来(include已经在做加载的工作了),这样对程序来说,也是“可见”的了。
但是随着系统功能的增多,类越来越多,各个类的功能也不同,有的直接定义数据库的操作,读取数据库的数据,有的是控制访问脚本时要运行的方法,有的则是将要展现出来的页面,有的是我们引用的第三方核心库,于是,当我们把所有的文件放在一个目录中时,虽然可以直接include加载,但这些文件摆放显得既杂乱无章又难找,维护成本还高。好呗,那就在根目录下再分别建几个目录,目录A专门存放与数据库打交道的脚本,目录B是系统的各种配置信息文件,目录C是控制我们进入程序时的入口控制方法的脚本,目录D是即将展示到浏览器的页面......
于是MVC架构慢慢就演化出来了,我们不能再像以前那样直接include,脚本都放在特定的目录下,如Controller目录下存放的是各种控制器,加载控制器时,我们得这样include('root/Controller/indexController.php'),每次都在文件前面弄一大串的include不仅看着头疼,简直让人累觉不爱。既然有了获取当前文件路径和类名的现成方法,为何不将类名与文件名对应起来,而只要是控制器类的脚本就全放在根目录的Controller子目录下边,就可以写一个方法,只要是控制器类,在这个方法中运行include(ROOT.'Controller/'.$className.'.php');这一句,ROOT为根目录常量,$className为传入的类名,只要是模型类,就这样include(ROOT.'Model/'.$className.'.php');,全凭这个函数来动态控制到哪个目录里边去找,这个project可能就是这样的:
无形中,就建立起了类名和文件名的对应规则,文件和所在的目录的对应规则,该project下有哪些这样的目录和文件呢?啊原来是放控制器的Controller、放配置信息的Config等等,再次于无形中得知了这个project的结构,而上面说的,利用函数根据一定条件(传入参数)可知自动到哪个目录下去加载该文件,而不是一个个写死的include,就是所谓的文件的动态加载了。
因此,当你要新建一个**类文件时,也就知道,哦在这个project中,我应该放在这个目录下,文件的命名应该与类名相同,这样就一定能加载到了~~~接下来就是写业务逻辑的一个“愉快的过程”。
知道什么时候会动态加载及为什么要动态加载后,接下来就是来实现了,也就是上面说到的利用函数来加载某个文件,就是要写好这个“函数”来实现这个过程。常用的有三种方式:
1. __autoload
我第一次学的时候就是用的就是这个,魔术函数,只要定义了php程序就会在要用到一个类时自动调用它进行文件动态加载,一样,既然它是个函数,就要让程序对__autoload的定义可见,不然从哪儿调用它呢?一般来说,作为后边程序大部分地方要用到的方法,我们都会放在一个单独的文件中,在程序的入口处加载进来,一个project总得有几个文件是手动include的,完全可以在开头单独include进来,或者放在配置信息中,加载配置信息时就加载进来了。它的原型:
void __autoload ( string $class )
参数当前加载的类名名称(注意如果有命名空间,则包含命名空间前缀),下面是一个针对上面的图片结构的简单示例:
<span style="color: #008000;">//</span><span style="color: #008000;"> file: autoload.php // ROOT为已经定义的根目录常量</span> <span style="color: #0000ff;">function</span> __autoload(<span style="color: #800080;">$className</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">try</span><span style="color: #000000;">{ </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Controller/'.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 检查Controller</span> <span style="color: #0000ff;">include</span>(ROOT.'Controller/'.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">); } </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Model/'.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 检查Model</span> <span style="color: #0000ff;">include</span>(ROOT.'Model/'.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">); } </span><span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Lib/'.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 检查Lib</span> <span style="color: #0000ff;">include</span>(ROOT.'Lib/'.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">); } </span><span style="color: #0000ff;">else</span>{ <span style="color: #008000;">//</span><span style="color: #008000;"> 找不到该文件</span> <span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> <span style="color: #0000ff;">Exception</span>("ERROR: can't find file {<span style="color: #800080;">$className</span>}.php"<span style="color: #000000;">); } } </span><span style="color: #0000ff;">catch</span>(<span style="color: #0000ff;">Exception</span> <span style="color: #800080;">$e</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">echo</span> <span style="color: #800080;">$e</span>.<span style="color: #000000;">getMessage(); </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">; } }</span>
2. spl_autoload_register
__autoload实际上也差不多了,但它是php定义的,如果现在有个东西写了并调用之后,就告诉程序说,我不用__autoload来加载文件了,我已经定义了一个专门加载文件的方法(比如名称是loadClass),以后需要加载一个类文件时,你就用它吧。spl_autoload_register就是这样一个能告诉程序这样去做的方法,而且自定义加载方法将会更灵活,可以指定多个加载函数,spl_autoload_register函数会将这些函数放在一个队列中,并激活它们,在调用时逐个激活:“If there must be multiple autoload functions, spl_autoload_register() allows for this. It effectively creates a queue of autoload functions, and runs through each of them in the order they are defined. ”,php.net上(http://php.net/manual/en/function.spl-autoload-register.php)也确实如此解释,spl_autoload_unregister则是从加载函数队列中注销。
另外spl_autoload_functions()函数,可以获取我们注册了哪些函数;spl_autoload_call($class)函数,尝试调用所有已注册的加载函数来加载$class的类文件。
对于spl_autoload_register的解释,我的理解是,如果用spl_autoload_register注册了n个函数在加载队列中,因为它自动激活它们嘛,现在我要实例化一个类,在第1个加载函数中加载失败了,然后尝试第2个函数,第二个失败则尝试第3个,''',直到第n个函数走完,若还没加载成功,就报错,只要中间一个加载成功就成功了,but事实好像有点出入。
还是用上一个图片中的目录结构,
1、在Controller目下创建indexController.php文件,包含类indexController;
2、在Model目录下创建userModel.php文件,包含类userModel;
3、首页写个类加载脚本Autoload.php,代码如下:
<span style="color: #008000;">//</span><span style="color: #008000;"> file: Autoload.php</span> <span style="color: #008080;">define</span>('DS',<span style="color: #000000;"> DIRECTORY_SEPARATOR); </span><span style="color: #008080;">define</span>('ROOT', <span style="color: #008080;">rtrim</span>(<span style="color: #008080;">dirname</span>(<span style="color: #ff00ff;">__FILE__</span>), '/\\').<span style="color: #000000;">DS); </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Autoload{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> autoloadRegister(<span style="color: #800080;">$loadFunc</span> = 'Autoload::loadControllerClass', <span style="color: #800080;">$enable</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">$enable</span> ? spl_autoload_register(<span style="color: #800080;">$loadFunc</span>) : spl_autoload_unregister(<span style="color: #800080;">$loadFunc</span><span style="color: #000000;">); } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加载控制器类</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadControllerClass(<span style="color: #800080;">$className</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Controller'.DS.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 检查Controller</span> <span style="color: #0000ff;">include</span>(ROOT.'Controller'.DS.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> ROOT.'Controller'.DS.<span style="color: #800080;">$className</span>.'.php'.'<br>'<span style="color: #000000;">; } </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #0000ff;">echo</span> "ERROR: can't find file {<span style="color: #800080;">$className</span>}.php in ".ROOT."Controller"<span style="color: #000000;">; </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">; } } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加载模型类</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadModelClass(<span style="color: #800080;">$className</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 检查Model</span> <span style="color: #0000ff;">include</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'.'<br>'<span style="color: #000000;">; } </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #0000ff;">echo</span> "ERROR: can't find file {<span style="color: #800080;">$className</span>}.php in ".ROOT."Model"<span style="color: #000000;">; </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">; } } }</span>
4、测试脚本,测试类是否能加载
<span style="color: #008000;">//</span><span style="color: #008000;"> 注册两个加载函数</span> Autoload::autoloadRegister('Autoload::loadControllerClass'<span style="color: #000000;">); Autoload</span>::autoloadRegister('Autoload::loadModelClass'<span style="color: #000000;">);</span><span style="color: #008000;"> // 查看总共注册了哪些加载函数</span> <span style="color: #0000ff;">echo</span> 'register functions=> <pre class="brush:php;toolbar:false">'<span style="color: #000000;">; </span><span style="color: #008080;">print_r</span><span style="color: #000000;">(spl_autoload_functions()); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 分别实例化一个Controller类和Model类</span> <span style="color: #800080;">$indexCon</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> indexController; </span><span style="color: #800080;">$userMod</span> = <span style="color: #0000ff;">new</span> userModel;
结果是这样
这不科学啊,spl_autoload_functions数组显示两个函数都注册了,但是当实例化userModel类时它还是跑到Controller目录中去找,两个类的实例化调用的自动加载方法都是Autoload::loadControllerClass,所以userModel类文件加载报错......注意到spl_autoload_register方法的第三个参数, 是添加一个加载函数时放在栈中的位置,于是我另写一个类似的类otherLoad,只是为了将loadModelClass方法放到队列首部:
<span style="color: #0000ff;">class</span><span style="color: #000000;"> otherLoad{ </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> autoloadRegister(<span style="color: #800080;">$loadFunc</span> = 'otherLoad::loadModelClass', <span style="color: #800080;">$enable</span> = <span style="color: #0000ff;">true</span><span style="color: #000000;">){ </span><span style="color: #008000;">//</span><span style="color: #008000;"> 默认将loadModelClass放在队首</span> <span style="color: #0000ff;">return</span> <span style="color: #800080;">$enable</span> ? spl_autoload_register(<span style="color: #800080;">$loadFunc</span>, <span style="color: #0000ff;">true</span>, <span style="color: #0000ff;">true</span>) : spl_autoload_unregister(<span style="color: #800080;">$loadFunc</span><span style="color: #000000;">); } </span><span style="color: #008000;">//</span><span style="color: #008000;"> 加载模型类</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">function</span> loadModelClass(<span style="color: #800080;">$className</span><span style="color: #000000;">){ </span><span style="color: #0000ff;">if</span>(<span style="color: #008080;">file_exists</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php')){<span style="color: #008000;">//</span><span style="color: #008000;"> 检查Model</span> <span style="color: #0000ff;">include</span>(ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'<span style="color: #000000;">); </span><span style="color: #0000ff;">echo</span> ROOT.'Model'.DS.<span style="color: #800080;">$className</span>.'.php'.'<br>'<span style="color: #000000;">; } </span><span style="color: #0000ff;">else</span><span style="color: #000000;">{ </span><span style="color: #0000ff;">echo</span> "ERROR: can't find file {<span style="color: #800080;">$className</span>}.php in ".ROOT."Model"<span style="color: #000000;">; </span><span style="color: #0000ff;">exit</span><span style="color: #000000;">; } } } </span>
测试是这样
<span style="color: #008000;">//</span><span style="color: #008000;"> 注册三个加载函数</span> Autoload::autoloadRegister('Autoload::loadControllerClass'<span style="color: #000000;">); Autoload</span>::autoloadRegister('Autoload::loadModelClass'<span style="color: #000000;">); otherLoad</span>::autoloadRegister('otherLoad::loadModelClass'<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 查看总共注册了哪些加载函数</span> <span style="color: #0000ff;">echo</span> 'register functions=> <pre class="brush:php;toolbar:false">'<span style="color: #000000;">; </span><span style="color: #008080;">print_r</span><span style="color: #000000;">(spl_autoload_functions()); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 分别实例化一个Controller类和Model类</span> <span style="color: #800080;">$indexCon</span> = <span style="color: #0000ff;">new</span><span style="color: #000000;"> indexController; </span><span style="color: #800080;">$userMod</span> = <span style="color: #0000ff;">new</span> userModel;
这次的结果是这样:
可以看到,这次是在加载indexController类时不成功,因为它只调用了loadModelClass方法,再看看spl_autoload_functions返回的数组,otherLoad类的loadModelClass方法在最前面,难道说,只有在加载函数队列最前面的函数才被用于自动加载,其他无效?这是什么状况?
使用spl_autoload_call('indexController')来“尝试调用所有已注册的函数来装载请求类”,还是报这个错。
翻了下别人的文章,包括github上的博客,也就是列举了下手册上说的“可以一次注册多个加载函数 bala bala......”,难道没有人试过,还是我的理解有问题>3<...>
关于spl_autoload_register还有几个有意思的地方:
1、 一个函数只会加载到函数队列中一次,重复加载也是如此;
2、 spl_autoload_register如果不指定加载函数(第一个参数),则默认使用加载函数spl_autoload(功能类似于__autoload,是它的默认实现形式)
3、 spl_autoload_register指定了__autoload为加载函数,则一定要实现__autoload;
4、 同时实现了spl_autoload_register和__autoload,优先使用spl_autoload_register注册的加载函数。
以上几种情况几乎都可从php.net的note中找到测试例子,老外写得挺有意思,可供参考。上面第2点还需要注意,比如现在在根目录创建一个目录,使用默认函数来加载:
<span style="color: #008000;">//</span><span style="color: #008000;"> 设置加载文件的扩展名,将只加载*.php的文件</span> spl_autoload_extensions('.php'<span style="color: #000000;">); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 默认使用spl_autoload加载文件,只能加载当前目录下文件:小写类名.php</span><span style="color: #000000;"> spl_autoload_register(); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 测试 // $obj = new A;</span>
spl_autoload_extensions设置加载时只认哪些扩展类型的文件,默认是.php或者.inc文件,这里设置成.php,然后就是调用注册函数。在根目录下创建一个A.php文件,新建一个类A,加载成功,再将文件名改成a.php,照样加载成功。需要留意spl_autoload默认将类名转小写,但是A.php照样加载成功,因为Windows的文件是大小写不敏感的(在同一目录下创建一个d.txt,再创建D.txt会认为是同一个文件),对于Mac OS X也是这样,但Linux就是大小写敏感了,测试时要注意这点。
也不是全要自动加载,如CI,它将加载文件封装为一个核心类CI_Loader,程序启动时先include必要的脚本(其他要用的核心类),然后再等需要使用时,CI_Loader实例作为当前控制器类或模型类等的一个属性成员,通过调用它的方法来include各种model(模型)、view(视图)、database(数据库对象)、helper(辅助函数)等等。
无论用不用动态加载,必须保证的是,文件分门别类的放好,文件按一定规则命名,这是一个健壮、高扩展、高易用的project必备的,写起代码来也方便。当然加载文件的多少,占内存的多少,各有不同,也是评判一个框架的若干标准。弄清楚加载方式,熟悉一个框架结构不就是很容易的事了=_=...

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

PHP는 죽지 않았습니다. 1) PHP 커뮤니티는 성능 및 보안 문제를 적극적으로 해결하고 PHP7.x는 성능을 향상시킵니다. 2) PHP는 최신 웹 개발에 적합하며 대규모 웹 사이트에서 널리 사용됩니다. 3) PHP는 배우기 쉽고 서버가 잘 수행되지만 유형 시스템은 정적 언어만큼 엄격하지 않습니다. 4) PHP는 컨텐츠 관리 및 전자 상거래 분야에서 여전히 중요하며 생태계는 계속 발전하고 있습니다. 5) Opcache 및 APC를 통해 성능을 최적화하고 OOP 및 설계 패턴을 사용하여 코드 품질을 향상시킵니다.

PHP와 Python에는 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. 1) PHP는 웹 개발, 배우기 쉽고 풍부한 커뮤니티 리소스에 적합하지만 구문은 현대적이지 않으며 성능과 보안에주의를 기울여야합니다. 2) Python은 간결한 구문과 배우기 쉬운 데이터 과학 및 기계 학습에 적합하지만 실행 속도 및 메모리 관리에는 병목 현상이 있습니다.

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP에서 전처리 문과 PDO를 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 1) PDO를 사용하여 데이터베이스에 연결하고 오류 모드를 설정하십시오. 2) 준비 방법을 통해 전처리 명세서를 작성하고 자리 표시자를 사용하여 데이터를 전달하고 방법을 실행하십시오. 3) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

Dreamweaver Mac版
시각적 웹 개발 도구

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