赶知识网

hyperf框架 Inject无效情况 PHP Fatal error: Uncaught Error: Call to a member function xxxx() on null in

2023-05-23 / 469次点击 php/mysql/apache hyperf

官方提供的有两种情况,可以参见官网,除了官网的情况,如果仍旧遇到这类error,可以运行以下命令

composer dump-autoload -o

即可解决


还有一种情况,如果在unix系统环境下,route.php文件的类路径大小写不正确的情况,也会导致产生报错。


Inject 或 Value 注解不生效

2.0 使用了构造函数中注入 Inject 和 Value 的功能,以下两种场景,可能会导致注入失效,请注意使用。

  1. 原类没有使用 Inject 或 Value,但父类使用了 Inject 或 Value,且原类写了构造函数,同时又没有调用父类构造函数的情况。

这样就会导致原类不会生成代理类,而实例化的时候又调用了自身的构造函数,故没办法执行到父类的构造函数。 所以父类代理类中的方法 __handlePropertyHandler 就不会执行,那么 Inject 或 Value 注解就不会生效。

class ParentClass {     /**      * @Inject      * @var Service      */     protected $value; } class Origin extends ParentClass {     public function __construct() {} }Copy to clipboardErrorCopied
  1. 原类没有使用 Inject 或 Value,但 Trait 中使用了 Inject 或 Value

这样就会导致原类不会生成代理类,故没办法执行构造函数里的 __handlePropertyHandler,所以 Trait 的 Inject 或 Value 注解就不会生效。

trait OriginTrait {     /**      * @Inject      * @var Service      */     protected $value; } class Origin {     use OriginTrait; }Copy to clipboardErrorCopied

基于上述两种情况,可见 原类 是否生成代理类至关重要,所以,如果使用了带有 Inject 或 Value 的 Trait 和 父类 时,给原类添加一个 Inject,即可解决上述两种情况。

 use Hyperf\Contract\StdoutLoggerInterface; trait OriginTrait {     /**      * @Inject      * @var Service      */     protected $trait; } class ParentClass {     /**      * @Inject      * @var Service      */     protected $value; } class Origin extends ParentClass {     use OriginTrait;     /**      * @Inject      * @var StdoutLoggerInterface      */     protected $logger; }


作者:cc卡耐基

链接:https://www.jianshu.com/p/cff8a6d40198

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


Top10

沪ICP备09053415号 © 赶知识网