为什么PHP会弃用mysqli_stmt __construct

时间:2017-05-05 15:41:37

标签: php mysqli

来自文档

  

mysqli_stmt :: __ construct(mysqli $ link [,string $ query])

     

注意:

     

通常,您应该使用mysqli_prepare()或mysqli_stmt_init()来创建mysqli_stmt对象,而不是使用新的mysqli_stmt直接实例化对象。此方法(以及直接实例化mysqli_stmt对象的能力)将来可能会被弃用和删除。

但他们为什么要这样做呢?这不会破坏继承(你无法扩展mysqli_stmt)?

1 个答案:

答案 0 :(得分:0)

从技术上讲,没有理由这样做。到目前为止,您仍然可以创建该类的实例,并像往常一样使用它。例如:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'db_name');
$mysqli->set_charset('utf8mb4'); // always set the charset

$stmt = new mysqli_stmt($mysqli, 'SELECT * FROM movie');
$stmt->execute();

以上方法可行,但不建议这样做,这就是原因...

您需要了解mysqli是旧mysql_*库的廉价替代品。核心设计原则是使其支持较新的MySQL服务器,并将对准备好的语句的支持引入PHP。开发集中在这些关键领域,其他任何具有附加功能的功能都没有那么重要,例如继承/多态性。

稍后mysqli_stmt的构造函数被添加了,但是它的开发从未真正完成。对此没有真正的需求。将旧的PHP 4项目迁移到PHP 5.1的人们还没有以OOP的方式思考。尽管PHP人员鼓励OOP,但程序风格仍然很普遍。更不用说当时的预言还很新颖。

// Both examples work almost the same way, but...
$stmt = $mysqli->prepare('SELECT * FROM movie');
$stmt->execute();

$stmt = new mysqli_stmt($mysqli, 'SELECT * FROM movie');
$stmt->execute();

mysqli_stmt::__construct()到PHP 8.0为止仍缺少错误报告。我想修复它并不是很困难,但是您需要一个足够认真地完成它的人。

同时,您确实应该使用PDO。 PDO提供了更多功能(也缺少一些功能,但是您极不可能需要mysqli特定的功能)并且比mysqli更易于使用。