Composer 中自动加载 autoload_static 问题

在composer中新增加了一个 autoload_static 文件并且出现了如图提示,上网搜索资料也没有关于此问题,所以在此希望有知道的能帮忙解答一下!谢谢~~
file

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 6

看来不是我一个人遇到这个问题。
IDE 报语法错误,$loader 在别的类里面使用了私有成员。
但是这个代码可以运行。
先说一下为什么会有autoload_static.php 这个文件,代码里面其实有说明。

$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
 if ($useStaticLoader) {
      require_once __DIR__ . '/autoload_static.php';
      call_user_func(\Composer\Autoload\ComposerStaticInit8a7582a76d95760eed90a5b1afa5a110::getInitializer($loader));
 }
// ...

composer的releases的说明中有写到

Optimized the autoloader initialization using static loading on PHP 5.6 and above, this reduces the load time for large classmaps to almost nothing

在composer 1.1.0 版本开始如果php的版本大于5.6 ,composer 会进行加载优化。

那么问题来了,IDE报这个语法错误其实是误报了,关键在这个Closure::bind 方法上。
可以看一下手册的解释,bind方法手册 。 手册上说的一堆bulabula,我也不是看很明白~
写了demo模拟下这个getInitializer方法,结果是确实闭包里面可以访问和修改它use 的那个对象的私有属性,代码是可以正常运行的。

总结:
活到老学到老。。。。

7年前 评论

我试了一下,假如把Closure::bind()的最后一个参数改为null

public static function getInitializer(ClassLoader $loader)
{
    return \Closure::bind(function () use ($loader) {
        $loader->prefixLengthsPsr4 = ComposerStaticInit42667672d2867dbce252b66c6327abda::$prefixLengthsPsr4;
        $loader->prefixDirsPsr4 = ComposerStaticInit42667672d2867dbce252b66c6327abda::$prefixDirsPsr4;
        $loader->prefixesPsr0 = ComposerStaticInit42667672d2867dbce252b66c6327abda::$prefixesPsr0;

    }, null, null);
}

就会报错: Fatal error: Cannot access private property Composer\Autoload\ClassLoader::$prefixLengthsPsr4 in

下面再看看官方文档对Closure::bind()第三个参数的解释:
想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。
大概意思就是:这个参数用来改变闭包中类的作用域。那么,ClassLoader中的私有属性就对闭包可见了。
以后如果想在类的外面改变一个类的私有属性,是不是就可以这样搞了?

6年前 评论

@许胜斌 不可以,按照手册的功能描述,只是在一个自定义的闭包中,来使用这个类对象以及透明化,只是临时改变类私有属性和方法,否则太恐怖了啊~

6年前 评论

composer update --no-scripts 执行下这个命令能解决此问题,参考地址:https://stackoverflow.com/questions/284686...

5年前 评论
Haven

可以装个扩展
composer require barryvdh/laravel-ide-helper
还有代码提示、跟踪功能

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!