Skip to content

PHP 7 – PHP 4-Style Constructors are Deprecated

Last updated on December 13, 2015

PHP 4 constructors were preserved in PHP 5 alongside the new __construct().PHP 4 constructors are methods that have the same name as the class they are defined in. Now, PHP 4-style constructors are being deprecated in favour of having only a single method (__construct()) to be invoked on object creation. And in PHP8 recognition for old constructors will be outright removed so it’s better to avoid PHP 4 style constructors.

Before PHP 5 and PHP 5 – class is defined within a namespace or if an __construct() method existed, then a PHP 4-style constructor was recognized as a plain method. If it was defined above an __construct() method, then an E_STRICT notice would be emitted, but still recognized as a plain method.

In PHP 7, if the class is not in a namespace and there is no __construct() method present, the PHP 4-style constructor will be used as a constructor but an E_DEPRECATED will be emitted.

In PHP 8, the PHP 4-style constructor will always be recognized as a plain method and the E_DEPRECATED notice will disappear.

// Namespaced classes do not recognize PHP 4 constructors
namespace NS;
class Filter {
 
    // Not a constructor , normal method
    function filter($a) {}
}



class Filter {
 
    // PHP 5: filter is a constructor
    // PHP 7: filter is a constructor and E_DEPRECATED is raised
    // PHP 8: filter is a normal method and is not a constructor; no E_DEPRECATED is raised
    function filter($a) {}
}
 
$filter = new ReflectionMethod('Filter', 'filter');
 
// PHP 5: bool(true)
// PHP 7: bool(true)
// PHP 8: bool(false)
var_dump($filter->isConstructor());


// function filter is not used as constructor in PHP 5+
class Filter {
    // PHP 5: E_STRICT "Redefining already defined constructor"
    // PHP 7: No error is raised
    // PHP 8: No error is raised
    function filter($a) {}
    function __construct() {}
}

// function filter is not used as constructor in PHP 5+
class Filter {
    function __construct() {}
 
    // PHP 5.0.0 - 5.2.13, 5.3.0 - 5.3.2: E_STRICT "Redefining already defined constructor"
    // PHP 5.2.14 - 5.2.17, 5.3.3 - 5.6: No error is raised
    // PHP 7: No error is raised
    // PHP 8: No error is raised
    function filter($a) {}
}

class Filter {
    // PHP 5: filter is a constructor
    // PHP 7: filter is a constructor and E_DEPRECATED is raised
    // PHP 8: filter is a normal method and is not a constructor; no E_DEPRECATED is raised
    function filter() {}
}
 
class FilterX extends Filter {
 
    function __construct() {
        // PHP 5: Filter::filter is called; no error
        // PHP 7: Filter::filter is called; no error
        // PHP 8: "Fatal error: Cannot call constructor"
        parent::__construct();
    }
 
}
 
new FilterX();
 
0 0 votes
Article Rating
Subscribe
Notify of
guest

1 Comment
Most Voted
Newest Oldest
Inline Feedbacks
View all comments