Инъекция зависимостей в PHP

Я занимаюсь поиском зависимостей.

  • Я на что-то или полностью выключен?
  • Является ли код хорошим или плохим – инъекция зависимостей или нет?

Нижеприведенный код является основой для системы CMS

Прямо сейчас есть таблица под названием «page_details» со всеми сохраненными в ней веб-страницами.

Структура каталога / файла

.htaccess index.php classes/Db.class.php classes/Page.class.php config/config.php config/init.php 

.htaccess

 # Mod rewrite enabled. Options +FollowSymLinks RewriteEngine on # ---- Rules ---- RewriteRule ^([A-Za-z0-9-_]+)\.html$ index.php?page=$1 [NC,L] 

index.php

 <?php require_once ('config/init.php'); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-type" content="text/html; charset=iso-8859-1" /> <meta http-equiv="imagetoolbar" content="no" /> <title></title> <meta name="Description" content="" /> <meta name="Keywords" content="" /> <link href="/css/styles.css" media="screen" rel="Stylesheet" type="text/css" /> </head> <body> <?php $page = new Pages($db); print_r($page->get_page($_GET['page'])); ?> </body> </html> 

Db.class.php

 <?php class Db { private $dbhost; private $dbuser; private $dbpassword; private $dbname; private $connection; public $query; function __construct($dbhost, $dbuser, $dbpassword, $dbname) { $this->dbhost = $dbhost; $this->dbuser = $dbuser; $this->dbpassword = $dbpassword; $this->dbname = $dbname; } public function open_connection() { try { $this->connection = mysqli_connect($this->dbhost, $this->dbuser, $this-> dbpassword, $this->dbname); } catch (exception $e) { throw $e; } } public function close($query) { try { mysqli_close($this->connection); } catch (exception $e) { throw $e; } } public function query($query) { try { $this->open_connection(); $result = mysqli_query($this->connection, $query); return $result; } catch (exception $e) { throw $e; } $this->close_connection(); } public function fetchArray($query) { $row = mysqli_fetch_assoc($query); return $row; } public function count_rows($query) { $row = mysqli_num_rows($query); return $row; } public function rows_affected() { $row = mysqli_affected_rows($this->connection); return $row; } public function created_id() { $row = mysqli_insert_id($this->connection); return $row; } } ?> 

Page.class.php

 <?php class Pages { private $db; function __construct($db) { $this->db = $db; } function get_page($seo_url) { $sql = $this->db->query("SELECT * FROM page_details WHERE seo_url='$seo_url'"); $row = $this->db->fetchArray($sql); return $row; } } ?> 

config.php

 <?php $config = array(); $config['dbtype'] = 'mysqli'; $config['dbhost'] = 'localhost'; $config['dbname'] = 'name'; $config['dbuser'] = 'user'; $config['dbpassword'] = 'password'; $config['absolute_path'] = '/var/www/vhosts/example.com/httpdocs'; $config['website_root'] = 'http://www.example.com/'; $config['dummy'] = ''; ?> 

init.php

 <?php require_once ('config/config.php'); function __autoload($class_name) { require_once (''.$config['absolute_path'].'classes/' . $class_name . '.class.php'); } $db = new Db($config['dbhost'], $config['dbuser'], $config['dbpassword'], $config['dbname']); ?> 

    Я не уверен, как вы ожидаете получить __autoload для __autoload (я не вижу, что вы вызываете new someclass любом месте вашего кода), но на __autoload используя __autoload для автоматического включения классов, которые должны быть загружены, является хорошей идеей , и вы используете его правильно.

    Некоторые общие комментарии к вашему коду:

    1. Я бы использовал PDO вместо mysqli напрямую – он несколько безопаснее (SQL-инъекция мудрый), больше будущего доказательства, и я думаю, что это также проще.
    2. Я бы проверял, что файл d require существовать, прежде чем пытаться его потребовать, и выкиньте замечательное исключение, которое может быть уловлено приложением и сообщается красивым образом.
    3. вы, вероятно, хотите print свой контент, а не print_r , но я думаю, вы это делаете для отладки.

    Инъекция зависимостей – это DB -> Страницы? Да, хорошо выглядит. Это кажется разумным подходом.

    Вот идея инкапсуляции (не DI): вы можете подумать, что вы получаете из класса Pages. Сейчас он просто дает вам имя таблицы db. Что, если это была Page ? Вместо того, чтобы возвращать $ row данных, он может владеть им. Затем вы можете добавить методы на Page чтобы получить доступ к этим различным столбцам данных страницы. Эта архитектура предоставит вам место для размещения любого кода о странице. Это было бы вместо перехода непосредственно в строку $ в отображаемом коде (теперь строка print_r ).