[解決済み】PHPで複数のコンストラクタを行うための最良の方法
2022-03-25 09:58:23
質問
引数のシグネチャが一意である __construct 関数を、PHP のクラス内にふたつ置くことはできません。これを実行したいのですが。
class Student
{
protected $id;
protected $name;
// etc.
public function __construct($id){
$this->id = $id;
// other members are still uninitialized
}
public function __construct($row_from_database){
$this->id = $row_from_database->id;
$this->name = $row_from_database->name;
// etc.
}
}
PHPでこれを行うには、どのような方法があるのでしょうか?
どのように解決するのですか?
私なら、こんな風にするかな。
<?php
class Student
{
public function __construct() {
// allocate your stuff
}
public static function withID( $id ) {
$instance = new self();
$instance->loadByID( $id );
return $instance;
}
public static function withRow( array $row ) {
$instance = new self();
$instance->fill( $row );
return $instance;
}
protected function loadByID( $id ) {
// do query
$row = my_awesome_db_access_stuff( $id );
$this->fill( $row );
}
protected function fill( array $row ) {
// fill all properties from array
}
}
?>
次に、IDがわかっているStudentが必要な場合。
$student = Student::withID( $id );
または、DBの行の配列を持っている場合。
$student = Student::withRow( $row );
技術的には、複数のコンストラクタを作成するのではなく、静的なヘルパーメソッドを作成するだけですが、この方法でコンストラクタ内の多くのスパゲッティコードを回避することができます。
関連
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み】Netbeans 7.4 for PHPで「スーパーグローバルな$_POST配列に直接アクセスしないでください」という警告が発生する。
-
[解決済み] Forbidden :このサーバーの /phpmyadmin にアクセスする権限がありません。
-
[解決済み] PHPで配列から要素を削除する
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] C#のオートプロパティに初期値を与える最良の方法は何ですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】XAMPPポート80をPID 4の「Unable to open process」が使用中 [重複] XAMPPポート80をPID 4の「Unable to open process」が使用中。]
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み】不明なMySQLサーバーのホスト
-
[解決済み] php5パッケージのインストール候補がない (Ubuntu 16.04)
-
[解決済み】子テーマのCSSが親テーマをオーバーライドしない
-
[解決済み] 警告:mysqli_fetch_array()は、パラメータ1がmysqli_resultであることを期待する、オブジェクトはで指定された。
-
[解決済み】PDOException SQLSTATE[HY000] [2002] そのようなファイルまたはディレクトリがありません。
-
[解決済み】/var/www/htmlとは何ですか?[クローズド]
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。