希望转向OOP!

时间:2010-05-01 01:13:18

标签: php

所以我试图更多地了解OOP并使用它。

在我开始使用OOP之前编写了以下代码。

//loop through all the users 
$game = "$_POST[Game]_teams";
$result = mysql_query("SELECT username FROM `users`") or die(mysql_error());
while( $row=mysql_fetch_assoc($result) )
{
    $u[] = $row['username'];
}

我已将查询放入我的数据库页面,如下所示:

   function selectAllUsers()
   {
        $q = "SELECT username FROM ".TBL_USERS."";
        mysql_query($q, $this->connection);
   }

我对其余部分有何不同感到困惑? 可不可能是?没有更多代码或了解我的结构,是否有人可以帮助我?

4 个答案:

答案 0 :(得分:3)

您班级中的每个功能都应该只执行一个任务和一个任务,并且应该正确命名。

您的selectAllUsers功能应该只选择所有用户,

function selectAllUsers() {
 $q = "SELECT username FROM ".TBL_USERS."";
 return mysql_query($q, $this->connection);
}

但是,我添加了return关键字,以便返回我们稍后可以使用的资源

然后你可以拥有一个名为generateUserArray的函数,该函数将使用selectAllUsers函数中返回的 MySQL资源来填充用户数组。

function generateUserArray() {
 $u = array();
 $result = $this->selectAllUsers();
 while( $row=mysql_fetch_assoc($result)) {
  $u[] = $row['username'];
 }
 return $u;
}

有关您的问题的更多信息,您将收到的关于您想要完成的内容的更多答案,或清除任何混淆。


首先,这是我的测试数据库(users)中的测试表(login),

mysql> select * from users;
+-----------+-----------+
| Name      | Password  |
+-----------+-----------+
| aforloney | whatsup   |
| pam       | qwerty    |
+-----------+-----------+
2 rows in set (0.15 sec)

这是MyClass.php

中的测试课程
class MyClass {

 function connect() {
  mysql_connect("localhost","root","password");
  mysql_select_db("login");
 }

 function selectAllValues() {
  $q = "SELECT * FROM users";
  return mysql_query($q);
 }

 function printAllValues() {
  $result = $this->selectAllValues();
  while ($row = mysql_fetch_assoc($result)) {
   echo $row['Name'] . " and " . $row['Password'] . "<br/>";
  }
 }
}

然后您可以从Main类调用,如此,

class Main {    

// other variables...

// __construct is an object's constructor, it's what gets called when 
// you create a new Main object

  function __construct() {

   $myClass = new MyClass();
   $myClass->connect();
   $myClass->selectAllValues();
   $myClass->printAllValues(); 

  }
}

然后打电话,

$m = new Main(); // will invoke the __construct function

将输出到浏览器,

 aforloney and whatsup
 pam and qwerty

作为旁注,为了避免任何其他混淆,我的MyClassMain示例是相同的 PHP文件中的两个类。如果您要使用上面的代码示例并尝试创建MyClass对象,则会产生错误。

如果您想要实例化另一个类中定义的对象,则需要include语句。

因此,对于两个不同的PHP文件,我会更改Main类的代码,如此,

<?php
include ('MyClass.php'); 
class Main {
 ...
}
?>

答案 1 :(得分:3)

首先,您应该考虑切换到PDO(请参阅php.net)。它本质上采用了更多的OOP-ish方法,并提供了更好,更直观的API以及许多与mysql_ *函数相反的其他功能。

非常简单的示例:这里我们从数据库中获取用户数据,并使用该数据填充用户对象。

<?php
class UserMapper {
    protected $connection;
    public function __construct(PDO $connection) {
        $this->connection = $connection;
    }

    public function findAll() {
       $statement = $this->connection->prepare("SELECT * FROM users");
       $statement->execute();
       return $statement->fetchAll(PDO::FETCH_CLASS, 'User');
    }
}

class User {
    public $name;
    public $email;
    public $password;
}

$connection = new PDO('mysql:dbname=users;host=127.0.0.1', 'root', 'root');
$userMapper = new UserMapper($connection);

$users = $userMapper->findAll();
print_r($users);

答案 2 :(得分:0)

我过去曾使用一些php元编程来实现这一目标。 http://iain.codejoust.com/2010/02/very-basic-php-orm/

一般的想法是创建一个模型类,并设置一个php __call处理程序,使数据库类截获调用的方法,设置参数,然后Model类返回一个从参数和函数中创建的SQL字符串。模型。

调用该函数时,结果是一个PDO对象,其中包含SQL查询的结果。

您还可以查看一些PHP ORM,例如http://www.doctrine-project.org/,以便用更少的工作量提供支持OOP的界面。

答案 3 :(得分:-1)

实际上我会说你的例子从结构转向功能但我不会说以面向对象为例。

面向对象的例子更像是:

class user {

public $username;
public $password;

public function showUsername(){
  echo 'Username is '.$this->username;
}

public function showPassword(){
  echo 'Password is '.$this->password;
}
}