我已经多次询问过这个问题了,但我感到很困惑并遇到了类似情况。我不确定this和我的背景是否相同,只要我确信这是一个不同的场景,否则我可能误解了解释。 好。这是我的情景:
$amount = isset($cost->getCostAmount()) ? $cost->getCostAmount() : 0;
函数costAmount()在运行时动态添加,可能存在也可能不存在。所以我需要首先检查我的功能是否存在,休息非常清楚。但现在在这种情况下我得到一个致命的错误:
致命错误:无法在.... / file.php
中的写入上下文中使用方法返回值
现在,如果我这样做:
$amount = $cost->getCostAmount() ? $cost->getCostAmount() : 0;
显然我会收到错误:
调用未定义的方法:getCostAmount
如果该功能不存在。对此可能有什么解决方案?解释将被视为有用。
请求:请为问题被低估的原因添加足够的评论,以便将来能够改进我的问题。
答案 0 :(得分:8)
改变这个:
$amount = isset($cost->getCostAmount()) ? $cost->getCostAmount() : 0;
要..
$amount = method_exists($cost, 'getCostAmount') ? $cost->getCostAmount() : 0;
因为这段代码isset($cost->getCostAmount())
正在执行方法getCostAmount
,即使它不存在
答案 1 :(得分:4)
isset
要求您将变量传递给它而不是函数。它无法检查是否设置了返回值。
你应该像这样使用它,
$cost_amount = $cost->getCostAmount();
$amount = isset($cost_amount) ? $cost_amount : 0;
即使这段代码也没有意义。因为这里$ cost_amount将始终设置。如果getCostAmount
返回null
或empty
字符串,您应该检查它。
$cost_amount = $cost->getCostAmount();
$amount = !is_null($cost_amount) ? $cost_amount : 0;
此外,您的代码找不到getCostAmount
功能。如果你知道这是在某处包含它。如果动态生成此方法,则可以使用method_exists
进行检查。
$amount = method_exists($cost, 'getCostAmount')? $cost->getCostAmount(): 0;
答案 2 :(得分:1)
尝试将isset()更改为function_exists()
答案 3 :(得分:0)
您可以通过以下方式使用:method_exists
(http://www.php.net/manual/en/function.method-exists.php):
var_dump(method_exists($cost,'getCostAmount'));