PHP-OOP数据库设计

PHP-OOP数据库设计,php,mysql,oop,mysqli,Php,Mysql,Oop,Mysqli,好的,这只是一个简单的问题,我可能会对此有些懈怠,但我只是在寻找一些指导,因为我完全是自学成才的。我做了大量的阅读和构建工作——我要说的是,我正进入php、mysql和web知识的一个不错的中间阶段——绝不是高级或过于自信——仍在学习 我真的在尝试用PHP处理OOP,所以我想为MySQL创建一个好的精益数据库包装器,只是MySQL,我对MySQL最满意,我不认为有任何理由使用任何其他数据库。我不想在设计中创造任何形式的可移植性——我希望它特定于我的数据库;所以我不想使用PDO 因此,我在开始时遇

好的,这只是一个简单的问题,我可能会对此有些懈怠,但我只是在寻找一些指导,因为我完全是自学成才的。我做了大量的阅读和构建工作——我要说的是,我正进入php、mysql和web知识的一个不错的中间阶段——绝不是高级或过于自信——仍在学习

我真的在尝试用PHP处理OOP,所以我想为MySQL创建一个好的精益数据库包装器,只是MySQL,我对MySQL最满意,我不认为有任何理由使用任何其他数据库。我不想在设计中创造任何形式的可移植性——我希望它特定于我的数据库;所以我不想使用PDO

因此,我在开始时遇到的问题是,我是否应该创建一个扩展mysqli的类,然后为我的数据库表创建一个扩展该基本数据库类的模型类?那么class->child=mysqli->DbBase->UsersModel?这需要在类中使用大量的$This语句,不是吗


或者我应该实例化一个mysqli类并将其传递给DbBase

类代表了现实世界中的事物(甚至是想象中的“事物”),对吗?数据库实例表示与该数据库的连接。模型与数据库连接有共同之处吗?不是真的。我建议在您将要编写的模型类中包含数据库类的实例,因为模型使用数据库连接来访问其数据,但不是一种数据库连接

关于Mysqli数据库类:这实际上取决于您试图用该数据库类实现什么——它是否用一些额外的函数或任何东西扩展了Mysqli?如果没有,请不要在那里使用继承,否则您可以使用它


这是一个非常基本的示例,只是想告诉您:(它实际上是ActiveRecord模式的简化版,但绝对不是完整版)

用法:

// Make a new connection to the database
$db = new DbClass('...'); // or whatever you name that class...

// Set this connection to be the default connection
DbTable::setDefaultDbAdapter($db);

// Create a new user
$users = new Users();
$user = new User($users);
$user->email = 'test@example.com';
$user->save();

如果您打算使用OOP,我强烈建议您使用PDO,因为它是MySQL库中更新最快、面向对象的实现。我不认为PDO MySQL比MySQL更不特定于MySQL

在任何情况下,都不应该扩展PHP的类。在这种情况下,应该将具有数据库连接的对象作为类的属性


您还应该研究单例设计模式,它在这些情况下非常有用。看看今天的这篇文章:

如果你真的想学习和理解OOP,那么我认为你应该开始学习一些PHP框架(比如Zend框架)并阅读它的源代码。我从他们那里学到了很多东西。

我强烈建议你不要使用
mysqli
。与PDO相比,它的接口有很多丑陋的缺点,PDO是PHP上的标准现代db API。好的,谢谢,听起来不错,但是,正确的做法是-->在DbBase或model类之外实例化数据库对象,然后将其传递给_构造之类的函数,然后将其保存为属性,或者在_构造内部初始化为属性。有什么区别吗?这取决于您如何设计应用程序,但我认为最好在构造函数中实例化数据库对象。特别是如果你想独身。然后,您可以在任何地方获得数据库连接的实例,而无需处理数据库登录信息等。好的,非常感谢,我还在《专业PHP设计模式》一书中找到了一个很好的部分。我有在线的safari书籍,所以如果其他人有,它就在这里:是的,这对我很有帮助,我目前正在查看所有的Yii基类,并试图学习Yii。谢谢你的回答,我认为这是我迄今为止寻找的“最”的,但我没有遵循你的模式方法。在一个从数据访问对象扩展而来的类中对一个表进行建模难道没有意义吗?在数据访问对象中,可以很容易地使用->save()等方法,这确实有意义。但是table类表示一个表,这也不同于数据库连接,因为它使用一个表来访问其数据,但实际上并不是它的一种类型。我强烈建议大家看看Zend_框架组件Zend_Db和Zend_Db_表。我要给我的答案加上一个例子,我将如何处理这个问题!
// Make a new connection to the database
$db = new DbClass('...'); // or whatever you name that class...

// Set this connection to be the default connection
DbTable::setDefaultDbAdapter($db);

// Create a new user
$users = new Users();
$user = new User($users);
$user->email = 'test@example.com';
$user->save();