【问题标题】:Ternary operator when casting a variable转换变量时的三元运算符
【发布时间】:2015-03-26 07:00:41
【问题描述】:

在编写is_numeric($var) ? (Int)$var : (String)$var; 时,我想知道是否可以将ternary operator 移动到我cast 变量所在的部分:

echo (is_numeric($var) ? Int : String)$var;

不出所料,它不起作用:

PHP 解析错误:语法错误,意外的 '$var' (T_VARIABLE)

这有可能吗?或者可能与我正在尝试做的事情接近?与其说是使用它,不如说是一种好奇心。

【问题讨论】:

  • 强制转换改变了表达式左侧解释值的方式。三元组返回选择运行时值(不是类型)。您需要以不同的方式转换相同的变量,而不是选择类型...我看到 @Rizier123 已将其添加为答案:)

标签: php types casting ternary-operator shorthand-if


【解决方案1】:

是的,这是可能的。这应该适合你:

var_dump((is_numeric($var)?(int)$var :(string)$var));

作为一个测试它的例子,你可以很容易地做到这一点:

$var = 5;
var_dump((true?(int)$var :(string)$var)); //Or var_dump((false?(int)$var :(string)$var));

输出:

int(5)  //string(1) "5"

编辑:

他们唯一能想到的做类似你想要的事情的方法是:

settype($var, (is_numeric($var)?"int":"string")); 
var_dump($var);

【讨论】:

  • 很好的答案,但我正在寻找一种在实际铸造过程中使用它的方法,就像我问题中的代码一样。在我的问题的第一部分,我试图暗示我熟悉 type jugglingternary operator 概念,但想知道这是否可以移动到 cast 表达式中.无论如何都要投票。
  • @ManeatingKoala 啊,现在我明白你想做什么了,但据我所知这是不可能的
  • @ManeatingKoala 更新了我的答案,这就是我能想到的和你想要的非常相似
【解决方案2】:

没有;这不可能。三元运算符需要一个转换运算符不是的表达式。

然而,可以使用具有三元运算符的一等函数,即表达式,如下所示:

$toInt = function($var) {
    return (int) $var;
};

$toString = function($var) {
    return (string) $var;
};

$foo = "10";

var_dump(call_user_func(is_numeric($foo) ? $toInt : $toString, $foo));

【讨论】:

  • 接受答案,因为“三元运算符需要一个强制转换运算符不是的表达式”。
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 2015-07-13
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多