1

我正在尝试学习 OOPHP,我想我已经到了那里。我只是不知道输出多个数据库行的最佳方式是什么。

我尝试的第一种方法是在函数内正常输出,但我认为这种方式违背了 OOP 的目的。

我还尝试public $list在类中设置一个数据库查询将所有数据推送到然后循环代码外部数据的类,但理想情况下我想从查询中创建对象的多个实例并使用它们的公共变量(我的测试用例中的 id、name 和 eyecolour)来获取数据,以便数据始终来自同一个地方。但是如何从类中的查询创建多个对象,然后如何遍历它们以显示它们,以及如何区分它们或仅针对具有特定值的特定对象?

我浏览了多个主题,但它们似乎都专注于特定情况下的问题。我想从这个简单的意义上学习它,这样我就可以将它应用到更大的项目中。

这是我一直在玩的代码:

class Ignition {

public function dataConnection() {
    return new PDO('mysql:host=localhost;port=8889;dbname=oop_testing','root','root',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
    }

}


class People {

private $db;

// Each person has a
public $id;
public $name;
public $eyecolour;
public $list = array();

public function __construct() {
    $this->db = new Ignition();
    $this->db = $this->db->dataConnection();
}

public function getList() {
    echo "People:<br /><br />";
    $sql = $this->db->prepare("SELECT * FROM people");
    $sql->execute();
    //$this->list = $sql->fetch(PDO::FETCH_ASSOC);
    while($person = $sql->fetch(PDO::FETCH_ASSOC)) {
        array_push($this->list, $person);
    }


    /*while($person = $sql->fetch(PDO::FETCH_ASSOC)) {
        echo $person['name'] . "<br />";
    }*/
}

public function getIndividual($search, $by = "id") {
    $sql = $this->db->prepare("SELECT * FROM people WHERE $by = :search");
    //$sql->bindParam(":by", $by);
    $sql->bindParam(":search", $search);
    $sql->execute();
    $individual = $sql->fetch(PDO::FETCH_ASSOC);
    $this->id = $individual['id'];
    $this->name = $individual['name'];
    $this->eyecolour = $individual['eyecolour'];
}

}


$people = new People();
$people->getList();

/*echo "<pre>";
var_dump($people->list);
echo "</pre>";*/

foreach ($people->list as $person) {
    echo $person['name'];
}

$people->getIndividual(1);
echo "<br />Name: " . $people->name;
echo "<br />Eye Colour: " . $people->eyecolour;
4

2 回答 2

2

最好的选择实际上是获取 People 对象的列表,您如何做到这一点取决于您。我会利用 PDO::FETCH_CLASS 并使用类似这样的静态函数:

class People {
    public $id;
    public $name;
    public $eyecolour;

    public function display() {
        echo "Id: {$this->id} name: {$this->name} eyecolour: {$this->eyecolour} <br>";
    }

    public static function get() {
        $result = self::db()->prepare("select * from people limit 1");
        $result->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,'People');
        $result->execute();
        return $result->fetch();
    }

    public static function getall() {
        $result = self::db()->prepare("select * from people");
        $result->setFetchMode(PDO::FETCH_CLASS | PDO::FETCH_PROPS_LATE,'People');
        $result->execute();
        return $result->fetchAll();
    }

    public static function db() {
        return new PDO("mysql:host=127.0.0.1;dbname=mydb", 'root', '', array(PDO::ATTR_PERSISTENT => true));
    }
}


$person = People::get();
$person->display();
$all_people = People::getall();

foreach($all_people as $single_person) {
    //$single_person is an instance of People
    $single_person->display();
}

显然,您可以将搜索条件添加到函数中的get()getall()方法中。我只是这样做的一个例子。

于 2013-10-25T18:13:40.250 回答
1

要练习 OO,您可以从将类中的所有变量设置为private(即使尝试使用public)并仅使用访问器函数。有了这条规则,因为我们比较懒惰,所以我们更有可能将代码放在正确的位置(类内部)。

此外,一个好的规则是现实生活中的一个对象应该是一个类。

在这种特定情况下,我将创建一个以Person人的不同属性(眼睛颜色、身高等)命名的类。该类可以从它从数据库中检索到的内容People创建对象并将它们存储在一个数组中(可能按 ID 或名称索引)。Person

该类Person可以将数据库中的整行作为其构造函数的参数,然后它必须自己完成设置/检查所有变量的繁琐工作。这对懒惰和 OO(没有 setter 函数)有好处。

您可能有一个访问器函数,People其中返回 a Person(搜索名称、ID 等)。

于 2013-10-25T17:44:34.603 回答