给博客升级成功了

图片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;
    }

开始实现自己的一个 php 框架

第一次想实现一个自己的框架大概是去年的10月份,去年11月份搞过一次,后来因为一些事情卡住了,所以也就不了了之了,眼看一年过去了,自己又积累了很多知识,所以又有了写框架的心思。

这半年看了一些 laravel 和 slim 的源码,所以理解又深刻了一些。

框架的结构大概有了一些想法。

说的很乱,没有什么实质的东西。

目前来说,ioc/di 暂时先没有,可能会有一个 container。模板就不自己实现了。用 twig。

目前路由实现了,但是存在一些问题。还会修改。

主要还是实现完整的 mvc 和 orm 这两个。

图片alt