wfdaj
V2EX  ›  PHP

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

  •  
  •   wfdaj · Mar 29, 2021 · 4164 views
    This topic created in 2054 days ago, the information mentioned may be changed or developed.

    看到这样两句代码:

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

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

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

    11 replies  •  2021-03-30 21:17:12 +08:00
    jhdxr
    jhdxr
    Mar 29, 2021
    2
    以最新的 PHP 版本来看,我觉得这就是一个错误的写法。。。没啥技巧可言
    wfdaj
    wfdaj
    OP
    Mar 29, 2021
    3
    @xycc 感谢回复。文档没怎么看懂,搜索的结果是,用于数据库连接实现单例模式吧。
    @jhdxr 好吧,我并没有看懂为啥要这样写来实现单例模式。-_-''
    Sunyanzi
    Sunyanzi
    Mar 30, 2021
    4
    顶楼那段代码毫无疑问的就是个错误 ... 不是什么高端写法 ...

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

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

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

    i.imgur.com/KB0Dvb5.png
    wfdaj
    wfdaj
    OP
    Mar 30, 2021
    5
    @Sunyanzi 我发的代码在这里: https://github.com/panique/mini3/blob/master/application/Core/Model.php

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

    此作者第一版框架 mini,就不是这么写的。
    wfdaj
    wfdaj
    OP
    Mar 30, 2021
    6
    第一版就是 ``$this->openDatabaseConnection();``
    Sunyanzi
    Sunyanzi
    Mar 30, 2021❤️1
    7
    @wfdaj 200 多 Star 并不代表作者在这里写对了 ... 以那个文件的写法看这里毋庸置疑的应该用 $this-> ...

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

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

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

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

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

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

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

    这个 mini3 一共就 2 个文件,140 行,从来没人就这行提意见吗?🤨
    作者还有一个 mini 框架,也是就 2 个文件,start 数 1300 多...😏
    排名第一的 slimphp,非常不适合新手看...
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   4789 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 03:31 · PVG 11:31 · LAX 19:31 · JFK 22:31
    ♥ Do have faith in what you're doing.