Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP、OOP和数据库-性能问题_Php_Database_Performance_Oop - Fatal编程技术网

PHP、OOP和数据库-性能问题

PHP、OOP和数据库-性能问题,php,database,performance,oop,Php,Database,Performance,Oop,关于在PHP中与数据库一起使用OOP时的性能,我有一个问题。我将举例提问,假设一个类foo表示某个表中的一行。现在假设我需要在我的web应用程序的5个不同页面上使用foo 问题是,在这5页中的每一页上,我都将使用来自不同列的数据。(即,第一页将使用第1列和第2列,而第二页将使用第3列和第4列等) OOP方法(据我所见)建议,当我在某个特定行上初始化foo时,我将连接并获取该行的所有列并构建我的对象。然后我可以继续我的逻辑,使用我可能需要的任何数据 我的问题是,使用过程性方法(我在web方面更习惯

关于在PHP中与数据库一起使用OOP时的性能,我有一个问题。我将举例提问,假设一个类foo表示某个表中的一行。现在假设我需要在我的web应用程序的5个不同页面上使用foo

问题是,在这5页中的每一页上,我都将使用来自不同列的数据。(即,第一页将使用第1列和第2列,而第二页将使用第3列和第4列等)

OOP方法(据我所见)建议,当我在某个特定行上初始化foo时,我将连接并获取该行的所有列并构建我的对象。然后我可以继续我的逻辑,使用我可能需要的任何数据

我的问题是,使用过程性方法(我在web方面更习惯于这种方法)不会浪费资源来下载我不需要的专栏,因为查询将专门针对特定页面的需要进行定制。(也就是说,如果我在第一页,我只会下载column1和column2,因为这是我需要的。)

我的OOP方法是错误的,还是额外的开销微不足道,以至于开发人员通常下载他们不需要的数据

感谢和抱歉,如果这已经涵盖,我想这将是一个有趣的话题!:)

埃里克

进一步澄清:

课程内容如下:

class foo
{
  $column1;
  $column2;
  $column3;
  $column4;

  public function _construct($id)
  {
    //get column 1,2,3 and 4 from database where table_id = $id
  }
}

问题是,如果我只需要一页专栏1,我会免费下载专栏2、3和4。在程序方法中,您不会这样做。我的OOP模型是坏的还是好的?

我不能完全确定我是否理解你的问题。我认为有三件事可以适用于你如何处理这个问题:

A) 您正在尝试构建一个对象,然后在整个脚本中使用该对象中包含的数据。 B) 您正在使用PDO样式的数据库拉取。 C) 您正在使用PHPs SPL在对象上生成迭代,该对象包含从数据库中提取信息的方法

我现在假设你正在使用选项A。如果我错了,请原谅我,我根本没有低估你的知识…只是从这里开始

OOP的方法不是拉入所有数据以使其在整个脚本中可用。可以将其视为一个函数集合,而不是一个数据集合,尽管它很容易是其中之一或两者兼而有之。您将编写类方法,就像编写没有OOP的函数一样。唯一的区别是,该对象可以用于与您的脚本进行多次通信,您需要它来

为了清楚地回答你的问题,我从不获取超过我需要的数据。出于安全和性能两方面的原因。您应该像使用过程样式一样使用类。您可以在实例化类时(使用构造函数方法)执行脚本所需的所有数据提取,但请确保它只是您需要的数据

----增加

那就这么说吧

$foo = new Foo();
$page = "The page or the column that you want to pull";
$data = $foo->getData($page);
您仍在按程序执行所有操作,但现在您有了一个动态函数,可以根据您作为页面发送的内容提取数据。。。在这种情况下,我看不出有任何理由使用构造函数……只有getter方法


这有帮助吗?

通常的方法是只选择所需的列
foo->db->tablename->选择('all',其中date=$date)

快速浏览一下cakephp和symfony之类的框架,它可能会帮助您更好地了解通常是如何完成的。

您仍然可以通过使用列数组在构造时抓取,或者使用公共类方法处理查询抓取,将选择性查询合并到OOP类中

构造函数示例:

<?php

class Foo{
    public function __construct( $column ) {

        if(is_array($column)){
             if(count($column) > 1){
                 $result = mysql_query('SELECT `'.implode('`,`', $column).'` FROM `table`;');
             }else{
                 $result = mysql_query('SELECT `'.$column[0].'` FROM `table`;');
             }
        }else{
             $result = mysql_query('SELECT `'.$column.'` FROM `table`;');
        }

        $this->result = mysql_result($result, 0);
    }
}
?>


公共函数方法与此相同,只是您可以返回结果,而不是设置
$this->result

我的2美分。它取决于许多因素以及它如何影响整个应用程序,即数据库请求的大小、每条记录的大小、行集的大小等


我个人加载所有列和配置文件,以便在遇到缓慢的请求或高内存使用率时查找瓶颈。如果我有瓶颈,那么我只考虑在这一点上只加载需要的列。

你会把你的样例代码放进去吗?还不清楚你想要达到什么?如果您使用的是数据库,那么您的查询只能返回您需要的行,而不能返回任何其他行。我在我的帖子中添加了一些说明。我这样问是因为我现在做的是100%的php过程,而且从我开始使用php以来就一直是这样做的。但是,我看到人们使用对象从特定行获取所有数据,只是为了启动一个类来访问其中的delete方法。对我来说,这似乎很奇怪,这种面向对象的模型错了吗,你有什么建议吗?是的,根据你的说法,我认为这是一种有点错误的方法。我已经添加了代码来向您展示我将如何做到这一点……是的,我正在考虑类似的事情,但是如果没有将您提取的数据存储在对象中,您将错过OOP。我认为travis建议的类变量的动态设置可能更符合我的要求。谢谢你!尽管如此,只要设置$this->data=结果集,而不是放置返回,那么它将保存在类中。。。另外,我相信大多数人都会建议不要直接访问类的属性,而是使用getter方法获取数据并返回它。。。构造函数在实例化时只调用一次,因此在不创建新对象的情况下无法重写……这很有意义,如果只是初始化删除,您甚至可以添加一个空的构造函数。我想我已经看到了太多未优化和写得不好的代码,我开始认为这是正常的!这发生在我们最好的人身上。坦率地说,我发布的代码——对我来说——写得很糟糕,令人不悦
<?php

class Foo{
    public function __construct( $column ) {

        if(is_array($column)){
             if(count($column) > 1){
                 $result = mysql_query('SELECT `'.implode('`,`', $column).'` FROM `table`;');
             }else{
                 $result = mysql_query('SELECT `'.$column[0].'` FROM `table`;');
             }
        }else{
             $result = mysql_query('SELECT `'.$column.'` FROM `table`;');
        }

        $this->result = mysql_result($result, 0);
    }
}
?>