Composer 中自动加载 autoload_static 问题
在composer中新增加了一个 autoload_static 文件并且出现了如图提示,上网搜索资料也没有关于此问题,所以在此希望有知道的能帮忙解答一下!谢谢~~
关于 LearnKu
看来不是我一个人遇到这个问题。
IDE 报语法错误,$loader 在别的类里面使用了私有成员。
但是这个代码可以运行。
先说一下为什么会有autoload_static.php 这个文件,代码里面其实有说明。
composer的releases的说明中有写到
在composer 1.1.0 版本开始如果php的版本大于5.6 ,composer 会进行加载优化。
那么问题来了,IDE报这个语法错误其实是误报了,关键在这个Closure::bind 方法上。
可以看一下手册的解释,bind方法手册 。 手册上说的一堆bulabula,我也不是看很明白~
写了demo模拟下这个getInitializer方法,结果是确实闭包里面可以访问和修改它use 的那个对象的私有属性,代码是可以正常运行的。
总结:
活到老学到老。。。。
我试了一下,假如把Closure::bind()的最后一个参数改为null
就会报错: Fatal error: Cannot access private property Composer\Autoload\ClassLoader::$prefixLengthsPsr4 in
下面再看看官方文档对Closure::bind()第三个参数的解释:
想要绑定给闭包的类作用域,或者 'static' 表示不改变。如果传入一个对象,则使用这个对象的类型名。 类作用域用来决定在闭包中 $this 对象的 私有、保护方法 的可见性。
大概意思就是:这个参数用来改变闭包中类的作用域。那么,ClassLoader中的私有属性就对闭包可见了。
以后如果想在类的外面改变一个类的私有属性,是不是就可以这样搞了?
@许胜斌 不可以,按照手册的功能描述,只是在一个自定义的闭包中,来使用这个类对象以及透明化,只是临时改变类私有属性和方法,否则太恐怖了啊~
composer update --no-scripts 执行下这个命令能解决此问题,参考地址:https://stackoverflow.com/questions/284686...
可以装个扩展
composer require barryvdh/laravel-ide-helper
还有代码提示、跟踪功能