


What you should know about the correct usage of require() file inclusion in PHP_PHP Tutorial
When I looked at some PHP framework source codes in the past, it was strange that dirname (__FILE__) was used to piece together the file path when the file was included. I didn’t know what the benefits of doing so were, but I finally discovered the reason.
Let’s look at a simple example:
There are three php files a, b, c. a.php is in the root directory of the website, b.php is in the b folder - b/b.php, and c.php is in the c folder - c/c.php. Some confusion? It’s clear when you look at the picture:
Both a.php and b.php include c.php, and finally c.php includes a php file in the d folder - d/d.php.
Let’s take a look at a.php first:
<span 1</span> <?<span php </span><span 2</span> <span 3</span> <span $file_name</span> = 'a.php'<span ; </span><span 4</span> <span 5</span> <span echo</span> "this is a.php"<span ; </span><span 6</span> <span echo</span> "<hr>"<span ; </span><span 7</span> <span 8</span> <span require</span>('c/c.php'<span ); </span><span 9</span> <span 10</span> ?>
This is a very simple code. After printing, it contains c/c.php. Next, we need to look at c/c.php:
<?<span php </span><span $c_file_name</span> = 'c.php'<span ; </span><span echo</span> 'this is c.php, is required by ' . <span $file_name</span><span ; </span><span echo</span> "<hr>"<span ; </span><span require</span>('../d/d.php'<span ); </span>?>
Print output "this is c.php, is required by a.php", $file_name is a variable defined in a.php. At the end, d.php is included. Because the d folder is one layer above the current c.php file, according to common sense, we will write the path as "../d/d.php" as a matter of course. But unfortunately, an error will be reported. The reason is that when you include other files in an included file such as c.php, the path is relative to the outermost parent file, that is, relative to a.php, which can be understood as because you are included by me. , so you have to rely on me. It seems very mysterious, but the principle is actually very simple: you can think of require('c/c.php'); as the code in the c/c.php file, so that our a.php can look like this:
<?<span php </span><span $file_name</span> = 'a.php'<span ; </span><span echo</span> "this is a.php"<span ; </span><span echo</span> "<hr>"<span ; </span><span //</span><span require('c/c.php');</span> <span $c_file_name</span> = 'c.php'<span ; </span><span echo</span> 'this is c.php, is required by ' . <span $file_name</span><span ; </span><span echo</span> "<hr>"<span ; </span><span require</span>('../d/d.php'<span ); </span>?>
At this point, you can see that when we want to include the d/d.php file, is the path just now wrong? Because now we are in the a.php code, we are relative to the a.php file, of course, the path should be require('d/d.php'); We modify the code as follows:
<?<span php </span><span $file_name</span> = 'a.php'<span ; </span><span echo</span> "this is a.php"<span ; </span><span echo</span> "<hr>"<span ; </span><span //</span><span require('c/c.php');</span> <span $c_file_name</span> = 'c.php'<span ; </span><span echo</span> 'this is c.php, is required by ' . <span $file_name</span><span ; </span><span echo</span> "<hr>"<span ; </span><span require</span>('d/d.php'<span ); </span>?>
At this point, you haven’t understood the meaning yet, so you need to look down. Let’s look at b/b.php:
<?<span php </span><span $file_name</span> = 'b.php'<span ; </span><span echo</span> "this is b.php"<span ; </span><span echo</span> "<hr>"<span ; </span><span require</span>('../c/c.php'<span ); </span>?>
No need to explain, there is no problem, but when you replace require('../c/c.php'); with the code in c/c.php, you will find the problem , note that we have just modified the code in c/c.php and changed require('../d/d.php'); to require('d/d.php'); See what is included below Code:
<?<span php </span><span $file_name</span> = 'b.php'<span ; </span><span echo</span> "this is b.php"<span ; </span><span echo</span> "<hr>"<span ; </span><span //</span><span require('../c/c.php');</span> <span $c_file_name</span> = 'c.php'<span ; </span><span echo</span> 'this is c.php, is required by ' . <span $file_name</span><span ; </span><span echo</span> "<hr>"<span ; </span><span require</span>('d/d.php'<span ); </span>?>
So, compared to b/b.php, the path of require('d/d.php'); is wrong, it should be require('../d/d.php');. You go back and modify the require path in c/c.php, but it’s wrong. After you modify it, b/b.php can run normally, but a/a.php can’t. Is it true that they share c/c? .php, it affects the whole body, what should I do?
At this time, we return to the dirname(__FILE__) mentioned at the beginning of the article. This is a good thing and can completely solve the above problems. Using it, you don't need to worry about which file contains your file and which path it is under. You don't need to worry about the level of the parent file, because dirname(__FILE__) can specify the path relative to the current file. In other words, we need to change the require path in our c/c.php to:
<?<span php </span><span $c_file_name</span> = 'c.php'<span ; </span><span echo</span> 'this is c.php, is required by ' . <span $file_name</span><span ; </span><span echo</span> "<hr>"<span ; </span><span require</span>(<span dirname</span>(<span __FILE__</span>) . '/../d/d.php'<span ); </span>?>
Here, we only need to use c/c.php as a reference. Compared to it, d/d.php is at the upper level. In this way, there is only one standard, and that is, I shall prevail. Whether you include me or he includes me, I only use myself as the criterion, and the files I want to include are only relative to myself.
For fellow practitioners who don’t understand dirname(__FILE__), please google it, it’s very simple.
Okay, this ends the PHP technology sharing. If you have any questions or errors, please leave a message. By the way, this is my first standard technical blog post. The first article is hydrology, the second article is quasi-technical, and today I finally wrote a technical article, Ou Ye.

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

