为什么使用对象导向的PHP和mysqli优于过程式方法?

31
我之前一直使用mysql*的过程式方法,但最近想转向mysqli和面向对象的方法。许多在线资源和书籍都表明,即使在PHP的情况下,OOP也比过程式方法更好。通过学习一些在线教程,我编写了一个连接到数据库并选择值的小程序。我想知道为什么面向对象的方法更好?此外,这是编写OO PHP网页的正确方式吗?
面向对象的方法
$host = "localhost";
$username = "root";
$password = "";
$dbname = "compdb";

@ $db = new mysqli($host, $username, $password, $dbname);

if(mysqli_connect_errno())
{
    die("Connection could not be established");
}

$query = "SELECT company_id FROM company_basic_details WHERE company_name = 'ABC'";
$result = $db->query($query);

$total_num_rows = $result->num_rows;

echo "The Results Are : <br>";

while($row = $result->fetch_array())
{
    echo $row['company_id'];
}
?>

过程化方法

<?php

$host = "localhost";
$username = "root";
$password = "";
$dbname = "compdb";

@ $db = mysqli_connect($host, $username, $password, $dbname);

if(mysqli_connect_errno())
{
    die("Connection could not be established");
}

$query = "SELECT company_id FROM company_basic_details WHERE company_name = 'ABC'";
$result = mysqli_query($db, $query);

$total_num_rows = mysqli_num_rows($result);

echo "The Results Are : <br>";

while($row = mysqli_fetch_array($result))
{
    echo $row['company_id'];
}
?>

2
面向对象编程的一个优点是,您可以创建自己的类作为此核心类的扩展,这将使您的方法保持整洁、可扩展的形式。 - halfer
可能是[mysqli,OOP vs Procedural]的重复问题(https://dev59.com/_G025IYBdhLWcg3wHR8Y)。 - halfer
@halfer - 没有想到可以使用mysqli的扩展类。现在我明白了。谢谢。 - Stacy J
1个回答

40

主要原因是PHP正朝着面向对象编程的方向稳步发展。

使用mysqli_xxx()函数而非面向对象的等价物并没有错;就代码而言,它们完全相同。

唯一的问题是,您将越来越落后于被视为良好PHP代码的人们所认可的标准。

值得注意的是,PDO库被认为是PHP大多数DB代码的理想选择,它只支持面向对象。它没有过程化接口,大多数在最近几个版本中添加到PHP中的新功能也是如此。如果您想充分利用PHP,您需要了解面向对象编程。

还有一个关于能够为您的DB创建扩展类的观点——像这样的东西:

class myDB extends mysqli {
     .... your own stuff here to extend and improve the base mysqli class
}

当然,你也可以用过程化编码实现相同的功能,但这样做没有面向对象编程的方式那么整洁。当然,这只有在你真正想扩展类的时候才相关。

但是,作为第一步,仅仅从mysql_xxx()转到mysqli_xxx()就是一个很好的开始。全面采用面向对象接口会更好,但只切换到mysqli函数已经是个好的开始了。

最开始使用过程性接口肯定会使过渡远离旧的mysql_xx()函数更加容易,所以如果在开始时切换到面向对象接口太困难了,不要感觉必须一下子完成所有切换。先将其转换为过程性mysqli函数,然后稍后再切换到面向对象方法;单独进行任何一种转换都不会太大。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接