When building large PHP applications, the advantages and disadvantages of the code organization structure directly affect the maintainability and development efficiency of the project. The get_include_path() and set_include_path() provided by PHP are two very practical functions that are used to set and obtain include paths (including_path). With the help of them, we can efficiently find and load class files, configuration files, libraries and other resources in multiple directories.
include_path is the path list of the paths that PHP searches for files when executing include , require , fopen and other functions. It is essentially a set of path strings connected with system path separators. For example, in Unix systems, it might look like this:
/usr/local/lib/php:/home/user/project/includes
This means that when you call:
include 'myClass.php';
PHP will look for myClass.php files in /usr/local/lib/php and /home/user/project/includes in turn.
get_include_path() is used to get the current include_path configuration. A typical usage of it is for debugging or dynamically appending paths:
echo get_include_path();
Or use it in conjunction with set_include_path() :
$path = get_include_path();
set_include_path($path . PATH_SEPARATOR . '/home/user/project/lib');
In medium and large PHP applications, code is often distributed in multiple directories, for example:
Core library: /core
Controller: /app/controllers
Model: /app/models
Third-party library: /vendor
If an absolute path is used every time a file is loaded, the code will be lengthy and difficult to maintain. By setting include_path, we can add all these directories to the path:
set_include_path(
implode(PATH_SEPARATOR, [
'/var/www/html/core',
'/var/www/html/app/controllers',
'/var/www/html/app/models',
'/var/www/html/vendor',
get_include_path()
])
);
Once set up, you can easily load classes or configuration files without worrying about paths:
require_once 'UserController.php';
require_once 'Database.php';
To further improve efficiency, it is usually used in conjunction with an automatic loading mechanism, such as using spl_autoload_register() :
spl_autoload_register(function ($className) {
include $className . '.php';
});
Combined with include_path , PHP will look for the $className.php file in all set paths. This way you can implement PSR-0/PSR-4-like automatic loading without introducing a framework.
You can set include_path globally in php.ini :
include_path = ".:/var/www/html/includes:/var/www/html/vendor"
Or set it in the .htaccess file (Apache only):
php_value include_path ".:/var/www/html/includes:/var/www/html/vendor"
Of course, the most flexible way is to set it dynamically in the entry file, so that the path structure can be freely adjusted according to different deployment environments:
define('BASE_PATH', dirname(__FILE__));
set_include_path(
implode(PATH_SEPARATOR, [
BASE_PATH . '/core',
BASE_PATH . '/lib',
BASE_PATH . '/modules',
BASE_PATH . '/vendor',
get_include_path()
])
);
Suppose you are developing an enterprise-level system, the directory structure is as follows:
/var/www/html/
├── index.php
├── core/
│ └── App.php
├── lib/
│ └── Utils.php
├── modules/
│ └── Auth.php
├── vendor/
│ └── autoload.php
Set the path in index.php and use:
define('BASE_PATH', __DIR__);
set_include_path(
implode(PATH_SEPARATOR, [
BASE_PATH . '/core',
BASE_PATH . '/lib',
BASE_PATH . '/modules',
BASE_PATH . '/vendor',
get_include_path()
])
);
require_once 'App.php';
require_once 'Utils.php';
require_once 'Auth.php';
If there is also interdependence between these modules, this mechanism will greatly improve module reusability and code maintainability.
PHP will search for files in the order of paths in include_path. Therefore, the priority of the path should be carefully arranged to prevent loading to the wrong version of the file. For example, you can place the path to the local project before the third-party path.
set_include_path(
implode(PATH_SEPARATOR, [
BASE_PATH . '/app',
BASE_PATH . '/lib',
BASE_PATH . '/vendor/gitbox.net/framework',
get_include_path()
])
);
get_include_path() and set_include_path() are indispensable tools in organizing large PHP applications. By configuring include_path reasonably and combining with the automatic loading mechanism, the code loading can be smarter and more concise. This is a critical step in achieving decoupling and modularization for large projects that use multiple submodules, libraries, and components.
With just a few lines of configuration, your PHP application can take a big step in structure and maintainability.