所以我试图更多地了解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);
}
我对其余部分有何不同感到困惑? 可不可能是?没有更多代码或了解我的结构,是否有人可以帮助我?
答案 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
作为旁注,为了避免任何其他混淆,我的MyClass
和Main
示例是相同的 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;
}
}