从变量中调用PHP对象属性名


Calling PHP object attribute name from variable

有一个名为" locale "的会话变量,其值为:en。

$locale = session()->get('locale'); // value = 'en';

存在一个对象$page,其属性为:content_en, content_ru, content_de

所有我需要的是回显$page->content_en$page->content_ru$page->content_de,但取决于区域设置。

echo $page->content_'.session()->get('locale').';

这里有一个更完整的解决方案,您甚至可以在phpfiddle.org上运行

$page = new stdClass();
$page->content_en = 'Testcontent';
$page->content_de = 'Testinhalt';
$property = 'content_' . locale("en");
if(property_exists($page, $property)) {
    // The property exists, print it!
    echo $page->$property;
} else {
    // Fallback to some default
}

function locale($loc)
{
    return $loc;
}

您将无法通过组合字符串访问属性。唯一的选择是首先把它放在一个字符串中,然后使用该变量作为属性访问。

$property = 'content_' . session()->get('locale');
if( isset($page->$property) ) {
    echo $page->$property;
}

Fabian的回答更灵活,总体上更好。然而,如果您只接受特定的值,这里有一种替代方法

使用if

$locale = session()->get('locale'); // value = 'en';
if ($locale == "en") {
  echo $page->content_en;
} elseif ($locale == "ru") {
  echo $page->content_ru;
} elseif ($locale == "de") {
  echo $page->content_de;
}

使用switch

$locale = session()->get('locale'); // value = 'en';
switch ($locale) {
  case "en":
    echo $page->content_en;
    break;
  case "ru":
    echo $page->content_ru;
    break;
  case "de":
    echo $page->content_de;
    break;
}

应该这样做:

echo $page->{'content_' . session()->get('locale')};