php优雅的写法,优雅的 PHP 代码

1、使用引用是不是使我们的代码更加的简洁,除此之外相对于第一种写法,我们节省了内存空间,尤其是再操作一个大数组时效果是及其明显的。

2、使用匿名函数

Class One

{

private $instance;

// 类 One 内部依赖了类 Two

// 不符合设计模式的最少知道原则

public function __construct()

{

$this->instace = new Two();

}

public function doSomething()

{

if (...) {

// 如果某种情况调用类 Two 的实例方法

$this->instance->do(...);

}

....

}

}

...

$instance = new One();

$instance->doSomething();

上面代码写法的问题:

不符合设计模式的最少知道原则,类 One 内部直接依赖了类 Two;

类 Two 的实例不是所有的上下文都会用到,所以浪费了资源。用单例,也无法解决实例化了不用的尴尬。

使用匿名函数进行改写:

Class One

{

private $closure;

public functionn __construct(Closure $closure)

{

$this->closure = $closure;

}

public function doSomething()

{

if (...) {

// 用的时候再实例化,实现懒加载

$instance = $this->closure();

$instance->do(...);

}

}

}

...

$instance = new One(function() {

return new Two();

});

$instance->doSomething();

...

3、减少对 if...else..的使用。可先使用 if 来处理简单异常,提前 return,再执行正常逻辑

Function doSomething() {

if (...) {

if (...) {

...

} else {

...

}

} else {

if (...) {

...

} else {

...

}

}

}

细心的你会发现,上面绝大多数 else 代码里都是在处理异常情况,更可能这个异常代码特别简单,那么就可以先去处理异常,提前 return,再执行正常的逻辑。

function doSomething() {

if (...) {

// 异常情况

return ...;

}

if (...) {

// 异常情况

return ...;

}

// 正常逻辑

....

}

Class One

{

public function doSomething() {

if (...) {

throw new Exception(...);

}

if (...) {

throw new Exception(...);

}

// 正常逻辑

...

}

}

4、关联数组做 map

做决策,通常会判断不同的上下文,再选择不同策略,通常会像下面一样使用 if 或者 switch 判断:

Class One

{

public function doSomething()

{

if (...) {

$instance = new A();

} elseif (...) {

$instance = new A();

} else{

$instance = new C();

}

$instance->doSomething(...);

...

}

}

Class One {

private $map = [

'a' => 'namespace\A',

'b' => 'namespace\B',

'c' => 'namespace\C'

];

public functin doSomething()

{

....

$instance = new $this->map[$strategy];

$instance->doSomething(...);

}

}

```

5、使用接口

为什么要使用接口?便于后期的扩展和代码的可读性,例如:设计一个优惠系统,不同的商品知识再不同的优惠策略下具备不同的优惠行为,我们定义一个优惠行为的接口,最后对这个接口编程即可,伪代码如下:

```

Interface Promotion

{

public function promote(...);

}

Class OnePromotion implement Promotion

{

public function doSomething(...) {

...

}

}

Class TwoPromotion implement Promotion

{

public function doSomething(...)

{

...

}

}

```

6、控制器不要有直接的 DB 操作

程序绝大多数的操作基本都是增删改查,可能是查询的 where 条件和字段不同。所以可以抽象的把对数据库增删改查的方法写到 model 中,通过参数暴露我们的 where,fields 条件。

> 文章摘录来源:http://tigerb.cn/2017/06/01/artisan/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值