JimChen

陈君武
第 16283 位会员
注册于 1年前
活跃于 10小时前

PHP工程师 @ 广州油梨科技


话不投机半句多!
最近发表的话题
最近发表的评论
  • Laravel 源码阅读之二:Illuminate\Foundation\Application 类初始化分析 at 1周前

    回答几个问题:

    1. instance方法的执行过程还是比较不好理解,绕来绕去的,看不明白为什么要bound、rebound、unset等......
      一眼看过去是觉得没必要,因为请求进来才初始化,那些东西当然就没有初始化啦。但是,我们这样的认识是基于fpm的运行模型,每一个请求都是独立,请求完毕之后php程序自动销毁。然而,要是你的PHP程序是常驻内存呢,比如swoole应用,那么就不是一回事了。

    2. 关于无限嵌套
      其实就是下面这两句代码的效果,把自身对象绑定到自身的一个变量中,相当于自身变量保存自身的一个引用,所以看起来像无限嵌套,其实在内存中只有一个对象

      static::setInstance($this);
      $this->instance('app', $this);

      这其实是一种软件设计的方法,你要是问我为什么我在GoF中没有找到这种模式啊,我只能说设计模型不是一种成文的知识体系,都是经验之谈而已,是前辈们在软件设计开发中的血泪教训总结出来的,并不是“银弹”。
      其实你在第一次写单例的时候不也写过类似的代码吗?

      class Singleton {
      private static $instance = null;
      public static function getInstance() {
          if (null === static::$instance) {
              static::$instance = new Singleton ();
          }
          return static::$instance;
      }
      private __construct() {}
      private __clone() {}
      }
    3. 对于 app 这个别名,当你使用app('app')获取容器实例时,已经不会走别名解析,还是上面说到的

      $this->instance('app', $this);

      已经绑定到instances数组的实例,就会直接取,所以app('app')获取到的就是Illuminate\Foundation\Application的一个实例。我们可以关注其它,比如app('queue'),我们知道

      public function registerCoreContainerAliases()
      {
      foreach ([
          ...
          'queue'                => [\Illuminate\Queue\QueueManager::class, \Illuminate\Contracts\Queue\Factory::class, \Illuminate\Contracts\Queue\Monitor::class],
          ...
      ] as $key => $aliases) {
          foreach ($aliases as $alias) {
              $this->alias($key, $alias);
          }
      }
      }

      queue 绑定三个命名空间,当我们 app('queue') 时,

      protected function resolve($abstract, $parameters = [])
      {
          $abstract = $this->getAlias($abstract);
      
          $needsContextualBuild = ! empty($parameters) || ! is_null(
              $this->getContextualConcrete($abstract)
          );
      
         ...
         $concrete = $this->getConcrete($abstract);
      
         ...
      }

      由于'queue'就是别名getAlias()会直接返回,我们看getConcrete(),里面调用getContextualConcrete($abstract),继续看可以看到,所以清楚了吧?

      foreach ($this->abstractAliases[$abstract] as $alias) {
      if (! is_null($binding = $this->findInContextualBindings($alias))) {
          return $binding;
      }
      }

      其中比较绕的是关于容器如何去实例化一个对象,中间有很多寻找对象类的步骤。

  • PHP RFC: Preloading at 1个月前

    兜兜转转,最终还是发现Java那一套技术规范是最适合工程领域的......

  • @Littlesqx 在 2018-10-20 23:02:12 的动弹 at 2个月前

    鸟哥,峰哥,有赞的Demon

  • @Littlesqx 在 2018-09-15 11:56:21 的动弹 at 3个月前

    还可以吧:joy:我感觉挺快的

  • dingo/API 问题,Ajax 请求报错? at 5个月前

    因为dingo/api默认是使用restful规范,通过HTTP Status Code来判断API请求成功与否,所以最好你前端也遵循以下restful规范就好,通过HTTP Status Code去判断,而且所谓JavaScript会报错,是因为JavaScript接收到422的HTTP Statue Code之后会抛出异常,你没有去处理所以才在console显示错误,只要在你用的HTTP请求库适当的地方去捕获和处理这些异常就行。如果你前端实在只想通过API返回的 code 去做下一步操作,那么你可以参考,自定义dingo/api异常响应。

  • 想问一下<=>是什么意思? at 5个月前

    为什么会排序,是因为executeStrategy方法中执行了排序函数,采用uasort进行排序,策略就体现在采用什么样的回调函数,引入不同的排序类,就会实现不同的排序。

  • 为什么我的运行总是出错呢? at 5个月前

    没有引入composer的自动加载吧,一般PHPunit下,在配置文件phpunit.xml可以配置一下bootstrap,在该文件下添加composer的自动加载,那么每次运行测试时先执行bootstrap之后你就可以使用composer加载各种符合psr-4规范的命名空间了

  • Laravel5.6 配置文件缓存的问题? at 6个月前

    以下是5.4
    https://github.com/laravel/framework/blob/5.4/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L20

    以下是5.6
    https://github.com/laravel/framework/blob/5.6/src/Illuminate/Foundation/Bootstrap/LoadEnvironmentVariables.php#L21

    一样的,当判断到你配置的缓存文件存在,就不会进行加载.env文件变量的操作,这里操作包括putenv("key=value")$_ENV[key]=value$_SERVER[key]=value,所以当你config:cache之后,使用env()获取.env文件变量就会失效,注意env()是使用getenv()来获取变量值,没有进行putenv()自然getenv()会返回falseenv()就会只返回默认值。

  • $this->response 和 $this->response () 的区别? at 6个月前

    我猜你是想问 Dingo Api 这个库的 API 吧,在 Controller 中引入它的 Heplers Trait,先看看它的源码,其拥有 response() 的 API,所以 $this->response() 调用很清晰,那么针对 $this->response, 你可以看看 Trait 里面的 __get() 魔术方法的重写

    file

    代码写得很清楚了,如果不知道魔术方法的作用先行去了解,所以? :confused:

  • 有偿请教 sql 问题? at 6个月前

    @Mr_Guo SELECT SUM(money) FROM a WHERE `status` in (2,3) GROUP BY `status` 看看是不是你需要的?

  • 有偿请教 sql 问题? at 6个月前

    看不懂...你不如把问题抽象出来一张表以及数据,然后说出你想要的结果集。

  • PHP 生成更好的随机数 at 8个月前

    你好,我想请问下呢,第二张图怎么模拟到的,我直接用gd库模拟出来的效果和第一张图差不多啊,用的是rand和mt_rand 都一样,环境是PHP7

  • 【大刀阔斧的改造】在学习了两遍之后,基于教程开发的校园二手书交易平台:) at 9个月前

    感觉界面做得很漂亮啊!!!

  • 请问 PHPHub5 有没有后台? at 9个月前

    @CaiBenBen 那么就是没有权限了,你要分配管理员权限

  • 请问 PHPHub5 有没有后台? at 9个月前

    你要登录啊,没有登录怎么让你进入后台管理,phphub的管理员也是普通用户来的,只是分配的权限不同

  • Laravel 怎么通过关联字段排序? at 9个月前

    你想一想,laravel关联模型是怎么实现的?它没有使用join而是直接拆分成两条SQL,后一条SQL的结果集基于前一条SQL的结果集的id集,那么如果你想按照哪个字段排序就是用那个字段所在的表关联另外的表,如果要跨表两个字段分别排序,是否可以考虑一下冗余字段,实在不行就可以考虑一下join是否满足需求。

  • 各位大神 使用 Laravel 框架出现图片不显示? at 9个月前

    你看看 nginx 的配置,配置指向一下静态资源的目录,注意权限

  • Laravel 的 CRSF 如果不合法如何提示? at 9个月前

    如果你是采用ajax请求就没必要使用csrf了,采用token验证不就更好,csrf对于传统表单提交会更好

  • 请问如何对中文部分的验证消息改写? at 9个月前

    请看文档,包括overtrue/laravel-langreadme文档

  • 获取个人信息失败时,如何自定义 status 以及 message? at 9个月前

    你是使用dingo/api吧?可以看看 自带中间件的 api.auth 实现,

    文档也有说可以自定义身份验证

    自己继承重写一下\Dingo\Api\Auth\Provider\JWTauthenticate 方法,把token获取判断一下是不是空的,自定义一个异常抛出。