{"id":14768,"date":"2024-04-10T12:34:45","date_gmt":"2024-04-10T10:34:45","guid":{"rendered":"https:\/\/mainetcare.de\/?post_type=techdoc&#038;p=14768"},"modified":"2026-07-14T11:35:16","modified_gmt":"2026-07-14T09:35:16","slug":"ternary-operator-versus-null-coalescing-operator-versus-null-coalescing-assignment-operator-explained-by-katzen","status":"publish","type":"gartenschuppen","link":"https:\/\/mainetcare.de\/en\/gartenschuppen\/ternary-operator-versus-null-coalescing-operator-versus-null-coalescing-assignment-operator-von-katzen-erklaert\/","title":{"rendered":"Ternary Operator ?: versus Null Coalescing Operator ?? versus Null Coalescing Assignment Operator ??= explained by cats"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><strong>In short:<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">PHP offers two useful operators to simplify condition checks: <strong>the Ternary Operator (<code>?:<\/code>)<\/strong> and the <strong>Zero coalescing operator (<code>??<\/code>)<\/strong>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Both operators are used to <strong>Streamline code and improve readability<\/strong>but they differ in their functionality and application.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Ternary Operator is an abbreviation for:<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">if<\/span>(human_is_asleep()) {\n   be_as_loud_as_you_can();\n} <span class=\"hljs-keyword\">else<\/span> {\n   sleep();\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">The same with the ternary operator:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">human_is_asleep() ? be_as_loud_as_you_can() : sleep();<\/code><\/span><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Since ternary operators are mainly there to increase readability, nested ternary operators are not a good idea because they worsen readability:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">\n$alter = <span class=\"hljs-number\">3<\/span>; <span class=\"hljs-comment\">\/\/ Age of the cat in years<\/span>\n$weight = <span class=\"hljs-number\">6<\/span>; <span class=\"hljs-comment\">\/\/ Weight of the cat in kilograms<\/span>\n\n<span class=\"hljs-comment\">\/\/ Determination of food preference with a nested ternary operator<\/span>\n$FoodPreference = $alter &lt; <span class=\"hljs-number\">2<\/span> ? ($weight &lt; <span class=\"hljs-number\">3<\/span> ? <span class=\"hljs-string\">'Young animal wet food (very expensive)'<\/span> : <span class=\"hljs-string\">'Young animal dry food'<\/span> :\n                  ($weight &lt; <span class=\"hljs-number\">4<\/span> ? <span class=\"hljs-string\">'Adult wet food'<\/span> : <span class=\"hljs-string\">'Adult dry food'<\/span>);\n\n<span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"This cat prefers $ food preference.\"<\/span>;<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-null-coalescing-operator\">Zero coalescing operator (??)<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The null coalescing operator (\"coalescing\" = \"merging\") checks for the presence of a value and is used with the syntax <code>Expression1 ?? Expression2<\/code> used. If <code>Printout1<\/code> <strong>exists and not <code>zero<\/code><\/strong> is <code>Printout1<\/code> is returned; otherwise <code>Printout2<\/code> evaluated and returned. Particularly useful in the following example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">$catData = [\n    <span class=\"hljs-string\">'Maunzi'<\/span> =&gt; [<span class=\"hljs-string\">'favorite toy'<\/span> =&gt; <span class=\"hljs-string\">'Laser pointer'<\/span>],\n    <span class=\"hljs-string\">'Fur ball'<\/span> =&gt; [<span class=\"hljs-string\">'favorite toy'<\/span> =&gt; <span class=\"hljs-keyword\">zero<\/span>],\n    <span class=\"hljs-string\">'Brett Pit'<\/span> =&gt; [],\n    <span class=\"hljs-string\">'Nuclear danger'<\/span> =&gt; [<span class=\"hljs-string\">'favorite toy'<\/span> =&gt; <span class=\"hljs-string\">'Love'<\/span>],\n];\n<span class=\"hljs-keyword\">foreach<\/span> ($catsData <span class=\"hljs-keyword\">as<\/span> $name =&gt; $data) {\n    1TP5Favorite toy = $data[<span class=\"hljs-string\">'favorite toy'<\/span>] ?? <span class=\"hljs-string\">'Old plastic mouse'<\/span>;\n    <span class=\"hljs-comment\">\/\/ The same as Ternary:<\/span>\n    <span class=\"hljs-comment\">\/\/ $favorite toy = isset($data['favoritetoy']) &amp;&amp; $data['favoritetoy'] !== null ? $daten['lieblingsspielzeug'] : 'Old plastic mouse' <\/span>\n   <span class=\"hljs-comment\">\/\/ With long variable names, you can clearly see the advantage of the ? operator.<\/span>\n    <span class=\"hljs-keyword\">echo<\/span> <span class=\"hljs-string\">\"$name loves to play with toys $favorite toys.\\n\"<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Issue: <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>Maunzi loves to play with toy laser pointers.<br>Fellkugel loves to play with toy Olle Plastikmaus.<br>Brett Pit loves to play with toy Olle Plastikmaus.<br>Nuclear danger loves to play love with toys. \ud83d\ude38<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In this case, the zero coalescing operator was used to <em>undefined<\/em> Inputs for cat toys a <em>Assign default value<\/em>. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With zero coalescing assignment, an assignment is performed immediately, it is an abbreviation in the abbreviation. It is particularly useful when you want to normalize nested indexed arrays, for example:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">\n<span class=\"hljs-comment\">\/\/ $daten['katzen'][$i]['rasse'] ??= 'European Shorthair'; <\/span>\n<span class=\"hljs-comment\">\/\/ is easier to read and maintain than the equivalent:<\/span>\n<span class=\"hljs-comment\">\/\/ $daten['katzen'][$i]['rasse'] = $daten['katzen'][$i]['rasse'] ?? 'European Shorthair';<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">That was a short excursion into the world of <s>Cats<\/s> PHP operators. Have fun coding.<\/p>","protected":false},"featured_media":14770,"template":"","meta":{"_acf_changed":false},"class_list":["post-14768","gartenschuppen","type-gartenschuppen","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/mainetcare.de\/en\/wp-json\/wp\/v2\/gartenschuppen\/14768","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mainetcare.de\/en\/wp-json\/wp\/v2\/gartenschuppen"}],"about":[{"href":"https:\/\/mainetcare.de\/en\/wp-json\/wp\/v2\/types\/gartenschuppen"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mainetcare.de\/en\/wp-json\/wp\/v2\/media\/14770"}],"wp:attachment":[{"href":"https:\/\/mainetcare.de\/en\/wp-json\/wp\/v2\/media?parent=14768"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}