看到这样两句代码:
function __construct() {
self::openDatabaseConnection();
}
private function openDatabaseConnection()
{
……
}
我以为这里的 self:: 是要调用 openDatabaseConnection,但 openDatabaseConnection 不是静态的,而且 vscode 也提示:不应静态调用非静态方法“openDatabaseConnection”。
百度到 self:: 还能抑制多态,指向当前类的成员函数,请问,这是啥意思?😨
1
xycc 2021-03-29 21:39:41 +08:00
|
2
jhdxr 2021-03-29 22:19:13 +08:00
以最新的 PHP 版本来看,我觉得这就是一个错误的写法。。。没啥技巧可言
|
3
wfdaj OP |
4
Sunyanzi 2021-03-30 00:49:11 +08:00
顶楼那段代码毫无疑问的就是个错误 ... 不是什么高端写法 ...
至于抑制多态 ... 延静绑的文档看不懂的话 ... 试试看能不能看懂我下面的代码 ... 我这段代码里完整实现了多态三要素 ... 也演示了 self:: 如何抑制多态 ... 说真的 ... 讲 OOP 的时候我可喜欢举这种例子了 ... 能明白我在写什么就好 ... 单例不单例的完全不重要 ... i.imgur.com/KB0Dvb5.png |
5
wfdaj OP @Sunyanzi 我发的代码在这里: https://github.com/panique/mini3/blob/master/application/Core/Model.php
start 数有 200 多,是个非常小的框架,难道这会是个非常明显的错误?😂 此作者第一版框架 mini,就不是这么写的。 |
6
wfdaj OP 第一版就是 ``$this->openDatabaseConnection();``
|
7
Sunyanzi 2021-03-30 09:28:10 +08:00 1
@wfdaj 200 多 Star 并不代表作者在这里写对了 ... 以那个文件的写法看这里毋庸置疑的应该用 $this-> ...
以及 ... 我所指的错误并不代表「这代码不能运行」 ... 而是代码显得糙 ... 看着让人难受 ... 实际上时至今日 php 还是允许用 self:: 调用非静态方法的 ... 这是个历史遗留问题 ... 不太好改 ... 但不报错不代表这么写就没问题 ... 你确实可以这么写 ... 但从结构和美观的角度说 ... 你都不应该这么写 ... 说句题外话 ... 我一直觉得「编写程序」是个很 Creative 的事情 ... 而不是应付过去实现了就完了 ... 虽然当下行业里混日子的程序员占大多数 ... 但我还是选择爱惜我的时间 ... 认真对待我的每一件作品 ... |
8
ChoateYao 2021-03-30 10:41:32 +08:00 1
当你有父类,里面有一个两个方法 A 和 B,其中 A 方法中调用方法 B,self::B()。
这时候子类,重写了方法 B,并使用子类初始化,并调用方法 A,则子类重写的方法 B 并不会生效。 类似于 final 关键字声明,很恶心,一不小心就掉坑了。 |
9
mengdodo 2021-03-30 10:51:38 +08:00
就不该这么写,整的跟奇技淫巧一样,我是看到就会骂的
|
10
sorshion 2021-03-30 20:54:06 +08:00
php 就应该在大版本中,去除一些过时的语法
|
11
wfdaj OP 我在看微框架,都是从 github 找星数多,最近有更新的看。
这个 mini3 一共就 2 个文件,140 行,从来没人就这行提意见吗?🤨 作者还有一个 mini 框架,也是就 2 个文件,start 数 1300 多...😏 排名第一的 slimphp,非常不适合新手看... |