初めて知ったー
こんにちは!
中の人です。
こちらの記事書いてるとき、コード動かしてたら
クラスを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系を使うのが当たり前になると思いますので、あまり気にしなくていいですね
ただ、過去のプロジェクトの機能追加等の場合は、頭の片隅に置いておいた方が、バグの抑止になるかもです!
ということで
お疲れ様でした。