首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输入函数参数的数组键

输入函数参数的数组键
EN

Stack Overflow用户
提问于 2022-07-15 06:58:34
回答 2查看 66关注 0票数 0

假设我有一个接受数组的类:

代码语言:javascript
复制
class Database {
   function __construct($options = ['pdo' => '' ]) {
      $this->pdo = $options['pdo'];
   }
}

是否有为数组键指定类的方法?也许是这样的?

代码语言:javascript
复制
class Database {
   function __construct($options = [\PDO 'pdo']) {
      $this->pdo = $options['pdo'];
   }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-15 08:08:10

实际上,用PHP输入提示数组键是不可能的。对此有一些可能的解决方案,但它们中没有一个能处理数组上的类型提示。

验证构造函数中的选项

由于不可能检查特定类型提示的数组键,所以可以使用if条件检查,如果设置了特定的选项,以及它是否是PDO的实例。

代码语言:javascript
复制
class Database
{
    protected PDO $pdo;

    function __construct(array $options)
    {
        if (!isset($options['pdo']) || !$options['pdo'] instanceof PDO) {
            // error handling here
        }

        $this->pdo = $options['pdo'];
    }

}

使用接口

界面的使用在这里是显而易见的。其他的,例如Doctrine或Laminas,则使用一个可感知的接口来指出,有一个特定类的实例可用。

代码语言:javascript
复制
interface PdoAwareInterface
{
    public function getPdo(): PDO;
    public function setPdo(PDO $pdo): void;
}

class Database implements PdoAwareInterface
{
    protected PDO $pdo;

    public function __construct(array $options = [])
    {
        ...
    }

    public function getPdo(): PDO
    {
        return $this->pdo;
    }

    public function setPdo(PDO $pdo): void
    {
        $this->pdo = $pdo;
    }
}

class DatabaseFactory 
{
    public function __invoke()
    {
        $pdo = new PDO(...);
    
        $database = new Database([]);
        $database->setPdo($pdo);

        return $database;
    }
}

如您所见,PDOAwareInterface是实现的。它指出,PDO实例是可感知的。您可以在工厂中使用它,通过接口实现方法来设置pdo实例。

选项接口

在接口中使用选项本身有点麻烦,因为在这里,您无法确定PDO实例是否是在初始化数据库类之前实际设置的。总之..。这可能是一种可能的方法。

代码语言:javascript
复制
interface DatabaseOptionsInterface
{
    public function getPdo(): PDO;
}

class DatabaseOptions implements DatabaseOptionsInterface
{
    protected PDO $pdo;

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    public function getPdo(): PDO
    {
        return $this->pdo;
    }

}

class Database 
{
    protected PDO $pdo;

    public function __construct(DatabaseOptionsInterface $options)
    {
        $this->pdo = $options->getPdo();
    }
}

class DatabaseFactory
{
    public function __invoke()
    {
        $pdo = new PDO(...);
        $options = new DatabaseOptions($pdo);

        $database = new Database($options);

        return $database;
    }
}

基本上类似于使用AwareInterface初始化,但通过一个额外的DatabaseOptions实例。

结论

就我个人而言,我倾向于感知,因为在这里,我总是可以检查对象是否已准备好持有某个实例。例如,这只能通过options类以迂回的方式进行。

票数 1
EN

Stack Overflow用户

发布于 2022-07-15 07:46:32

PHP没有强类型数组。

取而代之的是使用类或接口来表示$options参数。

代码语言:javascript
复制
interface Options {
    public function pdo(): \PDO;
}

class Database {
    private \PDO $pdo;

    function __construct(Options $options) {
        $this->pdo = $options->pdo();
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72990128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档