我的问题是:如果我根据MySQL中的数据在PHP中创建对象,那么我是不是双重存储数据,因此浪费资源并减慢我的应用程序?
如果你愿意,你可以继续阅读我为什么要问......
我知道这对我的应用程序的大小并不重要,但我想开始做对。 我有一个基本的小MVC和一个我们称之为产品的项目数据库。为了方便起见,我只是想确定是否/何时/从哪里开始从MySQL数据到PHP对象。
这就是我的文件树的样子:
root
controller
Controller.php
model
Model.php
Product.php
view
Products.php
Product.php
index.php
以下是相关代码:
// Controller.php
if (!isset($_GET['product'])) {
- getProducts() && include view/Products
} else {
- getProduct('product') && include view/Product
}
// Model.php
getProducts() {
while($row = $stmt->fetch_assoc()) {
$array[$i] = new Product($row["id"], $row["name"], $row["price"]);
$i++;
}
return $array;
}
getProduct($id) {
$allProducts = $this->getProducts();
return $allProducts[$id];
}
// Products view
<?php foreach ($products as $product): ?>
display $product->id and $product->name
<?php endforeach; ?>
// Product view
display $product->name and $product->description and $product->price ...
答案 0 :(得分:3)
它在技术上将数据库中的数据复制到内存中,但同样地,在餐厅阅读菜单会将菜单项复制到您自己的内存中。没有办法利用或处理来自数据库的数据,而没有将数据读入内存,因为脚本正在使用数据,就像没有办法从菜单中订购某些东西而没有简单地将其保存在你自己的记忆。并且,正如你可能在用餐结束时记不起大部分菜单 - 在你不再需要它之后忘记了 - 在脚本完成执行后PHP将不会在内存中保留任何内容,因为整个VM在脚本结束。
最好不要将数据读入您不需要的内存中 - 例如,查找您需要的一个用户记录,而不是整个用户表。你必须做自己的基准测试来评估你自己的特定场景,但一般来说,你最好做重复的小查询(使用好的索引的WHERE子句)来只检索你需要的数据,而不是做用于检索您可能需要或可能不需要的大量数据的大型查询。
答案 1 :(得分:2)
你有一个很大的误解。 PHP是 NOT 守护程序环境 - 换句话说,除非您使用非常具体的设置,否则不会在客户端实例之间存储或共享您的对象。默认情况下,PHP是功能性的 - 它将从头到尾通过指令完成,一旦完成,它就会结束并自行关闭。
这意味着您的产品(例如,数据库中的ID 4)仅在PHP内存中使用。默认情况下,当某些内容耗尽引用时,PHP会取消它。所以,假设你有你的产品模型实例,你使用它,然后你取消它 - 瞧,从记忆中消失。
例如,拿你的代码。在控制器上,您正在呼叫getProduct
。找到,返回产品,控制器完成时,它未设置。这导致了一个SQL查询。它是一种双重存储形式,但与使用旧的程序化MySQL代码风格相比,并没有任何要求。
模型本身就是数据的表示。它允许您将所有数据库结构抽象为一个有意义且更符合逻辑的表单,更重要的是,易于缓存,传输和检索。它不是第二种存储形式。把它想象成一个“翻译”。
我猜是上面的答案:
最后,你能解释一下:你如何计划从MySQL获取数据而不将其存储在内存中? PHP没有心灵感应。