gpt4 book ai didi

php - 我错过了面向对象编程的重点吗?

转载 作者:可可西里 更新时间:2023-10-31 23:52:53 25 4
gpt4 key购买 nike

最近,我开始尝试学习 OO 编程。我开始已经大约 3 个月了,但我想我可能没有捕获要点,因为我似乎更喜欢静态方法(对我来说这似乎“更容易”)。

例子

这是我的代码中典型的数据库查询的样子。

$bindings = array(':name'=>$articleName);

Db::query('SELECT id, name, title, image, content FROM ' . CONFIG_MYSQL_TABLE_PREFIX . 'articles WHERE name = :name LIMIT 1', $bindings);

下面是我如何调整/裁剪/缓存图像

$image = Img::thumbnail($imagePath, 200);

$imgHtml = '<img alt="' . $this->getTitle() . '" src="' . '' . $image['src'] . '" width="' . $image['width'] . '" height="' . $image['height'] . '" />';

这两个静态方法都使用单例模式。第一个创建一个 PDO 对象,第二个创建一个我在 Google 代码中找到的 ImageResize 类。

如果我真的想称之为面向对象编程,这些应该是 2 个对象吗?即

$db = new Db();

$image = new Image($src, $width, $height);

每次我使用它们?我读过单例也是一个坏主意,除非它们被用于记录到文件。但是,对于在需要时打开并仅在使用和完成后才关闭的一个数据库连接来说,单例不是很好吗?

我的问题是,我是否仍然停留在程序思维方式中,如果是这样,我的做法是否被视为不良做法?我怎样才能让自己沉浸在正确的 OO 思维模式中?

更新

感谢您的回答。我确实发现我正在做的原始方法更容易,因为我必须输入更少的代码,让静态方法担心很少的实现问题。

我将研究另一种语言以扎实地掌握 OO,尽管哪种语言本身将是另一个问题。

最佳答案

嗯,恕我直言,PHP 是一个不好的例子,因为 PHP is not object-oriented .是的,它有对象。是的,他们支持继承和所有这些 OO 原则。它支持对象。有区别。

我这样说是因为 PHP 默认情况下不存在于请求之间的状态中。每个 HTTP 请求都将完全从头开始重新创建一个 PHP 环境(这相当便宜),这意味着在请求之间不会保留静态数据。您可能会说“ session 数据呢?” (并且可能附加一个“啊哈!”)但这也不是 PHP 意义上的持久数据。它(通常)存储在文件系统中并由客户端发送的 cookie 键控。

为什么要提这两件事?

因为“全局”作用域不同于 C、Java、C++ 或这些其他语言中的全局作用域,因为它们倾向于在请求之间持续存在。 PHP 更像是 90 年代的 CGI 编程模型(这不是巧合,因为那是它的起源地)。

因此您的对象并不是真正的全局对象:它们对服务于当前请求的代码的所有部分都是可见的。

对我来说,这远没有那么糟糕。事实上,我经常觉得这是可以接受的。有时这是完全必要的(例如,如果您想将信息发送回调用者或​​将状态传递给回调而不执行 eval()/create_function() hack,则在对 preg_replace_callback 的回调中)。

关于 PHP 不是面向对象的观点是因为即使在 PHP 5 中 OO 特性仍然有点“附加”,这意味着您可以非常愉快地编写代码并在 PHP 中编写好代码而无需使用它们。这与 Java 不同,在 Java 中您必须创建一个类,即使您所做的只是在其中编写一堆静态方法。

因此,如果您想学习 OO,老实说我不会用 PHP 学习。 PHP 适用于很多事情,但它被设计为具有 HTTP 请求生命周期(是的,我知道您可以从命令行运行它,但绝大多数用户都不会这样做)并且它非常适合它的设计目的.

关于php - 我错过了面向对象编程的重点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/601329/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com