Tom Tom - 5 days ago 5
PHP Question

PHP7 Constructor class name

I have a Laravel 4.2 application which works with PHP5 without any problems. Since I installed a new vagrant box running PHP7 an error appears as soon as I run a model where the name of a function is the same as the class name (relationship-function) like this:

<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

use SoftDeletingTrait;

[...]

public function participant()
{
return $this->morphTo();
}

[...]

}


I get the following error message:


Methods with the same name as their class will not be constructors in a future version of PHP; Participant has a deprecated constructor (View: ...)


So what I didn't know until today is, that in PHP4 methods with the same name were the contructor of a class. Hmm. I am really a bad programmer... But in this case, from my understanding of what is happening in PHP7, they correct a failure of mine as I never wanted to use this function as a constructor, since it defines only an Eloquent relationship.

But how can I get rid of this message? As I understand this, in PHP4 my code was buggy, but not in PHP7, right? If not necessary I do not want to refactor this function, as it is used in several places.

Can anybody explain what I am doing wrong and why it worked with older PHP versions?

Thanks!

Answer

As I understand this, in PHP4 my code was buggy, but not in PHP7, right?

Not quite. PHP4-style constructors still work on PHP7, they are just been deprecated and they will trigger a Deprecated warning.

What you can do is define a __construct method, even an empty one, so that that method will not be called on a newly-created instance of the class.

class foo {
    public function __construct() {
        //nothing
    }

    public function foo() { // php4-style constructor
        echo 'this will not be called';
    }
}

new foo();

It worked with older PHP versions simply because constructors don't get return value. Every time you created a Participant instance, you implicitly call the participant method, that's all.

Comments