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

PHP 的花括号变量解析

  •  
  •   iguoji · 2017-06-21 10:28:17 +08:00 · 2599 次点击
    这是一个创建于 2515 天前的主题,其中的信息可能已经有所发展或是发生改变。
    function foobar(){
    	echo "<hr />";
    	return "hello world";
    }
    echo <<<TOKEN
    	<p> 第一种:${foobar()} </p>
    	<p> 第二种:{${foobar()}} </p>
    TOKEN;
    

    输出结果为:

    <hr /><hr />
    	<p> 第一种: </p>
    	<p> 第二种: </p>
    

    请问我returnhello world哪里去了?

    官方 复杂(花括号)语法 的代码例子中有这么调用过: http://php.net/manual/zh/language.types.string.php

    18 条回复    2017-06-22 21:53:28 +08:00
    FelixXie
        1
    FelixXie  
       2017-06-21 10:42:22 +08:00
    $helloworld 没有定义啊。
    klgd
        2
    klgd  
       2017-06-21 10:43:38 +08:00
    你为什么要加“$”?
    nullen
        3
    nullen  
       2017-06-21 10:44:07 +08:00
    好像是楼主自己的锅?
    mooncakejs
        4
    mooncakejs  
       2017-06-21 10:44:59 +08:00 via iPhone
    从 nodejs 过来的?
    vus520
        5
    vus520  
       2017-06-21 10:47:17 +08:00
    function foobar(){
    echo "<hr />";
    echo "hello world";
    }

    return 并不是输出,只是返回
    iguoji
        6
    iguoji  
    OP
       2017-06-21 10:47:48 +08:00
    @FelixXie 我函数里返回的 hello world 是字符串啊,不是变量
    iguoji
        7
    iguoji  
    OP
       2017-06-21 10:49:27 +08:00
    @klgd echo 输出里 $和{是配合一起使用的,如果缺少其中一个,输出的会直接是"{foobar()}",而没有将其解析
    bombless
        8
    bombless  
       2017-06-21 10:50:25 +08:00   ❤️ 2
    ……你没看仔细吧
    https://3v4l.org/EAgOC
    iguoji
        9
    iguoji  
    OP
       2017-06-21 10:51:10 +08:00
    @vus520

    官方代码例子有这么一行

    ```php
    echo "This is the value of the var named by the return value of getName(): {${getName()}}";
    ```

    但他没有给出具体`getName()`函数的定义,所以我认为这个函数会返回一个字符串,然后拼接在这整个 echo 语句中。
    bombless
        10
    bombless  
       2017-06-21 10:53:45 +08:00   ❤️ 1
    getName()返回的不是字符串,它返回的是一个本地变量的变量名
    littleylv
        11
    littleylv  
       2017-06-21 10:56:25 +08:00   ❤️ 1
    楼主没有认真看手册的结果

    $aa = 'aaaa';
    $bb = 'bbbb';

    function foo() {
    return 'aa';
    }

    echo ${foo()}; // aaaa
    因为 foo 返回的是 aa,所以打印的是$aa,即 aaaa,而不是打印'aa'
    meanmachine
        12
    meanmachine  
       2017-06-21 10:57:25 +08:00 via Android   ❤️ 1
    @iguoji 这将会返回一个变量名由 getName()返回值得到的的变量值
    iguoji
        13
    iguoji  
    OP
       2017-06-21 10:58:25 +08:00
    @bombless
    @littleylv

    感谢,刚往后翻了下手册,原来这个官方叫法叫 可变变量。
    mokeyjay
        14
    mokeyjay  
       2017-06-21 10:58:36 +08:00   ❤️ 1
    看起来你不知道 $$var 的用法。
    $a = 'b';
    $b = '233';
    echo $$a; // output: '233'

    同理,你的 foobar()应该返回一个变量名。例如你首先要定义:
    $hello_world = 'Hello World';

    然后再定义一个函数返回这个 变量名 :
    function footbar(){ return 'hello_world'; }

    最后再:
    echo <<<EOT
    <p> 第二种:{${footbar()}} </p>
    EOT;

    这样才能输出你想要的结果
    FelixXie
        15
    FelixXie  
       2017-06-21 10:59:21 +08:00
    @iguoji 好吧。那理解错了。我以为你输出$helloworld。 你要输出字符串就不需要$了啊。
    klgd
        16
    klgd  
       2017-06-21 11:12:06 +08:00
    @bombless 涨姿势了 还有这样的 php 网站
    hexiaolu
        17
    hexiaolu  
       2017-06-21 17:47:05 +08:00
    我就想知道,有哪个蛋疼的 phper 会这样用? 不把他喷死我就不是一个合格 html 工程师。
    mingyun
        18
    mingyun  
       2017-06-22 21:53:28 +08:00
    这种特性工作中还是别用了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:25 · PVG 04:25 · LAX 13:25 · JFK 16:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.