【问题标题】:Difference between calling a function by procedural or object oriented style通过过程或面向对象风格调用函数之间的区别
【发布时间】:2016-02-23 12:30:21
【问题描述】:

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

通过面向对象风格$mysqli_result->num_rows;或过程风格mysqli_num_rows( mysqli_result $result );调用这个函数有什么区别吗?

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

我公司的代码是程序化的,我们正在慢慢迁移到 OOP,但它大多是混乱的,所以没有任何我可以(或愿意)遵循的内部准则。

【问题讨论】:

  • 您是否在考虑特定类型的差异?性能、用户友好性等?
  • 我想了解两者。他们处理信息的方式(性能等)和最佳实践(如果有的话)的内部差异来编写对其他程序员既有用又好用的代码。
  • 给定的示例(从对象访问属性)非常简单地表示了面向对象编程和过程方法之间的区别。基本上,当您在信息类型之间具有“层次结构”时,甚至当您打算在具有相似操作的不同系统上执行任务时,OOP 可以提供更好的结果。
  • 本网站不欢迎有关最佳实践的问题,几乎总是closed。所以我建议你不要询问最佳实践。此外,OOP 并不特定于 MySQL 函数,我认为您应该关注 mysqli_num_rows() 的使用,而不是使用 OOP 更容易或更好。

标签: php mysqli


【解决方案1】:

不,没有区别。过程方式几乎只是 OO API 的包装器。从历史上看,它被包含在内是为了让对 OO 完全陌生的开发人员能够从 mysql API 过渡到更好的替代方案。

出于所有意图和目的mysqli_num_rows 这样做:

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

【讨论】:

    【解决方案2】:

    主要区别仅在于您喜欢的风格。

    在大多数情况下(可能是所有情况),函数是 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;
    }
    

    编辑:速写

    参见——例如——第三部分类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;
    }
    

    【讨论】:

    • 我认为该函数通常是 OO 等效项的 longhand 版本。 $result->num_rowsmysqli_num_rows($result)... :)
    • 通常 Au contrair :面向对象是程序风格的 longhand 版本。 OO是核心,功能是捷径。我将在几分钟内通过示例编辑答案。
    • 如果不是“字符更少”,你如何定义“快捷方式”,我认为在大多数情况下都站不住脚......? :)
    • @deceze 已编辑。也许我不明白,我不是英语。我打算:快捷方式=几句话,速记=普通笔迹(相对于速记)。所以,如果function是oo的简写,oo就是function的简写。
    • 没有可比性。 file_get_html 确实以简写方式实现了更复杂的操作。这不适用于 mysqli,其中程序和 OO 方式做的事情完全相同,而且通常 OO 方式更短。
    【解决方案3】:

    区别是一个是函数,另一个是方法。使用任何你喜欢的。

    但是,如果您的公司正在慢慢迁移到 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 对象也没有缺点。您将受益于更简洁的代码。

    【讨论】:

    • 这根本不会影响依赖注入,因为您仍然需要传递mysqli 对象。这实际上只是调用语法的不同,不多也不少。
    • mysqli 对象是依赖项。 UserServices 取决于它。将依赖项传递给构造函数(可以使用 setter 执行相同的操作)是依赖项注入。如果他的公司正在向 OOP 发展,那么使用对象版本将使他受益匪浅。当然,您可以通过 mysqli_connect ,但是当您坚持使用过程方法调用时,使用 OOP 的目的是什么?
    • 我不明白你。无论您是使用new mysqli() 还是mysqli_connect() 创建$mysqli,都完全没有区别;结果是$mysqli,你传递的一个对象(在这两种情况下都是一个对象)。
    • 我没有意识到这一点。在过去的 7 年或奇数年里,我一直使用 PDO,从未接触过 mysqli_connect。我明白你现在的意思了。但是,答案仍然是一样的,风格取决于用户。我只是举一个例子说明为什么它会对他有利。通常,我会向那些从程序转换的人展示这个,我经常教PDO。我检查了文档,我发现两者都确实返回了一个对象。
    猜你喜欢
    • 2013-06-14
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2019-05-23
    相关资源
    最近更新 更多