我不时会看到有关连接数据库的问题.
大多数答案不是我这样做的方式,或者我可能没有正确得到答案.无论如何; 我从来没有想过这个,因为我这样做对我有用.
但这是一个疯狂的想法; 也许我这样做是错的,如果是这样的话; 我真的想知道如何使用PHP和PDO正确连接到MySQL数据库并使其易于访问.
我是这样做的:
首先,这是我的文件结构(剥离):
public_html/
* index.php
* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php
Run Code Online (Sandbox Code Playgroud)
index.php
在最顶端,我有require('initialize/load.initialize.php');.
load.initialize.php
# site configurations
require('configure.php');
# connect to database
require('root/somewhere/connect.php'); // this file is placed outside of public_html for better security.
# include classes
foreach (glob('assets/classes/*.class.php') as $class_filename){
include($class_filename);
}
# include functions
foreach (glob('assets/functions/*.func.php') as $func_filename){
include($func_filename);
}
# handle sessions
require('sessions.php');
Run Code Online (Sandbox Code Playgroud)
我知道有更好或更正确的方法来包含类,但不记得它是什么.还没有时间去研究它,但我认为这是有道理的autoload.类似的东西......
configure.php
这里我基本上只是覆盖一些php.ini -properties并为该站点做一些其他的全局配置
connect.php
我把连接放到一个类上,所以其他类可以扩展这个...
class …Run Code Online (Sandbox Code Playgroud) 注释如何在PHP中有用?我并不是指一般的PHPDoc.
我想,我只想要一个真实世界的例子.
因此,根据@ Max的回答:注释与Abstract Factories完成相同的事情,只通过一行专门的PHPDoc. - hopeseekr 0秒前编辑
这个问题在清除我对此事的困惑方面做得非常好,但我很难找到关于服务层的确切限制应该是什么的可靠来源.
对于这个例子,假设我们正在处理书籍,我们希望通过作者获得书籍.本BookDataMapper可以有一个通用的get()接受条件(S),如书的唯一标识符,作者姓名等这个实现是相当微不足道的(逻辑)方法,但如果我们希望有需要更复杂的查询多个条件是什么?
让我们说我们希望得到某位作者在特定出版商下撰写的所有书籍.我们可以扩展BookDataMapper->get()方法来解析多个条件,或者我们可以编写一个新的方法,如BookDataMapper->getByAuthorAndPublisher().
是否最好让服务层直接调用这些[更具体]的方法,或者在调用BookDataMapper->get()多个条件传递的更通用方法之前解析条件?在后一种情况下,服务层将执行更多逻辑"繁重的工作",使数据映射器相当简单.前一个选项会将服务层几乎完全缩减为中间人,将条件逻辑留给数据映射器等方法BookDataMapper->getByAuthorAndPublisher().
让服务层解析条件的一个明显问题是某些域逻辑泄漏出数据映射器.(这在此处的链接问题中进行了解释.但是,如果服务层要处理条件,则逻辑不会使其脱离模型层;控制器将无论如何调用$book_service->getByAuthorAndPublisher().
我正在使用PHP构建自定义MVC框架.我的问题是当我想通过控制器类访问任何模型类时.我看到这样做的一种方法是通过使用魔术方法(如get和set)的注册表设计模式,尽管PHP get和set被一些人认为是不好的做法.我已经读过通过容器完成的依赖注入,但是我不能看到它有效地工作,因为容器必须调用模型,否则它必须包含会破坏MVC目的并创建大型超类的模型.单身人士被视为不良做法.我提到的方法是否有任何解决方案或改进.这可能只是我对PHP需求改进的理解和了解.
目前我有这个:router.php(通过GET变量加载控制器
<?php
class router {
function __construct() {
if (file_exists("controller/".$_GET['url']."Controller.php")) {
function __autoload($controller) {
$controlinclude = "controller/".$controller.".php";
include $controlinclude;
}
$control = $_GET['url']."Controller";
new $control();
}
else {
// throw exception
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
希望这样做