PHP Conference Japan 2024

雙程序式與物件導向介面

mysqli 擴充功能具有雙介面。它支援程序式與物件導向程式設計範式。

從舊的 mysql 擴充功能遷移的使用者可能偏好程序式介面。程序式介面與舊的 mysql 擴充功能相似。在許多情況下,函式名稱的差異僅在於前綴。一些 mysqli 函式會將連線控制代碼作為它們的第一個引數,而舊的 mysql 介面中對應的函式則將其作為可選的最後一個引數。

範例 #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'];

上面的範例將輸出

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

物件導向介面

除了傳統的程序式介面外,使用者還可以選擇使用物件導向介面。文件是使用物件導向介面組織的。物件導向介面會依照功能將函式分組,讓您更容易上手。參考章節會提供兩種語法變體的範例。

兩種介面之間沒有顯著的效能差異。使用者可以根據個人喜好選擇。

範例 #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'];

上面的範例將輸出

A world full of choices to please everybody.

物件導向介面是用於快速入門,因為參考章節是以這種方式組織的。

混合風格

可以隨時在樣式之間切換。為了程式碼的清晰度和編碼樣式的考量,不建議混合使用兩種樣式。

範例 #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'];
}

上面的範例將輸出

Possible but bad style.

另請參閱

新增註解

使用者貢獻的註解 1 則註解

31
匿名
9 年前
只想補充一點,程序式的 mysqli_connect_errno 和 mysqli_connect_error 都不接受任何引數!
https://php.dev.org.tw/manual/de/mysqli.connect-errno.php
https://php.dev.org.tw/manual/de/mysqli.connect-error.php
"int mysqli_connect_errno ( void )"
"string mysqli_connect_error ( void )"
那裡清楚地說明了「void」。

將 mysqli 執行個體新增為參數會讓人以為它會從提供的執行個體中提取錯誤編號,但實際上並非如此。當連線到多個 SQL 伺服器時,可能會導致難以偵測的錯誤。
而且這會讓初學者感到困惑。
To Top