通过php中的Include
s / require_once
进行依赖管理是一件痛苦的事。每隔一段时间我就会改变一些东西和东西,我必须重新思考我在php中初始化第一个include()/ require()的方法。我觉得我错过了一种能够解决我所有问题的更强大的技术,但我似乎还没有找到它。
用mvc自动加载会很好!但对于遗留程序项目,我不认为这是一个帮助吗?
可能和其他人一样,我从相对路径开始。例如require_once('../../../core/core.php');
。不幸的是,当您开始要求具有自己所需依赖项的库时会中断。然后我开始使用动态包含从层次结构中的任何位置解析主项目文件夹:require_once(substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), 'my_project')+8).'core/database/admin.database.connection.php');
这意味着我可以在任何适当的位置通过此权限,并移动它 - 在任何地方该项目,它仍然可以工作!不幸的是,当我实现CI时它崩溃了,CI项目设置了一个项目根目录:/home/rof/bitbucket.org/repo_name/clone/
没有包含特定字符串" my_project"从而打破了所有的包括。因此,在过去一小时左右,我一直在修理包含,但这并不好玩。我想找到一个"最终解决方案"。
目前我一直在将包含更改为:
require_once(realpath(__DIR__.'/../../').'/core/database/admin.database.connection.php');
不幸的是,如果我在一个目录上上下移动一组脚本(比如将用户/订单/移动到管理/订单或所有各种内务处理方法),那将需要再次重写每个单独的脚本。更改 DIR 。' /../../ 39; DIR 。' /../../../ 39;管他呢。它很糟糕,因为它太复杂了,试图重写它的项目或目录范围是可怕的,东西可能会破坏。
具有复杂目录结构的非面向对象,基于过程/函数的php项目的最终解决方案是什么?
这是一个几乎真实的目录结构,这是非常标准的,但只是为了给你一个想法:
core/
- core.php
- environment.php
- database/
- database.php
- admin.database.connection.php
- user.database.connection.php
- public.database.connection.php
www/
- index.php
- contactus.php
- map.php
- ...
- users/
- login.php
- logout.php
- accountdetails.php
- ...
- admin/
- login.php
- logout.php
- index.php
- admin.php
...
- reports/
- revenue_report.php
- orders.php
- clientslist.php
- orders/
- orderslist.php
- orderview.php
...
希望你能得到这个想法,一个带有过程代码,许多复杂脚本和多层数据库访问的旧遗留系统。
答案 0 :(得分:1)
无论程序设计如何,您都必须拥有一些常见文件,例如:带有数据库连接信息的config.php
。
所以你可以在那里设置一些定义:
首先,您的应用程序的基本路径,相对于配置文件...
define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../'); // or whatever
请注意,自PHP 5.3起,您可以使用__DIR__
代替dirname(__FILE__)
然后,您可以为每组文件设置单独的定义。也许:
define('CORE_PATH', APPLICATION_PATH . '/core/');
然后在你的个人脚本中你可以做到
include(CORE_PATH . 'database/admin.database.connection.php');
或者,如果您想对其进行微调,请定义/core/database/
的路径,并执行以下操作: include(CORE_DATABASE_PATH . '/admin.database.connection.php');
如果您移动这些文件夹,则只需更新配置文件即可。
答案 1 :(得分:0)
我现在已经解决了很多这类问题,这是我在所有情况下都非常强烈建议的:尽快通过前端控制器路由所有问题!
在php中,只要你可以设置它,创建一个前端控制器并通过它处理所有脚本是非常有益的。如果您仍然拥有example.php
等旧版脚本,请让您的前端控制器index.php
以白名方式包含它们!所以像mydomain.com/example这样的网址会通过前端控制器进行路由,获取所有基本包含,然后只有包含example.php
脚本才会列入白名单!
其他任何事情只是推迟了统一破碎的代码库的不可避免的问题,这些代码库充满了许多微小的独立脚本。