V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wfdaj
V2EX  ›  PHP

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

  •  
  •   wfdaj · 2021-03-29 21:25:49 +08:00 · 2892 次点击
    这是一个创建于 1368 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到这样两句代码:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    这个 mini3 一共就 2 个文件,140 行,从来没人就这行提意见吗?🤨
    作者还有一个 mini 框架,也是就 2 个文件,start 数 1300 多...😏
    排名第一的 slimphp,非常不适合新手看...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5665 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 06:30 · PVG 14:30 · LAX 22:30 · JFK 01:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.