最近的总结

又到了吐槽时间了,毕竟最近也思考了不少

话说以后一定要告诉自己的亲戚无论如何也要上本科,当然了,三本还是要考虑一下的,我并不是看不起三本,毕竟我也就是个自考而已,但是三本的水平真心就跟我大专差不了多少。这并不是指老师不行,老师自然都是差不多的,而是指周围的大环境,像我这样很容易被影响到的,就会更加堕落,当然如果你是个勤奋并且能克制自己的人,就另算了,所以说大牛们请忽略这段话。所以无论合适都应该高标准的要求自己。

子曰 取乎其上,得乎其中; 取乎其中,得乎其下; 取乎其下,则无所得矣

最近看了一些文章和一些招聘信息,也就列了一些学习计划,但是在学习一个东西的时候又发现也有不足,所以最近回家学习就总是跳来跳去的。刚才仔细思考了一下,发现不应该这样,这就是被严重干扰了。所以刚刚列了一下学习计划。

希望能有个好的提升吧。

给博客升级成功了

图片alt

话说这次升级还是比较坑的,踏了以前注意过的坑。

比如说 config:cache 以后读取 env 失败的问题, 参见 https://laravel-china.org/topics/3362/laravel-use-env-to-read-the-environment-variable-null

还有 https 的问题,不过总算是搞定了,接下来还有几个问题,小调整一下就 ok 了,距离上次升级博客已经过去了一年,现在看来,这一年,还是进步了不少东西的。继续加油吧

PHP 细节补全计划:引用

图片alt

最近在公司比较忙,以前有空闲的时候没有发现的东西,反而再忙的时候会加深体会。所以就动了心思准备写一个 php 细节补全的系列,不知道能写多少,慢慢来吧,这个就是第一篇了。

其实,平时我个人觉得再使用引用的时候机会并没有那么多,但是呢,引用这个东西是绝对不可以忽略的。

引用平时就我个人来说使用的场景有如下几个:

  • 有批量处理数组数据的时候会使用引用,这样再方法里面就不用在单独返回了,比较省事
  • 再有递归调用的时候也会使用,但是使用的时候需要注意小心踩坑

剩下的貌似就不是很多了,但是这两天看过几个面试题,让我平时没注意的一些东西或者说没有深入考虑的东西,有了更深入的理解。

先看下面这个题:

最近的总结20170906

图片alt

最近几个月经历了不少事情啊,生病了吃药吃了一个多月,各种抽血,胃镜什么也都做了,万幸没啥大事,修养修养也就好了,不过重要的事情是减肥。然后回哈尔滨以后房子也买了,瞬间背上了百万的债,慢慢还把,努力工作早日还清。婚期也定下来了,一切都朝着好的方向进行着。

媳妇公司还要去天津,我俩也纠结了好一阵,最终还是决定留在北京。然后经历了一次半正式的面试吧。对方开了一个比现在要高的工资,但是呢,我对于目前的公司还是很满意的,而且我也很喜欢这个产品,所以哪怕高一些,也没有什么更多的好处,而且也好要去天津,所以最后还是坚定了留在了北京。

最后,感觉最近有些浮躁了,看书效率也不高了,所以还是要沉下心来学习一些东西。所以最近还是要看一些书的,php 相关尤其是反射,正则,redis 就是这些吧。

好了,一切都朝着好的方向发展着,加油吧。会更好的。

Slim Framework中间件的分析

最近也在分析中间件的东西。翻看了一下 laravel 的实现。但是 laravel 的实现很复杂,其实也不是很复杂,就是它的结构么,跳来跳去的,所以最后还是看了slim,毕竟简单。容易分析。

通过源码我可能得知有一个 MiddlewareAwareTrait 这个 Trait,然后由 App 来 use 这个 trait。

这里面有3个方法,分别是 addMiddleware、seedMiddlewareStack 和 callMiddlewareStack。

addMiddleware 这个方法是注册中间件用的,进入后会检测当前是不是在运行中间件。如果在运行中,则不允许添加中间件。紧接着会检测当前的中间件的栈是不是空的,如果是空的,则创建一个栈。这是后就调用了 seedMiddlewareStack 这这个方法。这个方法很简单,就是初始化一个栈。并且吧使用这个 trait 的 App 放入到栈底,并且设置了这个 stack 的模式,是栈模式和便利模式。具体的可以看 splstack 的文档。好了继续回到 add 的方法,从栈的顶部取回回调函数然后跟当前的相关参数组装成一个新的闭包函数,放到栈顶。其实现在除站定意外的元素可以说都是没有什么用了,但是为什么还放到下面,需要在思考思考。然后返回this,这是为了方便链式调用。

这个添加的方法就完毕了,具体可以看源码

 /**
     * Add middleware
     *
     * This method prepends new middleware to the application middleware stack.
     *
     * @param callable $callable Any callable that accepts three arguments:
     *                           1. A Request object
     *                           2. A Response object
     *                           3. A "next" middleware callable
     * @return static
     *
     * @throws RuntimeException         If middleware is added while the stack is dequeuing
     * @throws UnexpectedValueException If the middleware doesn't return a Psr\Http\Message\ResponseInterface
     */
    protected function addMiddleware(callable $callable)
    {
        if ($this->middlewareLock) {
            throw new RuntimeException('Middleware can’t be added once the stack is dequeuing');
        }

        if (is_null($this->stack)) {
            $this->seedMiddlewareStack();
        }
        $next = $this->stack->top();
        $this->stack[] = function (
            ServerRequestInterface $request,
            ResponseInterface $response
        ) use (
            $callable,
            $next
        ) {
            $result = call_user_func($callable, $request, $response, $next);
            if ($result instanceof ResponseInterface === false) {
                throw new UnexpectedValueException(
                    'Middleware must return instance of \Psr\Http\Message\ResponseInterface'
                );
            }

            return $result;
        };

        return $this;
    }

    /**
     * Seed middleware stack with first callable
     *
     * @param callable $kernel The last item to run as middleware
     *
     * @throws RuntimeException if the stack is seeded more than once
     */
    protected function seedMiddlewareStack(callable $kernel = null)
    {
        if (!is_null($this->stack)) {
            throw new RuntimeException('MiddlewareStack can only be seeded once.');
        }
        if ($kernel === null) {
            $kernel = $this;
        }
        $this->stack = new SplStack;
        $this->stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
        $this->stack[] = $kernel;
    }

调用方法就没必要多了,就是一层层调用而已了。直接上源码

/**
     * Call middleware stack
     *
     * @param  ServerRequestInterface $request A request object
     * @param  ResponseInterface      $response A response object
     *
     * @return ResponseInterface
     */
    public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response)
    {
        if (is_null($this->stack)) {
            $this->seedMiddlewareStack();
        }
        /** @var callable $start */
        $start = $this->stack->top();
        $this->middlewareLock = true;
        $response = $start($request, $response);
        $this->middlewareLock = false;
        return $response;
    }