警告: TL:DR が発生する可能性があります
PHP 5.3.10 を使用していますが、次の問題があります。私は抽象クラスを持っています。これは、永続化したいDataMapper
特定のもののために拡張されています。DataModel
次のコードは、このトリックを実行します。
abstract class DataMapper {
public abstract function findById($id);
public abstract function fetchAll();
public abstract function save(IModel $model); // DISCUSSION
/* more helper functions here */
}
class PersonMapper extends DataMapper {
public function findById($id) { /* ...magic ... */ }
public function fetchAll() { /* ...magic ... */ }
public function save(IModel $model) { /* ...magic ... */ } // DISCUSSION
}
interface IModel {
public function setOptions(array $options);
public function toArray();
}
abstract class Model implements IModel {
protected $_fields = array();
protected $_data = array();
public function setOptions(array $options) { /* ...magic ... */ }
public function toArray() { /* ...magic ... */ }
public function __construct(array $options = null) { /* ...magic ... */ }
public function __set($name, $value) { /* ...magic ... */ }
public function __get($name) { /* ...magic ... */ }
}
class PersonModel extends Model {
protected $_fields = array('id', 'name', 'passhash', /*...*/);
public function setId($value) {
/* ...Validation happening... */
$this->_data['id'] = $value;
return $this;
}
public function checkPassword($password) { /* ...magic... */ }
}
これはうまく機能しますが、私の感覚では本当に風変わりです。
ご覧のとおり、インターフェイスIModel
を使用して、特定のパラメーターとメソッドのセットが必要であることを DataMapper に伝えることができます。ただし、一部のモデルには、対応する DataMapper が必要とする追加のメソッドがあります。この例ではcheckPassword()
、保存されたハッシュ値に対してパスワードをテストするために使用されるメソッドです。このメソッドは、DataMapper に対して、テストしたばかりのパスワードを再ハッシュし、新しい要件 (パスワード ハッシュ関数の難易度の増加など) のために更新するように指示することもできます。
したがって、私が実際に望んでいるのは、 PersonMapper の署名をに変更することです。PersonMapper::save(PersonModel $model)
たとえば、別の DataMapper をPostMapper::save(PostModel $model)
などに変更します。これは、これらの DataMapper が特定の署名を必要とするためです。したがって、私の理想的なソリューションは次のようになります。
abstract class DataMapper {
public abstract function findById($id);
public abstract function fetchAll();
public abstract function save(Model $model); // UPDATED
}
class PersonMapper extends DataMapper {
public function findById($id) { /* ...magic... */ }
public function fetchAll() { /* ...magic... */ }
public function save(PersonModel $model) { /* ...magic... */ } // UPDATED
}
abstract class Model { /* ...unchanged... */ }
class PersonModel extends Model { /* ...unchanged... */ }
抽象クラスの Update save-Methods とその実装に注目してください。はからPersonModel
継承されModel
ているため、明らかに署名の共通の基本セットを持っているため、これは問題なく機能すると思います。しかし、そうではありません - PHP は子クラス PersonMapper の変更されたインターフェースについて不平を言います
私の質問:
- 関係をよりよく表現する PHP 5.3.10 で動作する別のソリューションはありますか?
- サーバーをアップグレードする価値があるように、それは PHP の新しいバージョンで動作しますか?