【问题标题】:Why PHP asks to pass arguments to the anonymous class?为什么 PHP 要求将参数传递给匿名类?
【发布时间】:2021-03-27 17:05:38
【问题描述】:

我正在尝试创建一个扩展抽象类的匿名类。

$trainerEngineClass = new class extends \App\MemoryBoost\TrainerEngine {
    public function __construct($user, $trainer) {
        parent::__construct($user, $trainer);
    }

    // Abstract method implementation here
};

PHP 显示错误:

函数 class@anonymous::__construct() 的参数太少,在第 74 行的 TrainerController.php 中传递了 0,而预期正好是 2

我除了不会调用__construct,但似乎它调用了。我想创建一个,而不是这个类的对象

如何创建类对象?

【问题讨论】:

  • new class 创建一个对象。
  • 创建一个匿名类而不实例化它是完全没用的。您将如何识别您的无名类以实例化它?如果你想要一个类,以正常方式创建一个。如果您想要该对象,请传递您定义的参数。
  • 我从未听说过将create 一词应用于类定义。定义了类,创建了类的对象。什么是“创建类*?它应该做什么?

标签: php oop


【解决方案1】:

最后,您正在实例化一个类,因此构造函数被触发。 documentation 中提到的匿名类对于创建单个和唯一的对象很有用,而不是用于创建模板。

传递参数的语法是:

$trainerEngineClass = new class($user, $trainer) extends \App\MemoryBoost\TrainerEngine {
        public function __construct($user, $trainer) {
            parent::__construct($user, $trainer);
        }

        // Overriden abstract methods
    };

【讨论】:

  • 我是否正确理解无法创建类变量?
  • 查看此资源:stackoverflow.com/questions/534159/…。无论如何,我会改用工厂设计模式
  • 有趣的是PHP似乎不仅定义一个匿名类,而且实例化它。这不起作用:$c=new class(0){function __construct(DateTime$p){}}。但这确实:$c=new class(new DateTime){function __construct(DateTime$p){}}
猜你喜欢
  • 2011-07-03
  • 2019-12-14
  • 1970-01-01
  • 2019-11-23
  • 2011-05-11
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多