0

オブジェクトを返す関数があります。その関数によって返されるオブジェクトのメンバーを解析する文字列を作成する方法 (関数は別の名前空間にあります)。これは私がやろうとしていることですが、エコーで使用される文字列が無効です。

namespace security;
function &get_user() {
    $user = (object) array('email' => 'abcd@abcd.com', 'name' => 'John Doe');
    return $user;
}

echo "<li><p class=\"navbar-text\">Welcome, {${\security\get_user()}->name}</p></li>";
4

2 に答える 2

3

さて、いくつかのこと:

  • 文字列内の関数/メソッドを補間することはできません。変数のみが許可されます。
  • 名前空間を作成するときは、名前空間の外にいるときだけ参照する必要があります。
  • 参照( &) が何をするかを理解していない限り、使用しないでください。PHP での参照は、他のほとんどの言語とは異なる働きをします。

コードはこのようになります。

// We define the namespace here. We do not need
// to refer to it when inside the namespace.
namespace security;

// Objects and arrays are always passed by
// reference, so you should not use & here
function get_user() {
    return (object) array(
        'email' => 'abcd@abcd.com',
        'name' => 'John Doe',
    );
}
// We need to get the value from the function
// before interpolating it in the string
$user = get_user();

// There are a few ways to interpolate in PHP
// This is for historical and functional reasons
// Interpolating array items is, "{$arr['key']}"
echo "<li><p class=\"navbar-text\">Welcome, $user->name</p></li>";
echo "<li><p class=\"navbar-text\">Welcome, {$user->name}</p></li>";
于 2013-09-01T23:45:32.003 に答える
0

文字列内のオブジェクト メンバーにアクセスするより複雑なことはしないでください。読みにくく、維持するのも困難です (たとえば、IDE はリファクタリングを行うときにそれを見逃す可能性があります)。とはいえ、ただの楽しみのために:

function get_user() {
    $user = (object) array('email' => 'abcd@abcd.com', 'name' => 'John Doe');
    return $user;
}

echo "<li><p class=\"navbar-text\">Welcome, {${($x = \security\get_user()->name) ? 'x' : 'x'}}</p></li>";

ここでは変数の割り当てが必要です。文字列の中括弧内では関数やその他のほぼすべてのものを使用できますが、それらの結果は変数名として解釈されます。基本的に$str = "{${<some code>}}";は と同等$name = eval("<some code>"); $str = $$name;"です。

于 2013-09-02T00:10:01.267 に答える