Процедурный и объектно-ориентированный интерфейс

Модуль mysqli предоставляет двойной интерфейс программисту. Поддерживаются как процедурная, так и объектно-ориентированная парадигмы программирования.

Пользователи, переходящие со старого модуля mysql, возможно, предпочтут процедурный интерфейс. Он весьма схож с интерфейсом старого модуля, и во многих случаях функции отличаются только префиксом в имени. Некоторые mysqli-функции принимают дескриптор соединения первым аргументом, в отличие от соответствующих им функций старого модуля, которые принимают его в качестве последнего необязательного аргумента.

Пример #1 Простота перехода со старого модуля mysql

<?php
$mysqli
= mysqli_connect("example.com", "user", "password", "database");
$result = mysqli_query($mysqli, "SELECT 'Пожалуйста, не используйте устаревший модуль mysql в новых проектах.' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo
$row['_msg'];

$mysql = mysql_connect("example.com", "user", "password");
mysql_select_db("test");
$result = mysql_query("SELECT 'Используйте вместо него модуль mysqli.' AS _msg FROM DUAL", $mysql);
$row = mysql_fetch_assoc($result);
echo
$row['_msg'];
?>

Результат выполнения приведённого примера:

Пожалуйста, не используйте устаревший модуль mysql в новых проектах. Используйте вместо него модуль mysqli.

Объектно-ориентированный интерфейс

В дополнение к процедурному пользователи могут использовать объектно-ориентированный интерфейс. Документация заточена именно под объектный интерфейс. Объектно-ориентированный интерфейс предлагает функции сгруппированные по цели их применения, что облегчает их поиск и освоение. Тем не менее, в практических примерах к функциям приводится код для обеих парадигм.

Каких-либо принципиальных отличий в производительности между интерфейсами нет. Пользователи вольны в выборе интерфейса, основываясь на личных предпочтениях.

Пример #2 Объектно-ориентированный и процедурный интерфейсы

<?php

$mysqli
= mysqli_connect("example.com", "user", "password", "database");

$result = mysqli_query($mysqli, "SELECT 'Мир, полный ' AS _msg FROM DUAL");
$row = mysqli_fetch_assoc($result);
echo
$row['_msg'];

$mysqli = new mysqli("example.com", "user", "password", "database");

$result = $mysqli->query("SELECT 'выбора, чтобы угодить всем.' AS _msg FROM DUAL");
$row = $result->fetch_assoc();
echo
$row['_msg'];

Результат выполнения приведённого примера:

Мир, полный выбора, чтобы угодить всем.

Примеры в этом руководстве будут написаны в объектном стиле в виду того, что объектному подходу отдавалось предпочтение при создании документации.

Смешивание стилей

Переключаться между стилями программирования можно сколь угодно часто и в любое время, однако делать этого не рекомендуется, так как это ухудшает читаемость кода и затрудняет его поддержку.

Пример #3 Плохой стиль программирования

<?php

$mysqli
= new mysqli("example.com", "user", "password", "database");

$result = mysqli_query($mysqli, "SELECT 'Этот код работает, но лучше так не писать.' AS _msg FROM DUAL");

if (
$row = $result->fetch_assoc()) {
echo
$row['_msg'];
}

Результат выполнения приведённого примера:

Этот код работает, но лучше так не писать.

Смотрите также

add a note add a note

User Contributed Notes 2 notes

up
27
Anonymous
9 years ago
Just want to add that both procedural mysqli_connect_errno and mysqli_connect_error DON'T accept any arguments!
http://php.net/manual/de/mysqli.connect-errno.php
http://php.net/manual/de/mysqli.connect-error.php
"int mysqli_connect_errno ( void )"
"string mysqli_connect_error ( void )"
It clearly states "void" there.

Adding the mysqli-Instance as a parameter makes it look like it pulls the error-number out of the provided instance, which is not actually happening. This could end in a hard to detect bug when connecting to multiple SQL servers.
And it is confusing for beginners.
up
-20
Anonymous
8 years ago
I don't know whether I can put my opinion here, but yet…

I don't think that mixing styles is so bad idea. Yes, maybe it isn't good when working in a team, but if you work on a code on your own and it's convenient for you - why not?

For example, I prefer the OO style generally. But when it comes to setting connection, the procedural style provides opportunity to use easy 'or' syntax:

<?php
$connection
= @mysqli_connect('localhost', 'root', '1234', 'db') or die('Connect Error (' . mysqli_connect_errno() . ') ' . mysqli_connect_error());
?>

which is more convenient for me than:

<?php
$connection
= @new mysqli('localhost', 'root', '1234', 'db');
if (
$conn->connect_errno) {
    die(
'Connect Error (' . $connection->connect_errno() . ') ' . $connection->connect_error());
}
?>

So why shouldn't I use the procedural style when setting connection?
To Top