私は自分のデータベースとのやりとりをすべて処理するPHPクラスを作成しようとしています。この時点で、各クラスは私のデータベースのテーブルを表し、すべてのテーブルで共有されるメソッドを含む拡張するインタフェースまたはクラスを作成したいと考えています。デフォルトメソッドとのインターフェイスPHP
public static function find_by_sql($sql){
global $database;
$response = $database->query($sql);
$object_array = array();
while($next = $database->fetch_array($response)){
$object_array[] = self::instantiate($next);
}
return !empty($object_array) ? $object_array : false;
}
private static function instantiate($result_array){
$object = new static;
foreach($result_array as $attribute=>$value){
if($object->has_attribute($attribute)){
$object->$attribute = $value;
}
}
return $object;
}
私の問題は、インスタンス化メソッドがその子クラスの属性とやり取りする必要があるということです。私はjavaで作業するのに慣れていました。ここでは、これを達成するためのデフォルトのメソッドとともに、抽象メソッドgetterとsetterメソッドをインタフェースで定義することができました。私はPHPで行うことができる何か類似ですか?
この撮影小さなステップをさらに私はまた、次のような方法を含むことができるようにしたい:私はPHPを介して利用可能で実施される方法または他の関数呼び出しからテーブル名を取得
public static function find_by_id($id){
$sql = "SELECT * FROM users WHERE id=\"{$id}\" LIMIT 1";
$result_array = parent::find_by_sql($sql);
return !empty($result_array) ? array_shift($result_array) : false;
}
get_class()関数のようなものです。
'abstract'クラスを使用します。これは通常のクラスで、 'new'キーワードでインスタンス化することはできません。また、標準クラスを使用してそれらから拡張することもできます。あなたが達成したいことに依存します。 'Interfaces'は、何が存在する必要があるのかを定義する一種の' meta'情報ですが、実装されたメソッドはありません。 –
この解決策の唯一の問題は、 'find_by_sql()'を抽象クラスを拡張しているクラスから静的に呼び出すことができないため、 'instantiate()'で 'static'を使用しても機能しなくなることです。 – user2789116
[traits](http://php.net/manual/en/language.oop5.traits.php)? – Alex