如何管理这个项目中的 includes、require 和 use
How to manage includes, require and use in this project
在这个没有框架的 PHP 项目中,我有这样的文件夹结构:Adapter、Class 和 Models
php 文件“index.php”是从根执行的,我在处理模型和适配器时遇到问题类
索引文件
<?php
include('Class/Load.php');
$connection = MysqlClass::getConnectionMysql();
Class 加载
<?php
include(__DIR__ . DIRECTORY_SEPARATOR . 'MysqlClass.php');
include(__DIR__ . DIRECTORY_SEPARATOR . 'UtilsClass.php');
include(__DIR__ . DIRECTORY_SEPARATOR . 'EmailClass.php');
MysqlClass文件
<?php
include ('UtilsClass.php');
class MysqlClass
{
/**
* @return PDO
*/
public static function getConnectionMysql(): PDO
{
$dbhost = ReadEnvFileClass::getConfig('MYSQL_LOCAL_HOST');
$dbuser = ReadEnvFileClass::getConfig('MYSQL_LOCAL_USER');
$dbpass = ReadEnvFileClass::getConfig('MYSQL_LOCAL_PWD');
$dbname = ReadEnvFileClass::getConfig('MYSQL_LOCAL_DBNAME');
try {
$dsn = "mysql:host=$dbhost;dbname=$dbname";
$dbh = new PDO($dsn, $dbuser, $dbpass);
} catch (PDOException $e){
var_dump($dbhost,$dbuser,$dbpass);
echo $e->getMessage();
}
return $dbh;
}
}
问题在第二个 MysqlClass 文件中,如果 我应该在此处将文件包含到我需要的不同 类 中,或者我应该在 load.php 文件的 index.php 文件中执行此操作,然后从那里加载项目其余部分所需的所有 类。
使用自动加载器总是一个好主意,例如 Composer 提供的自动加载器。
首先,将Adapter
、Class
和Models
子目录移动到目录src
下。完全删除 Load.php
。
结构将是:
index.php
composer.json
src/Class/MysqlClass.php
src/Class/UtilsClass.php
src/Class/EmailClass.php
src/Adapter/...
src/Models/...
然后在主目录下创建composer.json
文件:
{
"autoload": {
"psr-4": {"Acme\": "src/"}
}
}
在所有 class 文件中,放入正确的命名空间并删除所有 include
和 require
调用:
<?php
namespace Acme/Class
class MysqlClass {
// ...
运行 composer install
或仅 composer dump-autoload
在主目录中,并在 index.php
中包含 autoload.php
文件(删除所有其他包含和要求).
<?php
require __DIR__ . '/vendor/autoload.php';
现在您可以从任何地方调用此代码,class 将在需要时加载:
use Acme/Class/MysqlClass
// ...
$connection = MysqlClass::getConnectionMysql();
在这个没有框架的 PHP 项目中,我有这样的文件夹结构:Adapter、Class 和 Models
php 文件“index.php”是从根执行的,我在处理模型和适配器时遇到问题类
索引文件
<?php
include('Class/Load.php');
$connection = MysqlClass::getConnectionMysql();
Class 加载
<?php
include(__DIR__ . DIRECTORY_SEPARATOR . 'MysqlClass.php');
include(__DIR__ . DIRECTORY_SEPARATOR . 'UtilsClass.php');
include(__DIR__ . DIRECTORY_SEPARATOR . 'EmailClass.php');
MysqlClass文件
<?php
include ('UtilsClass.php');
class MysqlClass
{
/**
* @return PDO
*/
public static function getConnectionMysql(): PDO
{
$dbhost = ReadEnvFileClass::getConfig('MYSQL_LOCAL_HOST');
$dbuser = ReadEnvFileClass::getConfig('MYSQL_LOCAL_USER');
$dbpass = ReadEnvFileClass::getConfig('MYSQL_LOCAL_PWD');
$dbname = ReadEnvFileClass::getConfig('MYSQL_LOCAL_DBNAME');
try {
$dsn = "mysql:host=$dbhost;dbname=$dbname";
$dbh = new PDO($dsn, $dbuser, $dbpass);
} catch (PDOException $e){
var_dump($dbhost,$dbuser,$dbpass);
echo $e->getMessage();
}
return $dbh;
}
}
问题在第二个 MysqlClass 文件中,如果 我应该在此处将文件包含到我需要的不同 类 中,或者我应该在 load.php 文件的 index.php 文件中执行此操作,然后从那里加载项目其余部分所需的所有 类。
使用自动加载器总是一个好主意,例如 Composer 提供的自动加载器。
首先,将Adapter
、Class
和Models
子目录移动到目录src
下。完全删除 Load.php
。
结构将是:
index.php
composer.json
src/Class/MysqlClass.php
src/Class/UtilsClass.php
src/Class/EmailClass.php
src/Adapter/...
src/Models/...
然后在主目录下创建composer.json
文件:
{
"autoload": {
"psr-4": {"Acme\": "src/"}
}
}
在所有 class 文件中,放入正确的命名空间并删除所有 include
和 require
调用:
<?php
namespace Acme/Class
class MysqlClass {
// ...
运行 composer install
或仅 composer dump-autoload
在主目录中,并在 index.php
中包含 autoload.php
文件(删除所有其他包含和要求).
<?php
require __DIR__ . '/vendor/autoload.php';
现在您可以从任何地方调用此代码,class 将在需要时加载:
use Acme/Class/MysqlClass
// ...
$connection = MysqlClass::getConnectionMysql();