6

据我了解,OOP 与 PHP 中的过程编程的最大优势是函数名称的分离(命名空间的排序)。

所以现在当我们从 5.3 版本开始有了命名空间时,你怎么看 - 对于大多数情况(中​​小型网站),当我们需要快速且再次结构化的代码时,使用命名空间 + 过程编程是否比定义和写入具有显着优势哎呀。

好处:

  • 结构化的
  • 更快的代码/开发
  • 再次,我们可以在命名空间中定义类似私有函数的东西,以“_”开头,知道我们不需要使用它们
  • ETC..

代码示例:

namespace User;

function setPassword ($user_id) {

    $pass = _generatePassword();

    $sql = 'UPDATE `users` SET `password` = '.escape($pass).' WHERE `user_id` = '.escape($user_id);
    $result = mysql_query($sql);


    if (mysql_affected_rows() == 1) return $sql;
    else return $sql;
}

function _generatePassword () {

    $char = '0123456789abcdefghijklmnopqrstuvwxyz';
    $str = '';
    for ($i = 1; $i <= 6; $i++) {
        $str .= $char[mt_rand(0, strlen($char))];
    }

    return $str;
}

用法:

$user_id = 5;
User\setPassword($user_id);

我征求意见。我知道这只是开发人员的风格,但也许我遗漏了一些东西。

PS。对于大多数情况(中​​小型网站)——我的意思是当你为客户做网站时,这些网站大多是 1 次开发,从长远来看会有一些功能改进。

4

2 回答 2

3

您以错误的方式思考 OOP。如果您试图将 OOP 与过程命名空间仅作为组织代码和函数调用的两种不同方式进行比较,那么命名空间肯定会看起来更有效。

OOP 的优势不在于组织一个充满功能的对象。这只是将 OOP 类视为充满功能的大型“实用程序”类。OOP 的优势不是组织性的。这是一种完全不同的构建程序的方式,它会导致您将代码分解为更小、更谨慎的实体。我在所有 PHP 程序中都使用 OOP,即使是小型项目。

当我做任何访问数据库的项目时(现在一切都很好),OOP 的优势对我来说变得最明显。我创建小类来为每个数据库表建模,然后将这些表中的信息作为对象访问。我在所有项目中都使用了一些基类,这些基类定义了如何将表映射到对象,因此我不再重新键入或粘贴 mysql 命令。我只是使用对象,它们继承了从数据库中插入、更新和删除所需的所有功能。

在代码中(尤其是如果您使用具有代码完成功能的 PHP ide)在代码中看到这一点肯定会更有用:

echo "Hello, {$someDataObject->name}!";

比这个:

echo "Hello, " . $row['name'] . "!";

差异可能不会立即明显。这两个示例都是打印表格列的单行代码。但是第二个例子要求我知道我脑海中的列名。第一个示例将列名作为属性嵌入到类中。我的代码检查器知道所有属性,因此当我编写代码时,它会在我键入时显示所有属性的列表。

维护类比你想象的要容易。根据您选择的对象框架,有一些脚本可以从表中生成类并使其保持最新。而且我发现让我的对象类自己保持最新比让数据库更改破坏代码更容易出错和错误,因为列名发生了更改,然后我必须在几十个地方更新这些列引用。是的,有搜索和替换,但是您是否看到为列更改更新一个文件比更新对 $row['some_column'] 的每个引用的优势?

我希望这有助于回答你的问题。

于 2011-10-14T11:31:25.100 回答
2

我认为这是一个有效的问题。随着问题空间的增长和代码库的增加,使用 OOP 风格的编程往往会引入大量开销。公平地说,对于小型项目,使用 OOP、功能或程序之间没有任何真正的区别,但此后情况并非如此。

OOP 编程学说所吹捧的优势之一(尽管不是唯一的)是命名空间给您带来的好处。此外,在很多情况下,强制使用类会引入另一个级别的更紧密耦合和一些依赖关系。这里提出的是只使用命名空间编写程序代码,这将允许以更自然的方式重用函数。

在一般情况下很难更具体,并且原始问题中提供的示例并未揭示出于上述原因避免使用类的一些潜在好处。

一些不使用 OOP 风格的论点与支持和反对函数式编程语言的论点更具可比性。在这里添加一个有趣的例子是看一下由谷歌的人编写的相对较新的 go 语言,它更进了一步,允许使用自己命名空间中的包来定义与结构或接口分开的函数。

如果 google 的人看到这里介绍的方法有一些优点,对于我的钱来说,考虑这似乎并不是一件坏事,而且不仅仅是值得深思。

于 2014-01-22T12:18:47.257 回答