Re: [RFC] Remove PHP 4 Constructors

From: Date: Sat, 17 Jan 2015 20:20:36 +0000
Subject: Re: [RFC] Remove PHP 4 Constructors
References: 1 2 3 4 5 6 7 8 9 10 11 12 13 14  Groups: php.internals 
Request: Send a blank email to internals+get-80709@lists.php.net to get a copy of this message
Hey Rowan, > On 17 Jan 2015, at 19:40, Rowan Collins <rowan.collins@gmail.com> wrote: > > On 17/01/2015 18:33, Todd Ruth wrote: >>> As already mentioned I think as an end result we shouldn't have two >>> >ways to define constructors. Given that PHP already prefers the >>> >new-style constructors I've proposed that we work towards dropping the >>> >old-style, it's just down to a matter of how. >> I've been following these threads for about 10 years and beg that php >> internals continues to "live and let live". >> There have been many, many threads over the years from what I would call >> (with obvious bias) "OO fundamentalists". They seem to be at war with >> code that is "bad form". > > This is an argument that comes up a lot, and it has some merit, sometimes. > > I don't think using __construct over named-method for constructors really has anything to > do with "OOP fundamentalism"; it was a design change to make certain things simpler (like > parent::__construct), and more consistent (all reserved magic methods begin with __, so any method > not beginning with that is safe to use however you like). To add on to what you said, there’s also a quite important benefit that __construct is a lot more obvious in what it does. Looking at the following code: class Foo { public $foo, $bar, $qux; public function foobar() { // ... } public function bar() { // ... } public function foo() { // ... } public function baz() { // ... } public function qux() { // ... } } It’s not easy to spot the constructor at a glance, and it’s very easy to miss. Compare that to the following: class Foo { public $foo, $bar, $qux; public function foobar() { // ... } public function bar() { // ... } public function __construct() { // ... } public function baz() { // ... } public function qux() { // ... } } Far more obvious. This actually tripped me up on more than one occasion when updating tests broken by the removal of PHP 4 constructors in php-src. Sure, the constructor should probably be the first method, but *even if it is* it’s still nowhere near as obvious in PHP 4 style. Similarly, what does the following do? $this->foo(); It looks like a normal method call, and it is in a sense. But if you’re in Bar and inheriting from Foo, that’s a call to the parent class’s constructor! The following is much more obvious: parent::__construct(); I think it’s pretty clear why we changed to PHP5-style constructors. They’re just a lot more recognisable. :) -- Andrea Faulds http://ajf.me/

« previous php.internals (#80709) next »