"Andrea Faulds" wrote in message
news:d554c8b8-0bfb-44f7-b23e-8bfc12ae2...@ajf.me...
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:
<<snip>>
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.
If a developer cannot read valid code then it is a developer problem. It is
not up to the language to dictate style - it provides the functions and
features while style and readability are the sole responsibility of the
individual developer.
This actually tripped me up on more than one occasion when updating tests
broken by the removal of PHP 4 constructors in php-src.
Perhaps this issue can be solved by the RFC on Default Constructors? See
https://wiki.php.net/rfc/default_ctor
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!
Perhaps there should be a new rule which says that invoking a constructor
with anything other than "new" or "parent::__contruct()" should be illegal,
in which case this situation would generate an error.
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/
--
Tony Marston
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php