Bird
Raised Fist0
PHPprogramming~10 mins

DNF types (Disjunctive Normal Form) in PHP - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - DNF types (Disjunctive Normal Form)
Start with logical expression
↓
Convert to OR of ANDs form
↓
Identify each AND clause
↓
Combine clauses with OR
↓
Result: Expression in DNF
DNF means writing a logical expression as OR of AND groups. We break it down into AND parts, then join them with OR.
Execution Sample
PHP
<?php
$A = true;
$B = false;
$result = ($A && $B) || (!$A && $B);
echo $result ? 'true' : 'false';
?>
This code evaluates a DNF expression with variables A and B and prints true or false.
Execution Table
StepExpression PartEvaluationResult
1$Atruetrue
2$Bfalsefalse
3$A && $Btrue AND falsefalse
4!$ANOT truefalse
5!$A && $Bfalse AND falsefalse
6($A && $B) || (!$A && $B)false OR falsefalse
7echo $resultfalseprints 'false'
💡 Expression fully evaluated, final result is false
Variable Tracker
VariableStartAfter Step 1After Step 2Final
$Aundefinedtruetruetrue
$Bundefinedundefinedfalsefalse
$resultundefinedundefinedundefinedfalse
Key Moments - 2 Insights
Why is ($A && $B) false even though $A is true?
Because AND requires both sides true. $B is false (see step 2 and 3 in execution_table), so whole AND is false.
Why do we use OR between AND groups in DNF?
OR means if any AND group is true, whole expression is true. This matches DNF form (see step 6).
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what is the value of !$A at step 4?
Atrue
Bfalse
Cundefined
Derror
💡 Hint
Check step 1 where $A is true, so NOT true is false at step 4.
At which step does the expression ($A && $B) || (!$A && $B) become false?
AStep 6
BStep 5
CStep 3
DStep 7
💡 Hint
Step 6 shows the OR of two false AND groups resulting in false.
If $B was true instead of false, what would be the result at step 6?
Aundefined
Bfalse
Ctrue
Derror
💡 Hint
If $B is true, then ($A && $B) is true AND true = true, so OR result is true.
Concept Snapshot
DNF means writing logic as OR of AND groups.
Syntax: (A && B) || (C && D) || ...
Each group joined by OR, inside groups use AND.
Evaluate AND groups first, then OR them.
Useful for simplifying or analyzing logic.
Full Transcript
This example shows how to evaluate a Disjunctive Normal Form (DNF) expression in PHP. We start with variables $A and $B. We check each part: $A is true, $B is false. Then we evaluate AND groups: $A && $B is false because $B is false. !$A is false because $A is true. So !$A && $B is false. Finally, we OR the two groups: false OR false is false. The program prints 'false'. This shows how DNF expressions are evaluated step by step.

Practice

(1/5)
1.

What does a Disjunctive Normal Form (DNF) type represent in PHP?

easy
A. A type that disables type checking
B. A type that combines OR (union) and AND (intersection) conditions
C. A type that restricts variables to integers only
D. A type that only allows a single data type

Solution

  1. Step 1: Understand DNF type concept

    DNF types combine multiple conditions using OR (union) and AND (intersection) to specify allowed types.
  2. Step 2: Compare options with definition

    Only the type that combines OR (union) and AND (intersection) conditions correctly describes this combination of OR and AND conditions in PHP types.
  3. Final Answer:

    A type that combines OR (union) and AND (intersection) conditions -> Option B
  4. Quick Check:

    DNF types = OR + AND conditions [OK]
Hint: DNF means combining OR and AND in types [OK]
Common Mistakes:
  • Thinking DNF only means union types
  • Confusing DNF with simple single types
  • Assuming DNF disables type checks
2.

Which of the following is the correct PHP syntax for a DNF type combining union and intersection?

function example( /* type here */ $param) {}
easy
A. int&float&Serializable
B. int&float|Serializable
C. int|float|Serializable
D. int|float&Serializable

Solution

  1. Step 1: Recall PHP DNF syntax rules

    PHP uses | for union (OR) and & for intersection (AND). Intersection has higher precedence, so int|float&Serializable means int OR (float AND Serializable).
  2. Step 2: Analyze each option

    int|float&Serializable correctly uses union and intersection combined. int&float|Serializable misplaces operators, C uses only union, D uses only intersection.
  3. Final Answer:

    int|float&Serializable -> Option D
  4. Quick Check:

    Union (|) and intersection (&) combined correctly = int|float&Serializable [OK]
Hint: Use | for OR, & for AND in PHP types [OK]
Common Mistakes:
  • Mixing order of | and & operators
  • Using only unions or only intersections
  • Writing invalid syntax like &| or |&
3.

What is the output of this PHP code snippet?

interface A {} 
interface B {} 
class C implements A, B {} 
function test(A|B&object $param): string { 
  return $param instanceof B ? 'Yes' : 'No'; 
} 
$obj = new C(); 
echo test($obj);
medium
A. Fatal error
B. No
C. Yes
D. Empty output

Solution

  1. Step 1: Understand the type declaration

    The parameter type is A OR (B AND object). Class C implements both A and B, so it matches the type.
  2. Step 2: Evaluate the instanceof check

    $obj is instance of B, so the ternary returns 'Yes'.
  3. Final Answer:

    Yes -> Option C
  4. Quick Check:

    Object matches B, so output is 'Yes' [OK]
Hint: Check instanceof for intersection parts in DNF types [OK]
Common Mistakes:
  • Assuming type mismatch causes error
  • Ignoring intersection precedence
  • Thinking output is 'No' without checking instanceof
4.

Identify the error in this PHP function using DNF types:

function checkType(int|float&Countable $value) { 
  return is_countable($value); 
}
medium
A. Invalid use of & with float, which is not an object
B. Missing return type declaration
C. is_countable() cannot be used here
D. int and float cannot be unioned

Solution

  1. Step 1: Analyze intersection with primitive types

    float is a primitive type and cannot be combined with & Countable (an interface) because & requires object types.
  2. Step 2: Confirm error cause

    Using & between float and Countable causes a type error since float is not an object.
  3. Final Answer:

    Invalid use of & with float, which is not an object -> Option A
  4. Quick Check:

    Intersection requires objects, float is primitive [OK]
Hint: Intersection (&) only works with object types [OK]
Common Mistakes:
  • Thinking primitives can be intersected with interfaces
  • Ignoring PHP type system rules
  • Assuming is_countable() causes error
5.

Given these interfaces and classes:

interface X {} 
interface Y {} 
class A implements X {} 
class B implements Y {} 
class C implements X, Y {}

Which DNF type correctly accepts objects that implement either X alone, or both X and Y together?

hard
A. X|(X&Y)
B. X&Y|Y
C. X|Y
D. (X|Y)&Y

Solution

  1. Step 1: Understand the requirement

    Accept objects that implement X alone OR both X and Y together.
  2. Step 2: Translate to DNF

    This means either X alone OR (X AND Y). X|(X&Y) expresses this as X|(X&Y).
  3. Step 3: Check other options

    X&Y|Y includes Y alone, which is incorrect. X|Y accepts X or Y alone, too broad. (X|Y)&Y includes Y alone, which is incorrect.
  4. Final Answer:

    X|(X&Y) -> Option A
  5. Quick Check:

    DNF matches X alone or X and Y together = X|(X&Y) [OK]
Hint: Use union of X and intersection X&Y for this case [OK]
Common Mistakes:
  • Choosing simple union X|Y which is too broad
  • Misplacing parentheses changing logic
  • Confusing intersection and union precedence
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard