长时间阅读和测试,但我想知道。这是不是正确的PHP OOP代码
Class User {
function Add($Name, $Password){
$sql_str = "INSERT INTO User SET Name = '$Name', Password = '$Password'";
$sql->do_sql($sql_str);
}
function Del($UserID) {
$sql_str = "DELETE FROM User WHERE UserID = '$UserID'";
$sql->do_sql($sql_str);
}
function Show ($Limit)
if ($limit > 0){
$sql_str = "SELECT * FROM User ORDER BY Name LIMIT $Limit";
}else{
$sql_str = "SELECT * FROM User ORDER BY Name";
}
$result = $sql->do_sql($sql_str);
for ($i = 0; $i < COUNT($result); $i++){
$data[$i]['UserID'] = ....
$data[$i]['Name'] = ....
}
return $Data
}
}
$MyUser = new User;现在,我可以从文件userControl.php控制这些操作。如果我想做一些事情,我可以将操作发送到user类的实例:$MyUser->Add($Name, $Password);这种方法更像是分组函数而不是OOP,还是使用setter和getter更好?
如果这个例子不是面向对象的,那么我做错了什么,需要如何做这个例子的面向对象的方式?
Tnx
发布于 2009-10-24 05:03:12
你这样做是不对的。您真正想要做的是创建一个表示单个用户的user类,并使用反映这一点的方法。
来自维基百科:
在面向对象编程中,方法是唯一地与类(在这种情况下称为类方法或静态方法)或与对象(在这种情况下是实例方法)关联的子例程。
用户对象至少应该有实例方法,使其能够:
和一个静态方法:-创建一个用户并返回一个用户对象。
它还应该有一个构造函数方法( PHP5中的__construct(Args)或PHP4中的User(args) ),以便在创建用户时调用。这可能需要接受id、用户名或其他标识,这样才能加载正确的用户。
为了简单起见,而不是只为您做所有事情,假设有一个只有id和名称的user对象。下面是这个类可能的样子:
假设PHP5:
class User{
private $id;
public $name;
public function __construct($id){
$this->load($id);
}
public function load($id){
// Do a query to load a user and initialize $id and $name.
}
public function save(){
// Do a query saving $this->id and $this->name to the database.
}
public static function create($name){
// Do a query to create a user with name $name.
}
}您可以使用new User($id)加载给定id的用户,或者创建一个给定的User::create($name)
冒着被比喻为十字架的风险,我不会费心在PHP中使用setter和getter。
发布于 2009-10-24 05:16:05
$MyUser->Add($Name, $Password);看起来很奇怪。尝试如下所示:
class UserManager {
public function add(User $user) {
$sql->do_sql("INSERT INTO users (id, name) VALUES (".$user->getId().", ".$user->getName().")");
}
public function delete(User $user) {
$sql->do_sql("DELETE FROM users WHERE id = ".$user->getId()." LIMIT 1");
}
public function show(User $user) {
return $sql->do_sql("SELECT * FROM users WHERE id = ".$user->getId());
}
}和
class User {
private $_id;
private $_name;
public function getId(){
return $this->_id;
}
public function getName(){
return $this->_name;
}
}一种可能适合的设计模式是Active Record。
发布于 2009-10-24 04:49:37
从技术上讲是这样的,但是你要么遗漏了很多代码,要么你的方法不能工作。您似乎没有定义$sql anywhere。由于oop的美妙之处在于消除了重复代码,而且您在所有方法中都使用了$sql,因此很高兴看到您是如何处理这一问题的。如果没有完整的、有效的代码,就很难提供建议。
这里有一个简短的例子来说明我的意思。由于您没有使用PHP5的任何oop特性,因此我将继续使用PHP4:
class User
{
var $sql;
function User()
{
$this->sql = new DatabaseConnection();
}
function add($data)
{
$query = '...query here...';
$this->sql->query($query);
}
}如果您想查看一些可靠的企业级代码示例,我强烈建议您查看Zend Framework中的一些组件。
https://stackoverflow.com/questions/1615784
复制相似问题