Home >Backend Development >PHP Tutorial >实例对象放构造函数里面好?

实例对象放构造函数里面好?

WBOY
WBOYOriginal
2016-06-06 20:08:55960browse

PHP里面把实例对象这个步骤放构造函数里面好?假设UserController里面所有的方法几乎都需要User这个对象我把$user = new User();
放在__construct(){}里面好?还是每个方法里面都$user = new User();

回复内容:

PHP里面把实例对象这个步骤放构造函数里面好?假设UserController里面所有的方法几乎都需要User这个对象我把$user = new User();
放在__construct(){}里面好?还是每个方法里面都$user = new User();

如果对代码没什么要求的话,这样做也没什么不好,但是追求高一点的话还是不建议在构造函数中构造实例。一方面是如果根本用不到user实例就白分配了内存,另一方面也缺乏弹性。经典的get/set方法更灵活一些。

<code>public function getUser() {
    if (! $this->_user instanceOf User) $this->_user = new User();
    return $this->_user;
}</code>

对象内部也通过getUser来获取实例代替直接访问$this->_user一方面保证了User对象在需要的时候才被构造,同时,setUser方法也为绑定派生类提供了可能。
当然如果追求更优雅的代码可以继续在解耦方面动更多脑筋,不过也要考虑开发效率问题,毕竟姿势漂亮而牺牲太多速度也是容易被诟病的。

这个可以根据项目实际情况来定,如果这个项目做出来之后,访问量不大,也没什么拓展的,个人觉得可以牺牲下性能,优待一下自己,没必要考虑那么多性能、拓展的东东,怎么方便怎么来,何必拿着牛刀满大街的追着鸡砍。个人愚见。

首先,把$user = new User();放在每个方法里肯定是不好的做法。因为:

  1. 大量代码重复。每个方法里都有一样的初始化代码,造成大量重复代码。

  2. 高耦合。User对象和这个UserController对象高度耦合,想象一下如果你要把User更换为另一个AdvancedUser对象,你需要更改多少代码量。

其次,把$user = new User();放在构造函数里是一种更好的方法,但也不是最好的方法。因为:

  1. 放在构造函数里解决了上面的重复代码的问题,每个方法不需要重复执行实例化过程。

  2. 但是高耦合依然存在,如果把User更换为AdvancedUser对象,依然需要更改UserController的代码。

最后,推荐的做法是使用控制反转,把$user = new User();放在UserController类外面,把实例化后的User对象作为构造参数传入,这样如果要替换User对象,只要把不同的实例化对象传入即可。比如这样:

<code>$user = new User();

$userController = new UserController($user);
</code>

每个方法都需要User对象,可以放在构造方法里面啊。

这个就是简化写法,没有什么效率问题或者设计模式,不用考虑过度设计或者过度优化的问题。

但是要注意构造方法重写问题。

谢邀!

首先这个问题我感觉是一个良好的编码习惯问题,而良好的编码习惯标准有很多

个人感觉牺牲系统性能来图编码的一时方便肯定是不可取的

想象一个场景:如果你的controller类中 有很多私有方法,其中只是为了封装给多个方法在类内部调用的话,而这些方法本身又不要你这个new user实例,这样你就浪费了“一块内存”,就是我所说的牺牲了系统性能,当然可能并没有我们想象的那么严重

所以其实你自己可以取舍是要为了方便编码 还是为了追求极致的系统性能

对象的关系,userModel是userController的属性吗?
其实只是一种使用关系而已,所以每次使用的时候获取就可以了。

注意,上面是使用了获取,而不是实例化。具体你可以去了解下控制反转和依赖注入。

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn