QA@IT

【PHP】複数のクラスの宣言を配列でできるか

3457 PV

PHPを独学で学んでる初心者です。

いま、クラスの利用をやっています。
ウィンドウを表示するクラスの宣言の仕方が

$window= new Window() でいいとします。()の中に何か入るかとか、ウィンドウを表示するクラス名がwindowかは知りません

で、windowを複数宣言したい際はどういう方法がメインであるか、またその方法の一つとして配列を使えるのかというのが今回の質問です。

ウィンドウを複数利用したい場合はどういう風に書くのか、
また
配列として

$window[main] = new Window(); 
$window[AdressData] = new Window(); 
$window[decisionData] = new Window(); 

こういう風にできるか

あと、このnew Window()って書く回数を一つにおさえる方法はないか

これらを知りたいです。
よろしくお願いします

回答

配列でできるか

可能です。以下の様なコードは書けます。
ただし添字は値でないとだめなので、単にmainではなく変数$mainや文字列"main"である必要があります。

<?php

class Window{

    private $name = "";
    public function set_name($value){
        $this->name = $value;
    }

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

$window["main"] = new Window();
$window["AddressData"] = new Window();

$window["main"]->set_name("I'm main");
$window["AddressData"]->set_name("I'm address data");

$window["main"]->show_name();
$window["AddressData"]->show_name();

配列の機能(ループで使いやすいなど)を使いたい場合にはこういった配列の様なコレクションとして扱えるものに入れておくことはありますが、そうでなければそれほどメリットはありません。
$main_window$addressdata_windowでもそれほど変わりませんよね。全てのウィンドウに一括して支持を出したい場合がないならばコレクションにする利点はそれほどないかもしれません。

ですが、Windowではなくて、住所や電話番号を保存しておくAddressDataクラスだったら複数件ループで処理したりすることはありそうですから、コレクションにするメリットも生まれてきます。

このnew Window()って書く回数を一つにおさえる方法はないか。

functionを用意すれば短くすることはできますが、別のオブジェクト(インスタンス)を作るためにnewするので、new自体は必要なだけ実行されなければいけません。

function nw(){
    return new Window();
}
$window["x"] = nw();

ただし、書く量よりも後でコードを見た時に何をしてるのかわかることを大事にしてください。
= new Window() ならインスタンス生成だとわかりますが、= nw() だと数年後、これがなんだかわからないかもしれません。
functionにするのがいけないのではなくて、わかりやすい名前であればfunctionでも問題ありません。
生成が複雑な場合にはfunctionにすることもあります。

編集 履歴 (0)
  • 回答ありがとうございました。
    コードを作る上で大事なのはわかりやすさというのは
    非常に参考になりました

    勉強していくうえで今後意識していきたいと思います。
    ありがとうございました
    -
ウォッチ

この質問への回答やコメントをメールでお知らせします。