Bird
Raised Fist0
PHPprogramming~20 mins

Union types in practice in PHP - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Union Types Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of function with union type return
What is the output of this PHP code using union types in the return declaration?
PHP
<?php
function test(int|string $input): int|string {
    if (is_int($input)) {
        return $input * 2;
    }
    return strtoupper($input);
}

echo test(5) . ' ' . test('hello');
ATypeError
B5 hello
C10 hello
D10 HELLO
Attempts:
2 left
💡 Hint
Remember the function returns int or string depending on input type.
❓ Predict Output
intermediate
1:30remaining
Variable type with union type hint
What will be the output of this PHP code that uses union types for a variable?
PHP
<?php
/** @var int|string $var */
$var = 10;
if (is_string($var)) {
    echo 'string';
} elseif (is_int($var)) {
    echo 'int';
} else {
    echo 'other';
}
Aint
Bstring
Cother
DTypeError
Attempts:
2 left
💡 Hint
Check the actual value type assigned to the variable.
🔧 Debug
advanced
2:00remaining
Identify the error with union types in method parameter
What error will this PHP code produce when calling the method with a float argument?
PHP
<?php
class Calculator {
    public function multiply(int|float $a, int|float $b): float {
        return $a * $b;
    }
}

$calc = new Calculator();
echo $calc->multiply(3.5, 2.0);
ATypeError: Argument 1 passed must be int|float, float given
BNo error, outputs 7
CFatal error: Return type must be float, int given
DParse error: Syntax error in union type declaration
Attempts:
2 left
💡 Hint
Check if float is allowed in parameter and return types.
📝 Syntax
advanced
1:30remaining
Which union type declaration is invalid?
Which of the following union type declarations in PHP is invalid and causes a syntax error?
Afunction foo(int|string $param): int|string {}
Bfunction bar(int|float|null $param): int|float|null {}
Cfunction baz(int|void $param): int|void {}
Dfunction qux(string|false $param): string|false {}
Attempts:
2 left
💡 Hint
Check if 'void' can be used in union types.
🚀 Application
expert
2:30remaining
Determine the output of complex union type usage
What is the output of this PHP code that uses union types with nullable and mixed types?
PHP
<?php
function process(int|string|null $value): string|int|null {
    return match(true) {
        is_int($value) => $value * 3,
        is_string($value) => strtoupper($value),
        default => null
    };
}

var_dump(process(4));
var_dump(process('abc'));
var_dump(process(null));
A
int(12)
string(3) "ABC"
NULL
B
int(12)
string(3) "abc"
NULL
CTypeError on null input
D
int(4)
string(3) "ABC"
NULL
Attempts:
2 left
💡 Hint
Check how match expression handles each type and the return values.

Practice

(1/5)
1. What does a union type declaration like int|string mean in PHP?
easy
A. The value must be both an integer and a string at the same time.
B. The value can only be a string.
C. The value can only be an integer.
D. The value can be either an integer or a string.

Solution

  1. Step 1: Understand union type syntax

    The | symbol means the value can be one of the listed types.
  2. Step 2: Interpret int|string

    This means the value can be either an integer or a string, not both simultaneously.
  3. Final Answer:

    The value can be either an integer or a string. -> Option D
  4. Quick Check:

    Union type int|string means either int or string [OK]
Hint: Union types allow multiple possible types separated by | [OK]
Common Mistakes:
  • Thinking the value must be both types at once
  • Confusing union with intersection types
  • Assuming only one type is allowed
2. Which of the following is the correct syntax for an optional function parameter that accepts either an array or null using union types?
easy
A. function example(array|null $data = null) {}
B. function example(array&null $data) {}
C. function example(array? $data) {}
D. function example(array|null $data) {}

Solution

  1. Step 1: Identify correct union type syntax

    Union types use | between types, so array|null is correct.
  2. Step 2: Check default value for nullable parameter

    To accept null, the parameter should default to null, so $data = null is needed.
  3. Final Answer:

    function example(array|null $data = null) {} -> Option A
  4. Quick Check:

    Union type with default null = correct syntax [OK]
