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

发布于 2022-09-02 15:28:24 字数 153 浏览 16 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

傲世九天 2022-09-09 15:28:24

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

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

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

时间海 2022-09-09 15:28:24

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

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

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

却一份温柔 2022-09-09 15:28:24

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

一场春暖 2022-09-09 15:28:24

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

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

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

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

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

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

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

$user = new User();

$userController = new UserController($user);
┊风居住的梦幻卍 2022-09-09 15:28:24

谢邀!

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

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

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

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

何以心动 2022-09-09 15:28:24

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文