BeginnerEngineerBlog
中の人
中の人

【php7系 new】newしたら関数が発動したぞ

公開: 2023-10-09 14:54
更新: 2023-10-12 00:17
79
php7系 __construct
クラスをnewしたらクラス内で定義した関数が発動したので調べてみました

初めて知ったー

こんにちは!

中の人です。


こちらの記事書いてるとき、コード動かしてたら

クラスをnewしてオブジェクト作った段階で、クラスで定義した関数が動くという挙動を確認しました。
なんじゃこれと感じたのですが、調べてみたらへーと感じたので紹介します。

どういうことか


今のphpのversionは、7.3.29です


で以下のようなコードを動かしてみます。

<?php

class Hoge
{
    public $hello = 'hello!';

    protected $hey = 'hey!';

    private $osu = 'osu!';

    public const OSUOSU = 'osuosu!';

    protected const SUSHI = 'sushi!';

    private const TUNA = 'tuna!';

    public function piyo()
    {
        echo self::OSUOSU . "\n";
    }

    public function hoge()
    {
        echo $this->osu . "\n";
    }
}

$hoge = new Hoge();

これの実行結果は


こうなります。

hoge()関数を呼び出していないのに、発動されました。


クラス名と同じ関数名は__constructになるらしい



そうなん!?
知らんかったー

ということは以下のコードだと

<?php

class Piyo// 👈 クラス名を書き換え
{
    public $hello = 'hello!';

    protected $hey = 'hey!';

    private $osu = 'osu!';

    public const OSUOSU = 'osuosu!';

    protected const SUSHI = 'sushi!';

    private const TUNA = 'tuna!';

    public function piyo()
    {
        echo self::OSUOSU . "\n";
    }

    public function hoge()
    {
        echo $this->osu . "\n";
    }
}

$hoge = new Piyo();// 👈 同じようにnewする

この実行結果は


ほんまやpiyo()が発動してる!

なんじゃこれ

__constructを定義してみる


<?php

class Piyo
{
    public $hello = 'hello!';

    protected $hey = 'hey!';

    private $osu = 'osu!';

    public const OSUOSU = 'osuosu!';

    protected const SUSHI = 'sushi!';

    private const TUNA = 'tuna!';

    public function __construct()// 👈 こいつを追加
    {
        
    }

    public function piyo()
    {
        echo self::OSUOSU . "\n";
    }


    public function hoge()
    {
        echo $this->osu . "\n";
    }
}


$hoge = new Piyo();

この結果は


__constractがある場合は、クラス名と同じ関数名があっても、発動しないみたいです。


php8系では削除されたみたいです



ご存知のとおり、PHP 4 では、コンストラクターはクラスと同じ名前で宣言されました。PHP 5 ではまだ動作していましたが、PHP 7.0 では非推奨となりPHP 8.0 では削除されました。このため、バージョン 8 以降に移行する前にコンストラクターの名前を変更する必要があります。

存じ上げませんでした🙇‍♂️

こちらの記事を見ると、この動きはphp7系まで(非推奨だけど)この挙動で、php8では削除されたみたいです。

ということでphp8系にしてテストしてみます。


今phpのversionは8.2.11です

<?php

class Piyo
{
    public $hello = 'hello!';

    protected $hey = 'hey!';

    private $osu = 'osu!';

    public const OSUOSU = 'osuosu!';

    protected const SUSHI = 'sushi!';

    private const TUNA = 'tuna!';

    public function piyo()
    {
        echo self::OSUOSU . "\n";
    }

    public function hoge()
    {
        echo $this->osu . "\n";
    }
}

$hoge = new Piyo();

この実行結果は


本当だ発動しない

まぁこっちの方がいいよね

終わりに


今までいろいろとクラスを作ってきましたが、前述したように


こちらの記事を書いてる最中に初めて気づきました。ドキュメントちゃんと読んでないし(゚∀゚ ) < オイ

多分適当なクラス名、適当な関数名など、もうなんでもいいやって感じでコード書いてたので、この挙動に気づけたのかなと感じます。
普段はクラス名や関数名、変数名など意外と頭を悩ませるから被らなかったのだと思います。または、ほとんど__constract関数定義してますし。

まー言うてもこれから新規プロジェクトを立ち上げるときは、phpだったらphp8系を使うのが当たり前になると思いますので、あまり気にしなくていいですね

ただ、過去のプロジェクトの機能追加等の場合は、頭の片隅に置いておいた方が、バグの抑止になるかもです!

ということで

お疲れ様でした。
0
0
0
0
通信エラーが発生しました。