Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 使构造函数复杂是一种不好的做法吗_Php_Oop_Constructor - Fatal编程技术网

Php 使构造函数复杂是一种不好的做法吗

Php 使构造函数复杂是一种不好的做法吗,php,oop,constructor,Php,Oop,Constructor,所以我正在制作一个PHP网站,在我的局域网上浏览我的电影集。它已经经过了几次迭代,现在我认为面向对象是一种发展方向。在当前状态下,我有几个函数可以从数据库中获取电影信息。因此,每当我需要一部电影的信息时,我必须调用一些函数来获取所有信息,并将这些信息传递给其他函数,以便对其执行我想要的操作 我对面向对象版本的想法是在构造函数中执行所有这些“getinfo”函数。所以我只需要创建一个电影对象,所有的信息都可以使用$movieobj->title等等 我尝试了一下,并提出了一个测试: class m

所以我正在制作一个PHP网站,在我的局域网上浏览我的电影集。它已经经过了几次迭代,现在我认为面向对象是一种发展方向。在当前状态下,我有几个函数可以从数据库中获取电影信息。因此,每当我需要一部电影的信息时,我必须调用一些函数来获取所有信息,并将这些信息传递给其他函数,以便对其执行我想要的操作

我对面向对象版本的想法是在构造函数中执行所有这些“getinfo”函数。所以我只需要创建一个电影对象,所有的信息都可以使用
$movieobj->title
等等

我尝试了一下,并提出了一个测试:

class movie{
public $tite = Null;

function __construct($id, $conn){

//set title property
$sql_select = $conn->prepare("SELECT title FROM movie.title 
                              WHERE `movieID` = {$id} LIMIT 1");
$sql_select->execute();
$sql_select->bind_result($val);
$sql_select->fetch();
$this->title = $val;
}
}

这是我想要的,能够使用以下方式获得电影标题:

$movie = new movie(100,$db);

echo $movie->title;
但是在实践中,我会在构造器中有更多类似的代码块来获取电影的其他信息


这是使用构造函数的错误方法吗?是否应该更简单,然后使用其他方法从数据库中提取这些信息?拥有一个复杂的构造函数会使其他代码简单得多,但这是一种糟糕的做法,还是会导致我没有看到的问题

一般来说,我个人只会使用构造函数来设置作为参数传入的基本属性值,例如连接,从而使构造函数代码本身尽可能简单;并在其他方法中使用所有真正的代码,例如fetch方法(例如,
getMovie()
)来实际执行数据库检索,而不是直接访问movie属性(使该属性私有或受保护)

您可以将数据库访问与构造函数隔离开来。然后应使用构造函数设置类的属性,在本例中为
Movie
。然后,我的电影类将有一个签名,如so
Movie($title,$director,$year,…)
。电影对象将表示数据库中的一行。如果我要重复数据库调用,我会考虑把它放在电影类的静态函数中,或者作为一个只调用一次的外部函数。

,结果是当你用谷歌做“构造函数中的数据库查询”时。你会发现这个问题——即使你强调复杂性——已经被反复问过了

我的看法是,在构造函数中查询数据库是一种不好的做法

当你从一个“低水平”来看,没有直接的成本,人们的不适感更普遍。现在,很容易忽略这些非特定的反对意见,在实践中,当您这样做时,您可能会做得很好,并且与将数据库查询分离到一个fetch方法相比也同样好。事实上,您需要编写更多的代码,一行额外的代码来获取数据

在这种情况下,你得到的是比你面前具体的小项目更高的一个层次:你强迫自己使用某种风格,这种风格平均来说会让你受益更多,即使在短期内你有一个(微小的)劣势

这样做的好处是,当您习惯于分离数据库查询时,您可以获得灵活性和“顺序”:如果以后因为要在对象的生命周期内重新加载数据而更改代码,则必须重构您已经编写的代码(包括在您实例化此类对象的所有地方,如果其他人将您的代码用作模块,他们也必须这样做),或者销毁/重新创建该对象。如果fetch函数从一开始就是额外的,那么无论发生什么情况,它都将正常工作

因此,你的第一个建议对那些一年一次在周末写个人爱好项目的人来说是可以的,如果你是或想成为一名专业程序员,原因远远超出任何一个特定的项目,你应该选择更易于维护和“有序”的长期项目。长期项目意味着快速、有序地编程的项目企业环境中的“肮脏”是因为它们本来应该很小,5年后就变成了“怪物”,因为在最初的两年里,程序员认为这样的捷径是可以的,因为“这只是一个小项目”


在我看来,这才是这些约定的真正目的,就是为了照顾你看不到的东西(未来).

完全正确。一般来说,构造函数的使用是基于约定的。一般来说,构造函数的参数范围应该由其中包含的方法的需要决定。也就是说,我发现最好让构造函数保持空,或者让它接收应用程序所需的最基本数据。例如DB connectIn + 1,但是最好不要在评论中升级分歧。忽略那些你没有发现有建设性的贡献,IMO(我要求MOD考虑删除)。是的,在构造函数中的计算是不好的实践,因为它使代码非常难测试。如果你需要“准备”。“在对象可以在其他地方使用之前,您应该使用factory/builder来隔离所有这些准备工作。