@phpcoder81

Как передать объект БД в класс?

Мужики, запутался. Есть базовый класс App, в который должен быть передан объект БД PDO. У меня три варианта решения, но я чёт запутался с передачей, не пойму, какой лучше (верный), хотя работают все.
Вариант 1
class App{
  protected $db;
  public function __construct(){
    $this->db = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pass');
  }
}


Вариант 2
class App{
  protected $db;
  public function initDB(PDO $db){		
    $this->db = $d;
  }
}

class DB{
  public $db;
  public function instance(){
    $this->db = new PDO('mysql:host=localhost;dbname=dbname','user','pass');
    return $this->db;
  }
}

$app = new App();
$db = new DB();
$app->initDB($db->instance());


Вариант 3
class App{
  protected $db;
  public function initDB(PDO $db){
    $this->db = $d;
  }
}

class DB{
  public $db;
  public function __construct(){
    $this->db = new PDO('mysql:host=localhost;dbname=dbname','user','pass');
  }
}
$db = new DB();
$app = new App();
$app->initDB($db);
  • Вопрос задан
  • 242 просмотра
Пригласить эксперта
Ответы на вопрос 4
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Классический DI
class App{
  protected $db;
  public function __construct($db){
    $this->db = $db;
  }
}
Ответ написан
amark
@amark
rush less, feel more
Зачем вам дополнительный объект DB? Если он нужен только для инициализации подключения к базе, то вы просто так расходуете память.
Фактически, вы сделали класс-обертку над PDO. Хотя в текущей реализации я не вижу в этом никакой необходимости.

Я бы не стал усложнять то, что без усложнения работает. Зачем городить лишние классы и объекты??
Идите от потребности. Надо контролировать создание подключения? — делайте initDB(), не надо контролировать, а объект всегда создается при объявлении App(), то и класс лишний не нужен.
Как кто-то сказал: "усложнять — легко, упрощать — сложно". Не усложняйте себе жизнь))
Ответ написан
KorniloFF
@KorniloFF
Работаю по font-end / JS
<?
class App{
  protected static $_instance;

  private function __construct(){
    return new PDO('mysql:host=localhost;dbname=dbname','user','pass');
  }

  # Singlton methods
	public static function getInstance()
	{
		self::$_instance = self::$_instance ?? new self;
		return self::$_instance;
	}

	private function __clone() {}

	private function __wakeup() {}
}

# Init
App::getInstance();
?>


lifeexample.ru/php-primeryi-skriptov/php-singleton...
Ответ написан
hack504
@hack504
2 вариант нужен, если экземпляр класса DB будет ещё где-то использоваться помимо App. А также, если классы немного подкорректировать, то можно сделать LazyLoad подключение к БД в классе App.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы