Bird
Raised Fist0
PHPprogramming~20 mins

__clone for object copying in PHP - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
PHP Clone Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of cloning with __clone method
What is the output of this PHP code when cloning an object with a __clone method that modifies a property?
PHP
<?php
class Box {
    public $size;
    public function __construct($size) {
        $this->size = $size;
    }
    public function __clone() {
        $this->size *= 2;
    }
}
$box1 = new Box(5);
$box2 = clone $box1;
echo $box1->size . ',' . $box2->size;
?>
A5,5
B10,5
C5,10
D10,10
Attempts:
2 left
💡 Hint
Remember that __clone is called only on the cloned object, not the original.
🧠 Conceptual
intermediate
1:30remaining
Effect of __clone on nested objects
If an object has a property that is another object, what happens to that nested object when the outer object is cloned using __clone?
AThe nested object is removed from the clone.
BThe nested object is also cloned automatically.
CThe nested object is converted to a string in the clone.
DThe nested object is shared between original and clone unless manually cloned in __clone.
Attempts:
2 left
💡 Hint
Think about shallow vs deep copy.
🔧 Debug
advanced
2:30remaining
Why does cloning not duplicate nested objects?
Given this code, why does changing the nested object's property in the clone affect the original's nested object?
PHP
<?php
class Inner {
    public $value;
    public function __construct($v) {
        $this->value = $v;
    }
}
class Outer {
    public $inner;
    public function __construct() {
        $this->inner = new Inner(10);
    }
    public function __clone() {
        // no cloning of inner
    }
}
$a = new Outer();
$b = clone $a;
$b->inner->value = 20;
echo $a->inner->value;
?>
ABecause PHP does not allow cloning nested objects.
BBecause __clone does not clone the nested Inner object, so both share the same Inner instance.
CBecause the Outer class constructor is called again on clone.
DBecause the Inner object is immutable.
Attempts:
2 left
💡 Hint
Check what __clone does with nested objects.
📝 Syntax
advanced
1:30remaining
Identify the syntax error in __clone method
Which option contains a syntax error in the __clone method?
PHP
class Sample {
    public $data;
    public function __clone() {
        // code here
    }
}
Apublic function __clone { $this->data = clone $this->data; }
Bpublic function __clone() { $this->data = clone $this->data; }
Cpublic function __clone() { $this->data = $this->data; }
D} ;atad>-siht$ enolc = atad>-siht$ { )(enolc__ noitcnuf cilbup
Attempts:
2 left
💡 Hint
Check the function declaration syntax carefully.
🚀 Application
expert
3:00remaining
How to implement deep cloning with __clone
Given a class with multiple nested objects, how should you implement __clone to ensure a deep copy of all nested objects?
AManually clone each nested object inside __clone, e.g., $this->nested = clone $this->nested; for each property.
BAssign nested objects to null inside __clone to avoid sharing.
CUse PHP's built-in deep clone function automatically called on clone.
DDo nothing; PHP clones nested objects by default.
Attempts:
2 left
💡 Hint
PHP cloning is shallow by default.

Practice

(1/5)
1. What does the __clone method do in PHP when you use the clone keyword on an object?
easy
A. It runs automatically to customize the copying process of the object.
B. It deletes the original object after cloning.
C. It converts the object into a string.
D. It prevents the object from being cloned.

Solution

  1. Step 1: Understand the clone keyword behavior

    When you clone an object in PHP, the __clone method runs automatically if it exists.
  2. Step 2: Purpose of __clone method

    The __clone method lets you customize how the object is copied, for example, copying inner objects or resetting properties.
  3. Final Answer:

    It runs automatically to customize the copying process of the object. -> Option A
  4. Quick Check:

    __clone customizes cloning = A [OK]
Hint: Remember: __clone runs automatically on cloning [OK]
Common Mistakes:
  • Thinking __clone deletes the original object
  • Confusing __clone with __toString
  • Believing cloning is prevented by __clone
2. Which of the following is the correct syntax to define a __clone method inside a PHP class?
easy
A. public function clone() {}
B. function __copy() {}
C. public function __clone() {}
D. private function cloneObject() {}

Solution

  1. Step 1: Identify the magic method syntax

    PHP magic methods start with double underscores, so __clone is the correct method name.
  2. Step 2: Confirm method declaration

    The method must be declared as public function __clone() to be called automatically on cloning.
  3. Final Answer:

    public function __clone() {} -> Option C
  4. Quick Check:

    Magic method __clone syntax = B [OK]
Hint: Magic methods start with double underscores __ [OK]
Common Mistakes:
  • Using single underscore or wrong method name
  • Making __clone private or protected
  • Confusing __clone with __copy
3. What will be the output of this PHP code?
class Box {
  public $size;
  public function __clone() {
    $this->size = $this->size * 2;
  }
}

$box1 = new Box();
$box1->size = 5;
$box2 = clone $box1;
echo $box2->size;
medium
A. 5
B. 10
C. 0
D. Error

Solution

  1. Step 1: Understand cloning and __clone method

    When $box1 is cloned to $box2, the __clone method runs and doubles the size property.
  2. Step 2: Calculate the new size value

    Original size is 5, after cloning size becomes 5 * 2 = 10.
  3. Final Answer:

    10 -> Option B
  4. Quick Check:

    size doubled on clone = 10 [OK]
Hint: Check __clone changes after cloning [OK]
Common Mistakes:
  • Assuming size stays same after cloning
  • Forgetting __clone runs automatically
  • Expecting syntax or runtime error
4. Consider this PHP code snippet:
class Item {
  public $value;
  public function __clone() {
    $this->value = $this->value + 1;
  }
}

$item1 = new Item();
$item1->value = 10;
$item2 = $item1;
$item3 = clone $item1;
echo $item2->value . ',' . $item3->value;

What is the output and why?
medium
A. 10,11
B. 11,11
C. 10,10
D. Error

Solution

  1. Step 1: Understand assignment vs cloning

    $item2 = $item1 assigns the same object reference, no cloning happens, so value stays 10.
  2. Step 2: Cloning triggers __clone method

    $item3 = clone $item1 creates a new object and runs __clone, increasing value by 1 to 11.
  3. Final Answer:

    10,11 -> Option A
  4. Quick Check:

    Assignment no change, clone adds 1 = 10,11 [OK]
Hint: Assignment copies reference; clone calls __clone [OK]
Common Mistakes:
  • Thinking assignment clones the object
  • Expecting both values to change
  • Confusing output order
5. You have a PHP class Person with a property address which is an object of class Address. You want to clone a Person object so that the address object is also cloned (deep copy), not just referenced. How should you implement the __clone method in Person?
hard
A. No need to implement __clone; cloning copies all properties deeply by default.
B. public function __clone() { $this->address = $this->address; }
C. public function __clone() { unset($this->address); }
D. public function __clone() { $this->address = clone $this->address; }

Solution

  1. Step 1: Understand shallow vs deep copy

    By default, cloning copies object properties shallowly, so inner objects remain shared references.
  2. Step 2: Implement deep copy in __clone

    To clone the inner address object, you must explicitly clone it inside __clone method.
  3. Final Answer:

    public function __clone() { $this->address = clone $this->address; } -> Option D
  4. Quick Check:

    Deep copy inner objects by cloning them in __clone [OK]
Hint: Clone inner objects inside __clone for deep copy [OK]
Common Mistakes:
  • Assuming clone copies inner objects automatically
  • Assigning inner object without cloning
  • Removing inner object instead of cloning
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