创建工厂 class?

Creating a factory class?

我找到了这段代码:

class WebsitesTableFactory extends AbstractModelFactory
{
    public function __invoke(ContainerInterface $container)
    {
        $dbAdapter = $container->get('bc_db');
        $tableGateway = $this->initializeTableGateway('websites', $dbAdapter, null, $container->get(Websites::class));
        return new WebsitesTable($tableGateway);
    }
}

我已经习惯的是:

这与那个实现有何不同?

::class 是什么意思?

Zend 版本为 2.5。

PHP Class Constants

::class returns FQCN(完全限定 Class 名称),例如“\Namespace\Path\To\Classname”。


ZF2 - 3 个工厂

在准备 ZF3 时,使用 __invoke(ContainerInterface $container) 代替 createService(ServiceLocatorInterface $serviceManager) 变得很普遍。

它被用作您习惯的默认工厂,被替换为另一个实现另一个接口的工厂,但为 ZF2 到 ZF3 的过渡留有空间。

ZF3 中的标准工厂 class 如下所示:

use Zend\ServiceManager\Factory\FactoryInterface;

class DemoFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        // Do your thing
    }
}

注意: 与 ZF2 不同的 FactoryInterface 使用语句!


升级一切

很明显你还在使用 ZF2。我强烈建议您升级(或开始升级)到 ZF3。您可以 read the migration guide,但我建议您一次性更新所有内容。

我的建议会给您带来大量工作(可能取决于您的应用程序的大小),但所有内容都会是最新的。

我建议进入您的 composer.json 并删除所有版本限制,然后将带有 composer update 的所有内容更新到最新版本。然后从那里开始,由于过时的东西,你将有无穷无尽的错误需要修复。

(可能存在无法升级的包的例外情况,无论出于何种原因,请注意,如果您遵循上述建议,它们可能会导致意外的版本限制)。


您可能需要帮助

另一方面,您不知道 ::class 返回 FQCN,这是非常基本和标准的使用方式,并且已经使用了很长一段时间(自 PHP 5.6(已发布 halfway 2014),如果没记错的话)。因此,以上内容可能过于繁琐,我建议您向同事或具有更多 Zend Framework 开发经验的人寻求帮助。