Skip to content

Instantly share code, notes, and snippets.

@FlorianWolters
Last active April 27, 2016 14:17
Show Gist options
  • Save FlorianWolters/5195734 to your computer and use it in GitHub Desktop.
Save FlorianWolters/5195734 to your computer and use it in GitHub Desktop.
Demonstrates a PHP bug: It is possible to directly call the magic method "__construct".
<?php
/**
* DirectCallToMagicMethodConstruct.php
*
* PHP 5.4.13 (cli) (built: Mar 15 2013 02:05:59)
* Copyright (c) 1997-2013 The PHP Group
* Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
* with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans
*/
class ParentClass
{
function __construct()
{
echo __METHOD__, \PHP_EOL;
}
function __clone()
{
}
}
class ChildClass extends ParentClass
{
function __construct()
{
echo __METHOD__, \PHP_EOL;
// The following call would result in endless recursion.
// $this->__construct();
// Accessing the superclass is possible via the special name "parent".
// There is not distinction between member methods and static methods!
parent::__construct();
}
}
// The "new" operator is used to create a new instance. This invokes the magic (interceptor) method "__construct" (if defined).
$example = new ChildClass;
// The "clone" operator is used to create a shallow copy of an object. This invokes the magic (interceptor) method "__clone" (if defined).
$clonedExample = clone $example;
// The following call would raise an \E_FATAL: Cannot call __clone() method on objects - use 'clone $obj' instead in [...] on line 45
//$example->__clone();
// The following call DOES NOT raise an \E_FATAL. From a clients point of view, it should do that with the following message:
// "Cannot call __construct() method on objects - use 'new <Class>' instead in [...] on line 49"
$example->__construct();
// Question: Why is the behaviour different?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment