我仍然习惯于三元运算符,我发现它是一种最小化代码的有用方法。如果它像下面的示例(示例1)
那样简单,我可以理解它$OrderType = ($name == 'first' ? 'Fred' : ($name == 'last' ? 'Dabo' : 'RAND()'))
这可以理解为:如果$name
是'first'
,那么如果'Fred'
是$name
则使用'last'
,那么请使用'Dabo'
'RAND()'
但是我在另一个网站上看到了这个(例子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'
那么有人可以用简单的语言向我解释这个三元运算符将如何读取吗?
答案 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语句很好,但快速混乱。让自己和代码的任何未来读者都受宠。