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

PHP , 我们自己的函数,需要 function_exists 判断吗?

  •  
  •   ioioioioioioi · 2017-01-24 09:28:08 +08:00 · 3772 次点击
    这是一个创建于 2865 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2017-01-24 22:07:57 +08:00
    @cxbig 不会痛苦啊,函数都是写在一个文件里的,如果需要,某个加个 function_exists 便可。 类其实是有 namespace 的,但是在配置文件中,都加了 shortcut ,如果要改也很简单,把 shortcut 一行去掉,然后整个项目搜索替换便可,比如\cache:: 替换成\MyProjectNameSpace\Cache:: 分别类似 Laravel 的 helper 和 Facade
    第 2 条附言  ·  2017-01-24 22:09:13 +08:00
    V2EX 应该有什么关键字过滤,现在不能回复别人了。。。
    20 条回复    2017-01-25 08:21:44 +08:00
    treedon
        1
    treedon  
       2017-01-24 09:35:38 +08:00
    啥意思 ?
    foursking
        2
    foursking  
       2017-01-24 09:39:20 +08:00
    你是担心什么?和系统或者其他类库的函数冲突还是担心不存在? 前者的话你使用 namespace 就行,后者的话函数不是公共引入的嘛,真的不放心就 function_exists 判断吧,不过个人觉得没必要
    HanSonJ
        3
    HanSonJ  
       2017-01-24 09:42:24 +08:00   ❤️ 1
    如果是作为一个包,建议使用,毕竟不确定是否会跟第三方包冲突

    如果只是用于自己项目,可以不使用
    ioioioioioioi
        4
    ioioioioioioi  
    OP
       2017-01-24 09:44:59 +08:00
    @HanSonJ 自己的项目,倾向于不使用,不然要写好多 if
    HanSonJ
        5
    HanSonJ  
       2017-01-24 09:47:00 +08:00
    @ioioioioioioi #4 问题是,你也不会有这么多全局方法吧,面向对象编程为主
    joeke
        6
    joeke  
       2017-01-24 09:55:38 +08:00
    自己写一个类的时候,会把,但是不至于每个都写
    Jakesoft
        7
    Jakesoft  
       2017-01-24 10:43:54 +08:00
    是的,用命名空间, \vendr\package\funcname();

    不过这个年代最好还是面向对象编程吧,配合一个好的 ide (当然我是在说 phpstorm ), autocomplete 、 type inspect 等不要太爽。
    Jakesoft
        8
    Jakesoft  
       2017-01-24 10:45:37 +08:00
    还有 git integration ,(额,听说说英文有提升逼格...)
    ioioioioioioi
        9
    ioioioioioioi  
    OP
       2017-01-24 11:03:14 +08:00
    @Jakesoft 自己常用的函数,用命名空间,觉得太累。比如, ip() , 用上命名空间后,可能就是 \MyProject\Helpers\ip()
    barbery
        10
    barbery  
       2017-01-24 11:33:56 +08:00
    从代码健壮性来考虑,要!
    1762628386
        11
    1762628386  
       2017-01-24 13:21:56 +08:00
    最好别,到时候你等你用了,如果真有 2 个重名的方法,返回值不一样,你都不知道是什么错,你不写 function_exists 至少会报致命错误!!!!!
    jianzhiyao020
        12
    jianzhiyao020  
       2017-01-24 13:50:09 +08:00
    如果,为了兼容性是要的, PHP 有些版本不支持某些函数,但是你又想要实现一模一样的功能的话
    cxbig
        13
    cxbig  
       2017-01-24 15:02:28 +08:00
    哪怕自己写 binary 做 so 文件,最好也用 Object 封装,图方便可以全用 static 。
    单纯的 fn 集合至少要加个唯一的前缀,如 FANN 系列
    http://php.net/manual/en/book.fann.php
    ioioioioioioi
        14
    ioioioioioioi  
    OP
       2017-01-24 15:22:40 +08:00
    @cxbig 因为引用别人的库都会有前缀,加入的 class 也会有 namespace , 所以自己的项目里独有的东西倾向于不加前缀。
    mhycy
        15
    mhycy  
       2017-01-24 15:42:01 +08:00
    防御式开发“不应”用于此处。
    代码问题就该老老实实抛出异常。

    就像不应使用 try catch 来捕获因代码文件缺失而导致的异常,这样会隐藏问题的准确位置。
    cxbig
        16
    cxbig  
       2017-01-24 21:38:07 +08:00
    @ioioioioioioi 除非你有信心一个项目做到底。不然当下图省事,后续接手的人就很痛苦。
    个人不建议直接写全局 fn ,哪怕只有一个也要放进 Object 里。
    msg7086
        17
    msg7086  
       2017-01-25 01:07:11 +08:00
    @cxbig 做到底也不行的。我们这边的几个元老就是这么干的。后来他们自己也看不懂自己的代码在做什么了。
    cxbig
        18
    cxbig  
       2017-01-25 01:19:38 +08:00
    @msg7086
    所以我们团队代码审查里的一个重要指标就是检查 PHPDoc ,会严格要求开发者把所有类里的方法和属性的用途描述清楚。命名规范这些更是挑剔。
    甭管你多大牌,只要有团队成员不能理解就不给过。
    长期看可以节省了很多维护成本。
    msg7086
        19
    msg7086  
       2017-01-25 01:23:02 +08:00
    @cxbig 真好。我进公司那会儿毛都没有。没注释没代码审查,一个文件七八千行的业务逻辑,现在就呵呵了。
    lslqtz
        20
    lslqtz  
       2017-01-25 08:21:44 +08:00
    我觉得不应该做 兼容老版本的话可以在函数里用一个特定的来根据版本“转发”自带函数
    冲突问题应该让代码抛出致命错误
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3241 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:09 · PVG 20:09 · LAX 04:09 · JFK 07:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.