用new vs $ this创建一个对象

时间:2013-08-08 20:56:28

标签: php

我最近一直致力于在另一位开发人员离开之后投入工作的项目(他是离开之前唯一一个在其上工作的人)。该项目是用CodeIgniter编写的,并使用MVC框架。在从事这个项目时,我发现了一些有趣的东西,或者至少是我以前从未见过的东西。 将模型加载到控制器后,使用...

将对象传递到视图中
$data['outcomes']                 = $this->id_conversion;

id_conversion是加载到控制器顶部的模型。我的问题是,这与使用

有什么不同
new Id_conversion();

取代上述。

感谢任何帮助或任何能够指出我正确方向的人。

编辑。在阅读完评论后我很抱歉,我认为我需要更多代码才能理解这一点。

public function person($id)
{
    $this->authenticate->check_access(array('admin', 'rps'), 'home');
    $this->load->library('page_uri');
    $this->load->model('term');
    $this->load->model('user');
            $this->load->model('id_conversion');

    $selected_term = $this->page_uri->get_term();

    $current_term = $this->term->current_term_id();
    if (!isset($selected_term)) {
        $selected_term = $current_term;
    }

    $term = new Term();
    if (!empty($selected_term) && $selected_term !== '0') {
        $term = new Term($selected_term);
    }

    $user = new User($id);
    $plans = $user->plans_by_term($term);

    $data = array();
    $data['user']                 = $user;
    $data['site_url']             = site_url("reports/person");
    $data['current_term']                     = $this->term->current_term_id();
    $data['selected_term']                    = $selected_term;
    $data['terms']                = $this->term->sorted_term_list();
    $data['term']                 = $selected_term;
    $data['plans']                = $plans;
            $data['outcomes']                         = $this->id_conversion;

    $this->load->view('template/foundation', $data);
}

模型id_conversion加载

class Id_conversion extends MY_Model{

function __construct()
{
    parent::__construct();
}

/*
 * Input a primary or secondary outcome as defined
 * in the plan class and 
 */
public function id_outcomes($id)
{
    $sql = 'SELECT name
            FROM outcomes
            WHERE id ='. $id;

    $query = $this->db->query($sql);

    return $query->row_array();
}

}

2 个答案:

答案 0 :(得分:1)

可能会给出相同的结果但不一定。

如果$this->id_conversion是对模型类的引用,则该类可能已以不同方式初始化。在Codeigniter中,您可以初始化模型的实例,如下所示:

$this->load->model('model_name', 'alias_name', $db_params);

如果班级Id_conversion不存在且id_conversion实际上是别名,那么当然不会有效。

如果$db_params不同,那么这与仅仅new Id_conversion();说的有很大不同。另请注意,如果您未向构造函数传递任何内容,则不需要()。如上所述,它会创建另一个不必要的类实例。

当然,如果$this->id_conversion的状态发生了变化,例如:

$this->id_conversion->property = 'value';

......那就完全不一样了。

请注意,$this->id_conversion也可以在视图中使用,因此虽然将它明确地传递给视图可能是一种好习惯,但并不是绝对必要的。该视图与调用它的控制器方法在相同的范围内运行。

除非你确定你知道自己在做什么,否则最好坚持使用Codeigniter方式。

答案 1 :(得分:1)

使用new将创建一个新对象。

使用$this->id_conversion将使用先前已创建的现有对象,该对象存储在该变量中。

在没有看到更多代码的情况下,完全不可能知道现有对象处于什么状态,所以我不能告诉你与使用现有对象相比,创建新代码会有什么不同。我想有一个很好的理由让程序已经创建了对象并为你存储了它,所以我想它已经准备就绪,但我无法确定你给我们的东西。< / p>

但即使在现有对象处于完全原始状态并且创建新对象的情况下也会提供相同的功能,当你已经存在一个额外的对象时,你就会浪费系统资源。可以肯定的是,只有少量的浪费,但这一切都加起来。