假设我有一个接受数组的类:
class Database {
function __construct($options = ['pdo' => '' ]) {
$this->pdo = $options['pdo'];
}
}是否有为数组键指定类的方法?也许是这样的?
class Database {
function __construct($options = [\PDO 'pdo']) {
$this->pdo = $options['pdo'];
}
}发布于 2022-07-15 08:08:10
实际上,用PHP输入提示数组键是不可能的。对此有一些可能的解决方案,但它们中没有一个能处理数组上的类型提示。
验证构造函数中的选项
由于不可能检查特定类型提示的数组键,所以可以使用if条件检查,如果设置了特定的选项,以及它是否是PDO的实例。
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,则使用一个可感知的接口来指出,有一个特定类的实例可用。
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实例是否是在初始化数据库类之前实际设置的。总之..。这可能是一种可能的方法。
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类以迂回的方式进行。
发布于 2022-07-15 07:46:32
PHP没有强类型数组。
取而代之的是使用类或接口来表示$options参数。
interface Options {
public function pdo(): \PDO;
}
class Database {
private \PDO $pdo;
function __construct(Options $options) {
$this->pdo = $options->pdo();
}
}https://stackoverflow.com/questions/72990128
复制相似问题