#経緯
オブジェクト指向を再入門中に以下のコードを書いていたところ
予想していた結果と違っていた。
自分的に忘れそうなのでメモします。
class TestObject {
public $subject;
private $message = "オブジェクト";
public function testobject() {
echo $this->message;
}
}
$instans = new TestObject();
$instans->testobject();
オブジェクトオブジェクト
オブジェクト
#原因
色々とテストし、調査してみて結論としてはクラス名と関数名が
かぶっているときに発動する挙動でした。
こちらの記事が参考になりました。
どうやらphp4のころはコンストラクタを指定するときに
クラス名と同じ名前の関数を定義していたらしい。
だからコンストラクタとして認識され2回出力されていたんですね。
そういえばphpstormからConvert constructor new styleなんてメッセージがでていて
最初「関数を一つしか定義しないとコンストラクタとして認識されるのか?」と思いました。
しかし、いろいろテストしているとどうもそうでもないらしい。
そこで以下のようにしてみると
class TestObject {
public $subject;
private $message = "オブジェクト";
public function testobject() {
echo $this->message;
}
}
$instans = new TestObject();
//$instans->testobject();
オブジェクト
やはりコンストラクタとして認識されるっぽい。
しかし上記のソースを以下のように変えると
class Test_object {
public $subject = "サブジェクト";
private $message = "オブジェクト";
public function test_object() {
echo $this->message;
}
public function test_subject() {
echo $this->subject;
}
}
$instans = new Test_object();
$instans->test_object();
$instans->test_subject();
オブジェクトオブジェクトオブジェクト
2つあっても発動している。
「関数を一つしか定義しないとコンストラクタとして認識されるのか?」説は間違いと判明。
ここでもしやと思い「PHP クラス名 関数名 同じ」で検索して
こちらの記事にたどり着きました。
class Test_Object {
public $subject = "サブジェクト";
private $message = "メッセージ";
public function testmessage() {
echo $this->message;
}
}
$instans = new Test_Object();
$instans->testmessage();
メッセージ
やはり名前がかぶったことが原因のよう。。。
確認のため
class Test_Object {
public $subject = "サブジェクト";
private $message = "メッセージ";
public function test_object() {
echo $this->message;
}
}
$instans = new Test_Object();
$instans->test_object();
メッセージメッセージ
#結論
phpでクラスと関数の名前がかぶった時にコンストラクタとして認識される。
参考記事
また改めて検索してみて以下の記事も参考にさせていただきましたので張り付けておきます。
関数名とクラス名が被っても大丈夫
__construct()があると、クラス名と同じメソッドはコンストラクタとはならないみたい
ちなみにphpのバージョンは5.6、7.0共に同じ挙動でした。