PHP 8.1.0 Beta 1 available for testing

手続き型とオブジェクト指向インターフェイス

mysqli 拡張機能は、 ふたつのインターフェイスを提供しています。 手続き型とオブジェクト志向のインターフェイスです。

古い mysql 拡張機能から移行するユーザーは、 手続き型のインターフェイスを好むかもしれません。 手続き型のインターフェイスは、古い mysql 拡張機能のそれに似ています。 多くの場合、関数名はプレフィックスのみが異なりますが、 mysqli の関数によっては、最初の引数に接続ハンドルを取るものもあります。 一方で、それと一致する古い mysql 拡張機能のインターフェイスは、 オプションの接続ハンドルを最後にとるようになっています。

例1 古い mysql 拡張機能から移行する簡単な方法

<?php
$mysqli 
mysqli_connect("example.com""user""password""database");
$result mysqli_query($mysqli"SELECT 'Please do not use the deprecated mysql extension for new development. ' 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 'Use the mysqli extension instead.' AS _msg FROM DUAL"$mysql);
$row mysql_fetch_assoc($result);
echo 
$row['_msg'];

上の例の出力は以下となります。

Please do not use the deprecated mysql extension for new development. Use the mysqli extension instead.

オブジェクト指向インターフェイス

伝統的な手続き型のインターフェイスに加えて、 ユーザーはオブジェクト指向インターフェイスを選ぶことができます。 このドキュメントは、 オブジェクト志向インターフェイスも使えるように整理されています。 オブジェクト志向インターフェイスは、 目的に応じてグループ化されていますし、 使い始めるのも簡単です。リファレンスのページでは、 手続き型に加えて、オブジェクト志向インターフェイスの使い方も示しています。

この2つのインターフェイスの間に、 目立ったパフォーマンスの違いはありません。 ユーザーは、自分の好みに応じてインターフェイスを選択できます。

例2 オブジェクト志向と手続き型のインターフェイス

<?php

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

$result mysqli_query($mysqli"SELECT 'A world full of ' AS _msg FROM DUAL");
$row mysqli_fetch_assoc($result);
echo 
$row['_msg'];

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

$result $mysqli->query("SELECT 'choices to please everybody.' AS _msg FROM DUAL");
$row $result->fetch_assoc();
echo 
$row['_msg'];

上の例の出力は以下となります。

A world full of choices to please everybody.

このクイックスタートガイドでは、 オブジェクト志向のインターフェイスを使います。 なぜなら、リファレンスのページが、そのように整理されているからです。

ふたつのスタイルを混ぜる

手続き型と、オブジェクト志向のやり方を切り替えることもできます。 これら両方のスタイルを混ぜることは、 コードの明確さやコーディングスタイルを統一する理由から、 推奨できません。

例3 悪いコーディングスタイル

<?php

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

$result mysqli_query($mysqli"SELECT 'Possible but bad style.' AS _msg FROM DUAL");

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

上の例の出力は以下となります。

Possible but bad style.

参照

add a note add a note

User Contributed Notes 2 notes

up
27
Anonymous
6 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
5 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