请问 PHP 中的 self:: 关键字抑制多态是什么意思?😨

2021-03-29 21:25:49 +08:00
 wfdaj

看到这样两句代码:

function __construct() {
    self::openDatabaseConnection();
}

private function openDatabaseConnection() 
{
    ……
}

我以为这里的 self:: 是要调用 openDatabaseConnection,但 openDatabaseConnection 不是静态的,而且 vscode 也提示:不应静态调用非静态方法“openDatabaseConnection”。

百度到 self:: 还能抑制多态,指向当前类的成员函数,请问,这是啥意思?😨

2670 次点击
所在节点    PHP
11 条回复
xycc
2021-03-29 21:39:41 +08:00
jhdxr
2021-03-29 22:19:13 +08:00
以最新的 PHP 版本来看,我觉得这就是一个错误的写法。。。没啥技巧可言
wfdaj
2021-03-29 22:41:27 +08:00
@xycc 感谢回复。文档没怎么看懂,搜索的结果是,用于数据库连接实现单例模式吧。
@jhdxr 好吧,我并没有看懂为啥要这样写来实现单例模式。-_-''
Sunyanzi
2021-03-30 00:49:11 +08:00
顶楼那段代码毫无疑问的就是个错误 ... 不是什么高端写法 ...

至于抑制多态 ... 延静绑的文档看不懂的话 ... 试试看能不能看懂我下面的代码 ...

我这段代码里完整实现了多态三要素 ... 也演示了 self:: 如何抑制多态 ...

说真的 ... 讲 OOP 的时候我可喜欢举这种例子了 ... 能明白我在写什么就好 ... 单例不单例的完全不重要 ...

i.imgur.com/KB0Dvb5.png
wfdaj
2021-03-30 08:31:55 +08:00
@Sunyanzi 我发的代码在这里: https://github.com/panique/mini3/blob/master/application/Core/Model.php

start 数有 200 多,是个非常小的框架,难道这会是个非常明显的错误?😂

此作者第一版框架 mini,就不是这么写的。
wfdaj
2021-03-30 08:36:00 +08:00
第一版就是 ``$this->openDatabaseConnection();``
Sunyanzi
2021-03-30 09:28:10 +08:00
@wfdaj 200 多 Star 并不代表作者在这里写对了 ... 以那个文件的写法看这里毋庸置疑的应该用 $this-> ...

以及 ... 我所指的错误并不代表「这代码不能运行」 ... 而是代码显得糙 ... 看着让人难受 ...

实际上时至今日 php 还是允许用 self:: 调用非静态方法的 ... 这是个历史遗留问题 ... 不太好改 ...

但不报错不代表这么写就没问题 ... 你确实可以这么写 ... 但从结构和美观的角度说 ... 你都不应该这么写 ...

说句题外话 ... 我一直觉得「编写程序」是个很 Creative 的事情 ... 而不是应付过去实现了就完了 ...

虽然当下行业里混日子的程序员占大多数 ... 但我还是选择爱惜我的时间 ... 认真对待我的每一件作品 ...
ChoateYao
2021-03-30 10:41:32 +08:00
当你有父类,里面有一个两个方法 A 和 B,其中 A 方法中调用方法 B,self::B()。

这时候子类,重写了方法 B,并使用子类初始化,并调用方法 A,则子类重写的方法 B 并不会生效。

类似于 final 关键字声明,很恶心,一不小心就掉坑了。
mengdodo
2021-03-30 10:51:38 +08:00
就不该这么写,整的跟奇技淫巧一样,我是看到就会骂的
sorshion
2021-03-30 20:54:06 +08:00
php 就应该在大版本中,去除一些过时的语法
wfdaj
2021-03-30 21:17:12 +08:00
我在看微框架,都是从 github 找星数多,最近有更新的看。

这个 mini3 一共就 2 个文件,140 行,从来没人就这行提意见吗?🤨
作者还有一个 mini 框架,也是就 2 个文件,start 数 1300 多...😏
排名第一的 slimphp,非常不适合新手看...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/766290

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX