> 백엔드 개발 > PHP 튜토리얼 > 实例对象放构造函数里面好?

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

WBOY
풀어 주다: 2016-06-06 20:08:55
원래의
962명이 탐색했습니다.

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的属性吗?
其实只是一种使用关系而已,所以每次使用的时候获取就可以了。

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

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