web-dev-qa-db-ja.com

PHP7コンストラクタークラス名

PHP5で問題なく動作するLaravel 4.2アプリケーションがあります。 PHP7を実行する新しいvagrant boxをインストールしたため、関数の名前が次のようなクラス名(relationship-function)と同じモデルを実行するとすぐにエラーが表示されます。

<?php

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

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

    [...]    

}

次のエラーメッセージが表示されます。

クラスと同じ名前のメソッドは、PHPの将来のバージョンではコンストラクターではなくなります。参加者には非推奨のコンストラクターがあります(表示:...)

ですから、今日まで知らなかったのは、PHP4のメソッドでは同じ名前のメソッドがクラスのコンストラクターだったということです。うーん。私は本当に悪いプログラマーです...しかし、この場合、PHP7で何が起こっているかを理解することで、この関数をEloquent関係のみを定義するため、コンストラクターとして使用したくなかったので私の失敗を修正します。

しかし、どうすればこのメッセージを取り除くことができますか?これを理解すると、PHP4ではコードにバグがありましたが、PHP7ではそうではありませんでした。必要でない場合、この関数はいくつかの場所で使用されるため、リファクタリングしたくありません。

誰が私が間違っているのか、なぜそれが古いPHPバージョンで機能したのかを説明できますか?

ありがとう!

26
Thomas M.

これを理解すると、PHP4ではコードにバグがありましたが、PHP7ではそうではありませんでした。

そうでもない。 PHP4スタイルのコンストラクターはまだPHP7で動作します、これらは非推奨になり、非推奨の警告をトリガーします。

できることは、空のメソッドであっても__constructメソッドを定義することです。これにより、php4-constructorメソッドは、クラスの新しく作成されたインスタンスで呼び出されなくなります。

class foo
{
    public function __construct()
    {
        // Constructor's functionality here, if you have any.
    }

    public function foo()
    {
        // PHP4-style constructor.
        // This will NOT be invoked, unless a sub-class that extends `foo` calls it.
        // In that case, call the new-style constructor to keep compatibility.
        self::__construct();
    }
}

new foo();

コンストラクターが戻り値を取得しないという理由だけで、古いPHPバージョンで機能しました。参加者インスタンスを作成するたびに、participantメソッドを暗黙的に呼び出します。それだけです。

46
Federkun

PHP 4スタイルのコンストラクター(定義されているクラスと同じ名前のメソッド)は非推奨であり、将来削除されます。 PHP 4コンストラクターがクラス内で定義されている唯一のコンストラクターである場合、PHP 7はE_DEPRECATEDを発行します。 __construct()メソッドを実装するクラスは影響を受けません。

<?php
    class foo {
        function foo() {
            echo 'I am the constructor';
         }
     }
?>

古いコンストラクタを保持できますが、そのような新しい構成を追加する必要があります。

use Illuminate\Database\Eloquent\SoftDeletingTrait;

class Participant extends \Eloquent
{

    use SoftDeletingTrait;

    [...]

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

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

    [...]    

}
7
DevLoots