Home >Backend Development >PHP Tutorial >Please leave the include_once and require_once_PHP tutorials

Please leave the include_once and require_once_PHP tutorials

WBOY
WBOYOriginal
2016-07-21 15:00:53707browse

It is true that this reason is correct, but what I want to talk about today is another reason.
We know that to determine whether a file is loaded, PHP needs to get the open_path of the file, meaning That is, for example:

Copy code The code is as follows:

set_include_path("/tmp/ :/tmp2/");
include_once("2.php");
?>

When PHP sees include_once "2.php", it does not Knowing what the actual path of this file is, it is impossible to judge whether it has been loaded from the loaded file list, so in the implementation of include_once, it will first try to parse the real path of this file (for ordinary files, this parsing is just like checking getcwd and file path, so if it is a relative path, it will generally not succeed). If the parsing is successful, search for EG (include_files). If it exists, it means it has been included and return. Otherwise, open the file to get the opened_path of the file. . For example, in the above example, this file exists in "/tmp2/2.php".

Then, after getting the opened_path, PHP goes to the loaded file list to find whether it is included. If not, , then just compile directly, no need to open file anymore.

1. Try to parse the absolute path of the file. If the parsing is successful, check EG (included_files). If it exists, return it. If it does not exist, continue
2. Open the file and get the open path of the file
3. Take the open path and search it in EG (included_files) to see if it exists. If it exists, return it. If it does not exist, continue
4. Compile file (compile_file)

In most cases, this is not a problem, but the problem lies when you use APC...

When using APC, APC hijacks the pointer of the compile_file file and directly reads it from the cache Get the compilation result in, avoid opening the actual file, and avoid the system call to open.

However, when you use include_once in the code, PHP has already tried to open the file before compile_file , and then enter the compile file hijacked by APC, which will generate an additional open operation. To solve this problem, APC introduced include_once_override. When include_once_override is turned on, APC will hijack PHP. ZEND_INCLUDE_OR_EVAL opcode handler, determine the absolute path of the file through stat, and then if it is found that it is not loaded, rewrite the opcode to include and make a tricky solution.

But, it is a pity, as I said, APC include_once_override has not been implemented well, and there will be some undefined problems, such as:

Copy code The code is as follows:

< ;?php
set_include_path("/tmp");
function a($arg = array()) {
include_once("b.php");
}

a();
a();
?>

Then, our b.php is placed in "/tmp/b.php" with the following content:
Copy code The code is as follows:

class B {}
?>

Then when apc.include_once_override is turned on, continuous access will get the following error:
Fatal error - include(): Cannot redeclare class

Excluding these technical factors, I have always believed that we should use include instead of include_once, because we can completely plan by ourselves and a file will only be loaded once. We can also use automatic loading to do this.

If you use include_once, it only proves that you have no confidence in your code.
So, I suggest everyone not to use include_once

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/328035.htmlTechArticleAdmittedly, this reason is right, but what I want to talk about today is another reason. We know , to determine whether a file has been loaded in PHP, you need to get the open_pat of the file...
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn