通过程序或面向对象的方式调用函数之间的区别

时间:2016-02-23 12:30:22

标签: php mysqli

我需要使用一个简单的函数:mysqli_num_rows(),但我想要更多的一般知识答案。

通过面向对象的样式$mysqli_result->num_rows;或程序样式mysqli_num_rows( mysqli_result $result );调用此函数之间是否存在任何差异?

我理解OO,as explained here, 正在访问变量,程序调用作为一个函数,但两者都返回相同的东西。

我公司的代码是程序性的,我们正在慢慢迁移到OOP,但它主要是混乱,因此没有任何我可以(或想要)遵循的内部指南。

3 个答案:

答案 0 :(得分:5)

不,没有区别。程序方式几乎只是OO API的包装。从历史上看,它包含在内,允许OO完全神秘的开发人员从mysql API过渡到更好的替代方案。

对于所有意图和目的,mysqli_num_rows执行此操作:

function mysqli_num_rows(mysqli_result $result) {
    return $result->num_rows;
}

答案 1 :(得分:1)

主要区别仅在于您的首选风格。

在大多数情况下(可能全部),该功能是oo方式的“捷径”。

这两个电话是等价的:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
$mysqli = mysqli_connect('localhost', 'my_user', 'my_password', 'my_db');

因为 - 基本上 - mysqli_connect的定义是这样的:

function mysqli_connect( $host, $user, $pass, $db )
{
    $conn = new mysqli( $host, $user, $pass, $db );
    return $conn;
}

编辑: longhand

参见 - 例如 - 第3部分课程simple_html_dom。面向对象的加载文件的方法是:

$dom = new simple_html_dom();
$data = file_get_contents( $url ) or die( 'Error retrieving URL' );
$dom->load( $contents ) or die( 'Error loading HTML' );

以上三行可以与程序调用一起浓缩:

$dom = file_get_html( $url ) or die( 'Error loading HTML' );

因为file_get_html的内部代码如下(由我简化):

function file_get_html( $url )
{
    $dom = new simple_html_dom();
    $contents = file_get_contents( $url );
    if( empty($contents) || strlen($contents) > MAX_FILE_SIZE )
    {
        return false;
    }
    $dom->load( $contents );
    return $dom;
}

答案 2 :(得分:0)

区别在于一个是函数,另一个是方法。使用你想要的任何一个。

但是,如果您的公司正在慢慢迁移到OO方法,那么最好坚持使用对象。首先,这样做可以让你充分利用依赖注入。

<强>的index.php

<?php

    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');

    /*
     * Dependency Injection
     */
    $userService = new UserService($db);
    $users = $userService->getUsers();

<强> UserService.php

<?php

class UserService
{
    private $db;

    public function __construct($db)
    {
        $this->db = $db;
    }

    public function getUsers()
    {
        if ($result = $this->db->query("SELECT username, city FROM users"))
            return $result->num_rows;
        else
            return false;
    }
}

这允许您重用对象。你在干嘛(不要重复自己)。

即使在程序代码中,使用mysqliPDO对象也没有任何不利之处。您可以获得更清晰的代码。