0

我正在尝试在我的 Zend Expressive APP 中创建一个类(作为工厂类工作),如下所示:

declare(strict_types=1);

namespace App\Install\Factory;

use App\Install\Model as Models;
use App\Install\Abstracts\AttributeInterface;

class AttributeEntityFactory{

    public static function create($type1 ='Attribute') : AttributeInterface
    {
        $resolvedClass = "Models\\$type1";
        $resolvedClass1 = 'Models\\'.$type1;
        //return new $resolvedClass();
        //return new $resolvedClass1();
        return new Models\Attribute();
    }
}

上面的代码非常适合我。但是,如果尝试使用它显示的其他两个返回语句中的任何一个

找不到类“模型\属性”

如何实现动态实例化?

属性类代码如下:

namespace App\Install\Model;
use App\Install\Abstracts\AttributeInterface;

class Attribute implements AttributeInterface
{
    protected $attribute;

    public function setAttribute($attribute)
    {
        $this->attribute = $attribute;
    }

    public function getAttribute()
    {
        return $this->attribute;   
    }  
}

我的 PHP 版本是:

PHP 7.2.13 (cli) (内置: Dec 14 2018 04:20:16) (NTS)

4

2 回答 2

0

就个人而言,由于以下几个原因,我会避免这种工厂实施:

  1. 它涉及魔法。
  2. 不太可预测的代码。
  3. Attribute人类和 IDE 都更难阅读(例如:当您需要查找类时,PHPStorm 不会在此类代码中找到类的用法)
  4. 使用静态分析器更难分析

相反,我会将其重写为更明确的工厂,即使我在App\Install\Model命名空间中有几十个不同的类:

<?php declare(strict_types=1);

namespace App\Install\Factory;

use App\Install\Model as Models;

class AttributeEntityFactory
{
    public static function create($type = 'Attribute') : AttributeInterface
    {
        switch ($type) {
            case 'Attribute':
                return new Models\Attribute();
            case 'SomethingElse':
                return new Models\SomethingElse();
            default:
                throw new \InvalidArgumentException(
                    sprintf('An unknown type %s requested from %s', $type, __METHOD__)
                );
        }
    }
}

根据经验:

  • 永远不要使用与变量/参数/常量连接的字符串来组合类名/命名空间。
  • 也不要以这种方式调用方法。

当您的应用程序/业务/代码库增长足够时,您会感谢我。

于 2019-03-10T21:57:50.677 回答
0

您可能需要传入完整的命名空间?

"App\Install\Model\" . $type1;

和更多...

您拥有的模型属性位于命名空间App\Install\Model中,而您尝试创建的对象来自Models\\ . $type1

也许您需要更改ModelsModel

于 2019-02-27T11:27:57.937 回答