实例对象放构造函数里面好?
$user = new User();
放在__construct(){}里面好?还是每个方法里面都$user = new User();
回复内容:
PHP里面把实例对象这个步骤放构造函数里面好?假设UserController里面所有的方法几乎都需要User这个对象我把$user = new User();
放在__construct(){}里面好?还是每个方法里面都$user = new User();
如果对代码没什么要求的话,这样做也没什么不好,但是追求高一点的话还是不建议在构造函数中构造实例。一方面是如果根本用不到user实例就白分配了内存,另一方面也缺乏弹性。经典的get/set方法更灵活一些。
public function getUser() {
if (! $this->_user instanceOf User) $this->_user = new User();
return $this->_user;
}
对象内部也通过getUser来获取实例代替直接访问$this->_user一方面保证了User对象在需要的时候才被构造,同时,setUser方法也为绑定派生类提供了可能。
当然如果追求更优雅的代码可以继续在解耦方面动更多脑筋,不过也要考虑开发效率问题,毕竟姿势漂亮而牺牲太多速度也是容易被诟病的。
这个可以根据项目实际情况来定,如果这个项目做出来之后,访问量不大,也没什么拓展的,个人觉得可以牺牲下性能,优待一下自己,没必要考虑那么多性能、拓展的东东,怎么方便怎么来,何必拿着牛刀满大街的追着鸡砍。个人愚见。
首先,把$user = new User();
放在每个方法里肯定是不好的做法。因为:
大量代码重复。每个方法里都有一样的初始化代码,造成大量重复代码。
高耦合。
User
对象和这个UserController
对象高度耦合,想象一下如果你要把User
更换为另一个AdvancedUser
对象,你需要更改多少代码量。
其次,把$user = new User();
放在构造函数里是一种更好的方法,但也不是最好的方法。因为:
放在构造函数里解决了上面的重复代码的问题,每个方法不需要重复执行实例化过程。
但是高耦合依然存在,如果把
User
更换为AdvancedUser
对象,依然需要更改UserController
的代码。
最后,推荐的做法是使用控制反转,把$user = new User();
放在UserController
类外面,把实例化后的User
对象作为构造参数传入,这样如果要替换User
对象,只要把不同的实例化对象传入即可。比如这样:
$user = new User();
$userController = new UserController($user);
每个方法都需要User对象,可以放在构造方法里面啊。
这个就是简化写法,没有什么效率问题或者设计模式,不用考虑过度设计或者过度优化的问题。
但是要注意构造方法重写问题。
谢邀!
首先这个问题我感觉是一个良好的编码习惯问题,而良好的编码习惯标准有很多
个人感觉牺牲系统性能来图编码的一时方便肯定是不可取的
想象一个场景:如果你的controller类中 有很多私有方法,其中只是为了封装给多个方法在类内部调用的话,而这些方法本身又不要你这个new user实例,这样你就浪费了“一块内存”,就是我所说的牺牲了系统性能,当然可能并没有我们想象的那么严重
所以其实你自己可以取舍是要为了方便编码 还是为了追求极致的系统性能
对象的关系,userModel是userController的属性吗?
其实只是一种使用关系而已,所以每次使用的时候获取就可以了。
注意,上面是使用了获取,而不是实例化。具体你可以去了解下控制反转和依赖注入。