Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 理解课程的要求和存在_Php - Fatal编程技术网

Php 理解课程的要求和存在

Php 理解课程的要求和存在,php,Php,我下载了一个框架和代码,我有一个关于require和includevsclass\u存在的问题 在我下载的代码中,我看到: require_once('class.php'); 以及: if(class_exists('class') == false) { require('class.php'); } 我得到require\u一次意味着只有一次并且类存在检查类是否存在 我的问题是:第二个比第一个好吗?为什么呢?第二种方法可以提供更多的保护,避免两次导入类。第一个类导入一次类文件,但如果

我下载了一个框架和代码,我有一个关于
require
include
vs
class\u存在的问题

在我下载的代码中,我看到:

require_once('class.php');
以及:

if(class_exists('class') == false) {  require('class.php'); }
我得到
require\u一次
意味着只有一次并且类存在检查类是否存在


我的问题是:第二个比第一个好吗?为什么呢?

第二种方法可以提供更多的保护,避免两次导入类。第一个类导入一次类文件,但如果由于某种原因从另一个文件导入了该类,第二个类将发现该类已在前面声明,并且不需要该类文件。

  • require_once()
    包含一次文件

  • class\u exists()
    检查您的类是否存在


您可以在多个文件中定义一个类,
require\u once()
不会在意。你的第二块将是。

正如在其他答案中所讨论的,这两个变体之间存在语义差异。同样,在共享托管场景中,托管提供商不提供PHP操作码缓存(APC或等效),所有代码文件都需要在每个请求中读取和编译一次。这里的主要杀手不是编译时本身(现代内核上约0.5M PHP语句/秒),而是收集PHP文件的I/O开销(如果不预先缓存在文件系统缓存中)(10秒的I/O/秒)

在这种情况下,如果一个应用程序需要一个核心,比如说一打模块来处理90%的查询,那么将这些模块的捆绑缓存到一个bulkload文件中是有意义的。如果采用这种类型的解决方案,则在类文件的要求周围放置一个
class\u exists('class')
防护装置,使其具有防弹性

还有一个警告:如果使用
\u autoload()
函数进行JiT类加载,请注意
class\u存在('fred')
将触发自动加载
fred
。如果需要弱探测,则需要使用谓词
!在数组中('fred',获取声明的类())

此条件:

if(class_exists('class') == false) {  require('class.php'); }
防止调用
require_once


require\u once
如果项目中包含大量文件(特别是框架),则速度可能会很慢,因为他们必须扫描代码以确保文件不会包含两次或更多次。因此,如果您包含的文件超过25个,并且它们都是嵌套的,则必须一次性检查所有文件。

事实上,这是一个非常有趣的前景,我很惊讶我以前从未见过第二种用法。值得一提的是,现在有更好的方法,我猜这里每个文件都代表一个且仅代表一个类?每个文件没有多个类?注意:两个同名的类几乎总是一个坏主意,所以除非你做了一些疯狂的事情,
require\u once
应该可以。