The combination of Vue.js and ASP.NET provides tips and suggestions for performance optimization and expansion of web applications. With the rapid development of web applications, performance optimization has become an indispensable and important task for developers. As a popular front-end framework, Vue.js combined with ASP.NET can help us achieve better performance optimization and expansion. This article will introduce some tips and suggestions, and provide some code examples. 1. Reduce HTTP requests The number of HTTP requests directly affects the loading speed of web applications. pass

How to correctly use and optimize the MySQL connection pool in ASP.NET programs? Introduction: MySQL is a widely used database management system that features high performance, reliability, and ease of use. In ASP.NET development, using MySQL database for data storage is a common requirement. In order to improve the efficiency and performance of database connections, we need to correctly use and optimize the MySQL connection pool. This article will introduce how to correctly use and optimize the MySQL connection pool in ASP.NET programs.

Translator | Reviewed by Chen Jun | Chonglou In the 1990s, when people mentioned software programming, it usually meant choosing an editor, checking the code into the CVS or SVN code base, and then compiling the code into an executable file. Corresponding integrated development environments (IDEs) such as Eclipse and Visual Studio can integrate programming, development, documentation, construction, testing, deployment and other steps into a complete software development life cycle (SDLC), thus improving the work of developers. efficiency. In recent years, popular cloud computing and DevSecOps automation tools have improved developers' comprehensive capabilities, making it easier for more enterprises to develop, deploy and maintain software applications. Today, generative AI is the next generation development

How to reconnect to MySQL in ASP.NET program? In ASP.NET development, it is very common to use the MySQL database. However, due to network or database server reasons, the database connection may sometimes be interrupted or time out. In this case, in order to ensure the stability and reliability of the program, we need to re-establish the connection after the connection is disconnected. This article will introduce how to reconnect MySQL connections in ASP.NET programs. To reference the necessary namespaces first, reference them at the head of the code file

The combination of Vue.js and ASP.NET enables the development and deployment of enterprise-level applications. In today's rapidly developing Internet technology field, the development and deployment of enterprise-level applications has become more and more important. Vue.js and ASP.NET are two technologies widely used in front-end and back-end development. Combining them can bring many advantages to the development and deployment of enterprise-level applications. This article will introduce how to use Vue.js and ASP.NET to develop and deploy enterprise-level applications through code examples. First, we need to install

How to correctly configure and use MySQL connection pool in ASP.NET program? With the development of the Internet and the increase in data volume, the demand for database access and connections is also increasing. In order to improve the performance and stability of the database, connection pooling has become an essential technology. This article mainly introduces how to correctly configure and use the MySQL connection pool in ASP.NET programs to improve the efficiency and response speed of the database. 1. The concept and function of connection pooling. Connection pooling is a technology that reuses database connections. At the beginning of the program,

The built-in objects in ASP.NET include "Request", "Response", "Session", "Server", "Application", "HttpContext", "Cache", "Trace", "Cookie" and "Server.MapPath": 1. Request, indicating the HTTP request issued by the client; 2. Response: indicating the HTTP response returned by the web server to the client, etc.

Overview of the recommended configuration for using Visual Studio for ASP.NET development on Linux: With the development of open source software and the popularity of the Linux operating system, more and more developers are beginning to develop ASP.NET on Linux. As a powerful development tool, Visual Studio has always occupied a dominant position on the Windows platform. This article will introduce how to configure VisualStudio for ASP.NE on Linux
