Hey Rowan,

> On 17 Jan 2015, at 19:40, Rowan Collins <rowan.coll...@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/





--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to