Hint: Use | for union and default null for optional nullable [OK]
Common Mistakes:
  • Using & instead of | for union
  • Missing default null for nullable parameter
  • Using ? without type for union
3. What will be the output of this PHP code?
function describe(mixed $value): string {
    return match (gettype($value)) {
        'integer' => 'Number: ' . $value,
        'string' => 'Text: ' . $value,
        default => 'Unknown type'
    };
}

echo describe(10) . ', ' . describe('hello') . ', ' . describe(3.14);
medium
A. Number: 10, Text: hello, Unknown type
B. Number: 10, Text: hello, Number: 3.14
C. Unknown type, Text: hello, Unknown type
D. Number: 10, Unknown type, Unknown type

Solution

  1. Step 1: Analyze the match expression with gettype()

    For 10, gettype returns 'integer', so output is 'Number: 10'. For 'hello', gettype returns 'string', so output is 'Text: hello'. For 3.14, gettype returns 'double', which matches default case 'Unknown type'.
  2. Step 2: Combine outputs

    Outputs joined by commas: 'Number: 10, Text: hello, Unknown type'.
  3. Final Answer:

    Number: 10, Text: hello, Unknown type -> Option A
  4. Quick Check:

    Match on gettype gives expected strings [OK]
Hint: Match gettype results carefully for each input [OK]
Common Mistakes:
  • Assuming float is treated as integer
  • Ignoring default case in match
  • Confusing gettype return values
4. Identify the error in this PHP function using union types:
function process(int|string $input): int {
    if (is_string($input)) {
        return strlen($input);
    } else {
        return $input + 1;
    }
}

process(true);
medium
A. The is_string check is incorrect syntax.
B. The function should return string, not int.
C. Passing a boolean to a parameter expecting int|string causes a TypeError.
D. The function does not handle float inputs.

Solution

  1. Step 1: Check parameter type declaration

    The function expects int|string, so only integers or strings are allowed.
  2. Step 2: Analyze the call with true

    Passing true (boolean) violates the declared union type, causing a TypeError at runtime.
  3. Final Answer:

    Passing a boolean to a parameter expecting int|string causes a TypeError. -> Option C
  4. Quick Check:

    Type mismatch causes error [OK]
Hint: Check argument types match union types exactly [OK]
Common Mistakes:
  • Ignoring type mismatch errors
  • Thinking is_string is invalid syntax
  • Assuming function return type is wrong
5. You want to write a function that accepts either a string or an array of strings and returns a single string. Which of the following implementations correctly uses union types and handles both cases?
hard
A. function joinStrings(string|array $input): string { return implode(', ', $input); }
B. function joinStrings(string|array $input): string { if (is_array($input)) { return implode(', ', $input); } return $input; }
C. function joinStrings(string|array $input): string { if (is_string($input)) { return implode(', ', $input); } return $input; }
D. function joinStrings(array|string $input): string { if (is_array($input)) { return $input; } return implode(', ', $input); }

Solution

  1. Step 1: Check union type declaration

    Both string|array and array|string are valid syntax.
  2. Step 2: Verify handling of each type

    function joinStrings(string|array $input): string { if (is_array($input)) { return implode(', ', $input); } return $input; } checks if input is array, then joins with implode. If input is string, returns it directly. This correctly handles both cases.
  3. Step 3: Identify errors in other options

    function joinStrings(string|array $input): string { return implode(', ', $input); } tries to implode without checking type, causing error if input is string. function joinStrings(string|array $input): string { if (is_string($input)) { return implode(', ', $input); } return $input; } incorrectly calls implode on string input. function joinStrings(array|string $input): string { if (is_array($input)) { return $input; } return implode(', ', $input); } returns array directly without joining.
  4. Final Answer:

    function joinStrings(string|array $input): string { if (is_array($input)) { return implode(', ', $input); } return $input; } -> Option B
  5. Quick Check:

    Check type then handle accordingly [OK]
Hint: Check type before processing union inputs [OK]
Common Mistakes:
  • Calling implode on string input
  • Returning array instead of string
  • Not checking input type before processing
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