PHP了解三元运算符

时间:2015-07-16 17:06:28

标签: php ternary-operator

我仍然习惯于三元运算符,我发现它是一种最小化代码的有用方法。如果它像下面的示例(示例1)

那样简单,我可以理解它

示例1

$OrderType = ($name == 'first' ? 'Fred' : ($name == 'last' ? 'Dabo' : 'RAND()'))

这可以理解为:如果$name'first',那么如果'Fred'$name则使用'last',那么请使用'Dabo' 'RAND()'

但是我在另一个网站上看到了这个(例子2),这对我没有任何意义。

示例2

$score = 10;
$age = 20;
echo 'Taking into account your age and score, you are: ',($age > 10 ? ($score < 80 ? 'behind' : 'above average') : ($score < 50 ? 'behind' : 'above average')); // returns 'You are behind'

那么有人可以用简单的语言向我解释这个三元运算符将如何读取吗?

2 个答案:

答案 0 :(得分:1)

用简单的语言表示,如果$ age&gt; 10,考虑80分好成绩,否则考虑50分好。

考虑将嵌套逻辑分解为自己的辅助函数,而不是嵌套三元组。我发现以下代码更容易理解。

function adult_score($score) {
    return $score > 80 ? "behind" : "above average";
}

function child_score($score) {
    return $score < 50 ? "behind" : "above average";
}

$score = 10;
$age = 20;
echo $age > 10 ? adult_score($score) : child_score($score);

答案 1 :(得分:-1)

所以,你理解一个三元组,在?之前是if语句,?:之间的部分是“如果真的那么做”,而:之后的部分是:之后的部分。 1}}是“假如做”。因此,如果您使用那个三元组并用if语句包装“if”部分并用花括号包装“true”和“false”并用else替换if($age > 10){ if($score < 80){ return 'behind'; } else { return 'above average'; } } else { if($score < 50){ return 'behind'; } else { return 'above average'; } } ,那么最终会得到:

...  
System.IO.FileNotFoundException: Could not load file or assembly 'System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 or one of its dependencies.  
The system cannot find the file specified.  
File name: 'System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35|'  

Server stack trace:  
    at System.Reflection.RuntimeAssembly.GetExportedTypes(RuntimeAssembly assembly, ObjectHandleOnStack retTypes)  
    at System.Reflection.RuntimeAssembly.GetExportedTypes()  
    at NUnit.Core.CoreExtensions.InstallAdhocExtensions(Assembly assembly)  
    at NUnit.Core.Builders.TestAssemblyBuilder.Load(String path)  
    at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, Boolean autoSuites)  
    at NUnit.Core.Builders.TestAssemblyBuilder.Build(String assemblyName, String testName, Boolean autoSuites)  
    at NUnit.Core.TestSuiteBuilder.Build(TestPackage package)  
    at NUnit.Core.SimpleTestRunner.Load(TestPackage package)  
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package)  
    at NUnit.Core.ProxyTestRunner.Load(TestPackage package)  
    at NUnit.Core.RemoteTestRunner.Load(TestPackage package)  
    at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object|[|] args, Object server, Object|[|]& outArgs)  
    at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg)  
...  

就像其他人所说的那样,它很丑陋且难以理解。除非您的目标是让其他人难以遵循您的代码,否则请不要这样做。请你,不要。它们对于if if语句很好,但快速混乱。让自己和代码的任何未来读者都受宠。