Существует нечто, что можно назвать «Классо-Ориентированное Программирование». Об этом мы сегодня и поговорим.
«Классо-Ориентированое Программирование» — это подход написания кода, при котором используются классы, состоящие только из статических методов и свойств, а экземпляр класса никогда не создается. И как вы уже наверное догадались, это не есть хорошо...
https://www.youtube.com/watch?v=DsqH5aKaNU4
6. Выход есть
class Database {
protected static $connection;
public static function connect() {
if (!self::$connection) {
...
}
}
public static function fetchAll($query) {
self::connect();
...
return $data;
}
}
7. Выход плохой
Database привязан к
одной базе данных
передача других
параметров
соединения?
Foo зависит от
состояния Database
8. К чему пришли
function database_connect () {
global $database_connection;
if (!$database_connection) {
...
}
}
function database_fetch_all ($query) {
global $database_connection;
database_connect();
...
return $data;
}
function foo_bar() {
return database_fetch_all( "SELECT * FROM `foo` WHERE `bar` = 'baz'" );
}
9. Попробуем ООП
class Database {
protected $connection;
public function __construct($host, $user, $password) {
$this->connection = some_database_adapter($host, $user, $password);
if (!$this->connection) {
throw new Exception("Couldn't connect to database");
}
}
public function fetchAll($query) {
$data = $this->connection->fetchAll($query);
return $data;
}
}
10. Попробуем ООП
class Foo {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
public function bar() {
return $this->database->fetchAll("SELECT * FROM `foo`
WHERE `bar` = 'baz'");
}
}
$db = new Database('localhost', 'user', 'password');
$foo = new Foo($db);
$bar = $foo->bar();
12. Сравним
class Foo {
public static function bar() {
return Database::fetchAll( "SELECT *
FROM `foo` WHERE `bar` = 'baz'" );
}
}
Database::connect( 'localhost', 'user',
'password');
$bar = Foo::bar();
13. Сравним
class Database {
protected $connection;
public function __construct($host, $user,
$password) {
$this->connection = some_database_adapter
($host, $user, $password);
if (!$this->connection) {
throw new Exception("Couldn't connect
to database");
}
}
public function fetchAll($query) {
$data = $this->connection->fetchAll
($query);
return $data;
}
}
class Foo {
protected $database;
public function __construct(Database $database) {
$this->database = $database;
}
public function bar() {
return $this->database->fetchAll("SELECT * FROM
`foo` WHERE `bar` = 'baz'");
}
}
$db = new Database('localhost', 'user',
'password');
$foo = new Foo($db);
$bar = $foo->bar();