方法参数的 php 接口联合类型

问题描述 投票:0回答:1

我有一个接口和两个实现它的类。对于接口中的一种方法,两种实现需要不同的参数。一种方法是根本不使用类型或使用联合类型。两者都感觉不对。

class OptionsA {
    public string $someSpecificOptionForA;
    public int $anotherSpecificOptionForA;
    ...

}

class OptionsB {
    public bool $someSpecificOptionForB;
    ...

}

interface InteractsWithQueue {
    public function getNextEntry(OptionsA|OptionsB $options) : QueueEntry;
}

class ProcessorA implements InteractsWithQueue {
      public function getNextEntry(OptionsA|OptionsB $options) : QueueEntry {...}
}

class ProcessorB implements InteractsWithQueue {
      public function getNextEntry(OptionsA|OptionsB $options) : QueueEntry {...}
}
php interface
1个回答
0
投票

接口是关于行为的,而不是关于对象的状态的。基于此,可能这样的解决方案会合适:

 <?php

class QueueEntry {
    public string $text;
    
    
}

class OptionsA {
    public string $someSpecificOptionForA;
    public int $anotherSpecificOptionForA;
}

class OptionsB {
    public bool $someSpecificOptionForB;
}

interface InteractsWithQueue {
    public function getNextEntry() : QueueEntry;
}

class ProcessorA implements InteractsWithQueue {
      private OptionsA $options;

      public function setOptions(OptionsA $options) {
        $this->options = $options;
      }

      public function getNextEntry() : QueueEntry {
          $qe = new QueueEntry;
          $qe->text = "ProcessorA Entry";
          return $qe;
      }
}

class ProcessorB implements InteractsWithQueue {
      private OptionsB $options;

      public function setOptions(OptionsB $options) {
        $this->options = $options;
      }

      public function getNextEntry() : QueueEntry {
          $qe = new QueueEntry;
          $qe->text = "ProcessorB Entry";
          return $qe;
      }
}

class EntityA {
    public function getProcessor(OptionsA $options) : InteractsWithQueue {
        $processor = new ProcessorA;
        $processor->setOptions($options);
        return $processor;
    }
}

class EntityB {
     public function getProcessor(OptionsB $options) : InteractsWithQueue {
        $processor = new ProcessorB;
        $processor->setOptions($options);
        return $processor;
    }
}

$a = new EntityA;
$optsA = new OptionsA;
$a->getProcessor($optsA);
var_dump($a->getProcessor($optsA)->getNextEntry());

$b = new EntityB;
$optsB = new OptionsB;
var_dump($b->getProcessor($optsB)->getNextEntry());
© www.soinside.com 2019 - 2024. All rights reserved.