ݺߣ

ݺߣShare a Scribd company logo
Классо-Ориентированое
Программирование
Что это такое и почему это плохо
Helpful Web Development
www.hwebdev.com
www.youtube.com/user/hwebdev
Основные моменты
только
статические
методы
только
статические
свойства
экземпляры не
создаются
Зависимости
class Foo {
public static function bar() {
return Database::fetchAll("SELECT *
FROM `foo` WHERE `bar` = 'baz'");
}
}
Зависимости
Database::connect('localhost', 'user', 'password');
$bar = Foo::bar();
Зависимости
Foo::bar неявно
зависит от доступности
Database
нельзя использовать
Foo без Database
соединение с БД уже
установлено?
Выход есть
class Database {
protected static $connection;
public static function connect() {
if (!self::$connection) {
...
}
}
public static function fetchAll($query) {
self::connect();
...
return $data;
}
}
Выход плохой
Database привязан к
одной базе данных
передача других
параметров
соединения?
Foo зависит от
состояния Database
К чему пришли
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'" );
}
Попробуем ООП
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();
Получилось
реализация попроще
не нужно проверять
состояние в
Database::fetchAll
параметры
подключения не
валидны = ошибка
Сравним
class Foo {
public static function bar() {
return Database::fetchAll( "SELECT *
FROM `foo` WHERE `bar` = 'baz'" );
}
}
Database::connect( 'localhost', 'user',
'password');
$bar = Foo::bar();
Сравним
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();
Абстракция
Application::start();
User::getData();
Database::fetchAll(...);
Отдельные части
Application Database
DatabaseDriver User
www.youtube.com/user/hwebdev
www.hwebdev.com

More Related Content

Классо-Ориентированное Программирование