我被告知将MySQL
代码与PHP
代码分开是一种常见做法,这是真的吗?这是一个新的编码标准吗?这样做有什么好处吗?
在为群众写作时,有人可以指导我最好的编码实践(PHP/MySQL
)吗(例如开源脚本)。
谢谢!
答案 0 :(得分:5)
好问题!
在Java世界中有MyBatis SqlMapper。这是非常常用的,如果你是Java程序员,这就是你想要的。
但在PHP中,很难找到像MyBatis这样的东西,我发现的唯一内容是PRADO
http://www.pradosoft.com/
ORM =对象关系图。 http://en.wikipedia.org/wiki/Object-relational_mapping 这也是使用的。但我不知道有PHP的ORM框架。如果有人知道,请告诉我。 @jszobody建议 http://www.doctrine-project.org/projects/orm.html(谢谢)
感谢。
答案 1 :(得分:2)
我被告知将MySQL代码与...分开是一种常见的做法 PHP代码,这是真的吗?
我认为,您正在谈论Loose coupling,将您的应用程序逻辑分开(构建一个良好的架构),这样您就可以保持组织有序,可维护。实际上,这是一个过于广泛的讨论,我可能无法正确描述所有内容,只能回答你的问题,是,这是一个很好的(推荐的)实践和软件开发的设计原则。
在应用程序中,最重要的部分是域/业务逻辑,它为应用程序提供服务,应该与其他逻辑分开,例如表示逻辑(UI
)。例如,如果您的应用程序处理用户,产品的创建,那么您可以将它们保存在一个单独的位置,每个位置作为应用程序的实体。例如
用户管理
class User {
public function createUser()
{
// ...
}
}
产品管理
class Product {
public function addProduct()
{
// ...
}
}
这是您的业务逻辑,您可以从单独的类/地点(如
)使用/调用这些逻辑$user = new User;
$user->create();
现在,想想数据存储机制,如果你创建一个新用户,你可能需要将所有信息放在一个地方,它可能是一个数据库,一个平面文件或者应该是一个xml文件,所以,应该是什么在createUser()
函数中,您应该在数据存储和业务逻辑之间使用数据访问层,这意味着,无论您使用何种数据存储,都不应在createUser()
函数中使用任何代码(业务逻辑),而不是通过另一层(DAL)访问数据存储,例如,您的createUser()
函数可能看起来像这样
class User {
protected $storage = null;
public function __construct($storage)
{
$this->storage = $storage;
}
public function createUser()
{
$userData = $_POST['first_name'];
$userData = $_POST['user_name'];
// more fields...
// data validation
$this->storage->save($userData);
}
}
现在,要创建用户并将其保存在数据库中,您可以像
一样使用它$storage = new DbStorage();
$user = new User($storage);
也许,您想使用平面文件来存储数据而不是数据库,没问题,只需更改数据存储,即
$storage = new FileStorage();
$user = new User($storage);
现在,看看差异,你的保存方法不知道存储机制,只是调用storage->save()
,每个存储都有自己的保存机制,事情有条理,干净,易于维护,更改存储机制,而不对代码进行任何更改。所以,就像
业务逻辑 - >数据访问层 - >数据存储
在数据访问层,你应该根据你的存储机制编写代码,如果你有一个数据库作为存储,那么你根据它编写代码,在这种情况下,你的DbStorage
可能拥有它自己的{ {1}}(不同数据库的不同驱动程序,即abstract database layer
,mysql
等),此处oracle
正在运行。
因此,主要的是保留ORM
,这有助于您构建一个干净且可维护的应用程序。这只是一个小小的想法。这些链接可以帮助您
更新:我想我应该补充一点关于数据库抽象层的例子
因此,当您使用数据库存储机制时,可以使用
loosely coupled
但是,此$storage = new DbStorage();
$user = new User($storage);
应包含不同类型数据库的另一个图层,即DbStorage
,myaql
等。在这种情况下,您的oracle
可能如下所示< / p>
DbStorage
要使用它,您可以使用这样的代码
class DbStorage{
protected $db = null;
public function __construct($database)
{
$this->db = $database;
}
public function save($data)
{
$this->db->insert($data);
}
}
或者对于其他数据库引擎,您可以使用
$config = array('hostname' =>'localhost', 'username'=>'root', 'password'=>'123456', 'database'=>'myDatabase');
$storage = new DbStorage(new MySqlDriver($config));
$user = new User($storage);
现在,您的不同数据库驱动程序可能看起来像这样
$config = array('hostname', 'username', 'password');
$storage = new DbStorage(new OracleDriver($config));
$user = new User($storage);
对于class MySqlDriver(){
public $connection;
public $database;
public function __construct($config)
{
$this->connection = mysql_connect($config['hostname'], $config['username'], $config['password'], $config['database']);
mysql_select_db($db);
}
public function insert($data)
{
// code for insert (mysql)
}
}
,您可以将另一个班级设为oracle
OracleDriver
这只是数据库抽象层的一个概念,在大多数情况下,每个数据库(class OracleDriver(){
// ...
public function __construct($config)
{
// ...
}
public function insert($data)
{
// code for insert (oracle)
}
}
,MySqlDriver
)的配置可能包含在配置文件中,即OracleDriver
,我的包含数组如
database.php
这只是一个粗略的想法,您可以在网上找到更好的示例,并且有很多开源库可以在实时项目中使用。
答案 2 :(得分:0)
是的,这是许多编程语言的标准。通常,您会编写存储过程并让您的PHP代码利用这些来执行数据库工作。这种分离使您可以更轻松地管理代码库,并有助于维护和扩展。
答案 3 :(得分:0)
不要太过于字面意思 因为没有办法遵循它。
如您所见,没有人为您提供示例脚本。这个网站存在很大问题。我称之为太多的知识。缺乏练习。
所以,它不能用作经验法则。使用存储过程,您可以在其中执行单个基于主键的查找,这只是一种过度杀伤力。并且ORM无法为您创建任何复杂的查询。所以,它比“编码标准”更符合善意。
然而,是您可以轻松遵循的经验法则:永远不要让您的SQL和 HTML 在同一个文件中相遇。这一个很容易理解,而且更多实用,因为你必须比数据库后端更频繁地改变外观。