请问 PHP 中的 self:: 关键字抑制多态是什么意思? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wfdaj
V2EX    PHP

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

  •  
  •   wfdaj 2021 年 3 月 29 日 3569 次点击
    这是一个创建于 1844 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到这样两句代码:

    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 年 3 月 29 日
    以最新的 PHP 版本来看,我觉得这就是一个错误的写法。。。没啥技巧可言
    wfdaj
        3
    wfdaj  
    OP
       2021 年 3 月 29 日
    @xycc 感谢回复。文档没怎么看懂,搜索的结果是,用于数据库连接实现单例模式吧。
    @jhdxr 好吧,我并没有看懂为啥要这样写来实现单例模式。-_-''
    Sunyanzi
        4
    Sunyanzi  
       2021 年 3 月 30 日
    顶楼那段代码毫无疑问的就是个错误 ... 不是什么高端写法 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

    这个 mini3 一共就 2 个文件,140 行,从来没人就这行提意见吗?
    作者还有一个 mini 框架,也是就 2 个文件,start 数 1300 多...
    排名第一的 slimphp,非常不适合新手看...
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3159 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 14:03 PVG 22:03 LAX 07:03 JFK 10:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86