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

php 有内置方法可以将字符串转表达式的么?

  •  
  •   funwee · 2014-03-04 11:04:57 +08:00 · 2737 次点击
    这是一个创建于 1812 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天有人来问一个的问题

    if(expr){
    echo '成立';
    }else{
    echo '不成立';
    }

    一个在普通不过的判断语句了,可那人把判断表达式(expr)用一个变量来存储
    结果怎么执行都为真 原因应该是被当成字符串来处理了吧
    我查了下 好像没有能把字符串转表达式的方法,如果非要这么实现,应该怎么处理?
    为啥v2ex 不能用tab 囧
    14 回复  |  直到 1970-01-01 08:00:00 +08:00
        1
    funwee   2014-03-04 11:12:09 +08:00
    没人来科普下么 囧
    看来越是简单的问题,越是坑啊!!!
        2
    shiny   2014-03-04 11:16:35 +08:00
    为什么要这么做………… eval 呀,但是有安全隐患,谨慎使用。
    一定是设计有问题。
        3
    shiny   2014-03-04 11:18:37 +08:00
    另外建议从头到尾读手册三遍,每次读都有收获。
        4
    likexian   2014-03-04 11:21:50 +08:00   ♥ 1
        5
    funwee   2014-03-04 11:26:27 +08:00
    @shiny 没问他为啥要这么做 只是单纯实现上考虑 要怎么实现 eval好像也不行啊 囧
        6
    shiny   2014-03-04 11:28:37 +08:00   ♥ 1
    @funwee 拼接一个 return 来返回执行后的变量。likexian 说的 assert 看上去也很适合你的场景。
        7
    funwee   2014-03-04 11:30:18 +08:00
    @likexian 搞定 看来手册还是要多看才行
        8
    funwee   2014-03-04 11:31:20 +08:00
    @shiny 嗯 assert确实可以搞定这种情况 嘿 看来手册还是不够熟 我找了好久都没找到合适的
        9
    shiny   2014-03-04 11:33:09 +08:00
    @funwee 看了 assert 的用法我也觉得我手册读少了哈哈,而且测试也写少了……
        10
    xdazz   2014-03-04 11:53:40 +08:00
    问题是你这个表达式从哪里来的,用户输入? 第三方API的结果? 这样的代码,我只能闻到bad smell.
        11
    anewg   2014-03-04 11:54:49 +08:00
        12
    funwee   2014-03-04 13:13:56 +08:00
    @xdazz 我并没有去追问他为什么要这样写 只是好奇最终该如何去实现这个奇葩的需求...
        13
    oott123   2014-03-04 14:22:29 +08:00 via Android
    这种需求有种不可控的感觉…用起来不会感觉不安么?
    另外贴小段代码的话贴到 gist 里面比较好。
        14
    ichou   2014-03-05 10:01:27 +08:00
    这种用法虽然很有用 但是是个不安定因素 不能确信处理好所有可能的情况建议慎重点
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3267 人在线   最高记录 4346   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 04:39 · PVG 12:39 · LAX 20:39 · JFK 23:39
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1