美文网首页PHP Chaos
优雅的 PHP 代码

优雅的 PHP 代码

作者: xiaojianxu | 来源:发表于2017-07-15 10:48 被阅读65次

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/






相关文章

网友评论

    本文标题:优雅的 PHP 代码

    本文链接:https://www.haomeiwen.com/subject/lupahxtx.html