我是一个OOP初学者。以下是我的代码列表,我试图找到一个合适的设计模式:
class data {
public $location = array();
public $restaurant = array();
}
$data = new data;
$query = mysqli_query($mysqli, "SELECT * FROM restaurants");
//actually a big long query, simplified for illustrative purposes here
$i = 0;
while ($row = mysqli_fetch_array($query)) {
$data->location[] = $i.')'.$row['location']."<br>";
$data->restaurant[] = $row['restaurant']."<br>";
$i++;
}
我想从另一个PHP页面访问数据类。(为了在HTML中打印信息,因此使用
标签)。我不希望查询运行两次。我知道类是在一个PHP页面加载中创建和销毁的。在这种情况下,我很欣赏管理HTTP应用程序状态和最小化计算机资源的设计模式指导。
如果将数据对象存储在$_SESSION变量中,则可以从其他页面和刷新时访问它。正如在其他帖子和评论中提到的,你想把HTML从数据处理中分离出来。
class data {
public $location = array();
public $restaurant = array();
}
// start your session
session_start();
$data = new data;
$query = mysqli_query($mysqli, "SELECT * FROM restaurants");
//actually a big long query, simplified for illustrative purposes here
$i = 0;
while ($row = mysqli_fetch_array($query)) {
$data->location[] = $i.')'.$row['location'];
$data->restaurant[] = $row['restaurant'];
$i++;
}
// HTML (separate from data processing)
foreach ($data->location as $location) {
echo $location . '<br />';
}
// save your session
$_SESSION['data'] = $data;
当您希望从另一页引用数据对象时
// start your session
session_start();
// get data object
$data = $_SESSION['data'];
// do something with data
foreach($data->location as $location) {
echo $location . '<br />';
}
SELECT数据库中的数据是相当便宜的。您不需要担心两次运行查询。MySQL将完成缓存部分。
在你的代码中,你把数据库数据和HTML混在了一起。我建议把它分开。// fetch data part
while ($row = mysqli_fetch_array($query)) {
$data->location[] = $row['location'];
$data->restaurant[] = $row['restaurant'];
}
// print HTML part
$i = 0;
foreach($data->location as $loc) {
echo $i . ')' . $loc . '<br />';
}
你先说:
我是一个OOP初学者。
然后你说:
我不喜欢运行查询两次。我知道课堂是
你想太多了。PHP是一种基于用户对该脚本请求的脚本语言。也就是说,它总是在每次加载PHP页面时重新加载并重新运行代码。这是没有办法的
当我说你想太多的时候,PHP基本上是L.A.M.P.堆栈的一部分(Linux, Apache, MySQL &因此,查询速度的负担取决于MySQL服务器,无论如何都会缓存请求。
意味着当您考虑PHP的效率时,PHP的固有架构坚持在每次负载上运行查询。考虑到这一点,管理查询的负担落在MySQL和服务器的效率上。数据库中数据结构的设计。
所以,如果你担心你的代码占用资源,考虑以某种方式提高MySQL的效率。但是L.A.M.P.堆栈的每一层都有其用途。PHP层的目的是重载&在每个请求中重新运行脚本
您可能正在寻找Repository模式。
一般的想法是有一个类可以为您检索数据对象。
的例子:
$db = new Db(); // your db instance; you can use PDO for this.
$repo = new RestaurantRepository($db); // create a repo instance
$restaurants = $repo->getRestaurants(); // retrieve and array of restaurants instances
Implentation:
class RestaurantRepository {
public function __construct($db) {
$this->db = $db;
}
public function getRestaurants() {
// do query and return an array of instances
}
}
代码是未经测试的,可能有拼写错误,但这是一个开始。
将查询结果以数组的形式保存到$_SESSION
变量中,这样就不必在另一个页面上重新运行查询。此外,如果使用不同的参数重新运行查询,它可以像unset($_SESSION['name'])
一样正确地管理状态。
我还可以将类数据的输出保存到会话变量。在我看来,这种设计模式比为页面刷新运行一个新的查询更有意义。