PHPのクラスに引数を渡す

PHPを使ってプログラムコーディングをする場合、クラスはとても重要です。
クラスを使用しなくても、プログラミングはできます。
ですが、プログラムが大きくなるほど「名称重複」のリスクが大きくなります。

関数名は重複するとエラーになりますが、グローバル変数は重複してもエラーになりません。
同じグローバル変数を使用すると、バグの元になります。

そういったこともあり、初期値などのグローバル変数をクラス内に記載しておけば、他のクラスの変数と名称が重複しても被ることがなくなります。

ということで、私は初期値が必要な部分はクラスで作成しています。
ですが、ふとこんなことを思いました。

初期値を引数で渡せないものか?

引数で渡すならば、クラス内の関数に渡すこともできます。
実際それでも事足ります。

ですが今回、引数が異常に多くなり思いのほか面倒に感じました。
そこで、クラスコール時に「1回しか渡す必要のないもの」「毎回値が変わるもの」で切り分け、1回しか渡す必要のないものはクラス宣言時に初期値として渡せないか?と考えました。

そもそもクラス宣言時に引数を渡すことができるのか?

クラス宣言は以下のように行います。

$dample = new sample();

これに引数が渡せるのか調べてみたところ、できることがわかりました。
以下のように記述します。

$sample = new sample(引数);

長いことプログラミングをしてきましたが、新しい発見でした。
これはPHP5のころからできた機能ということなので、非常に驚きです。

では引数の受け取りはどうするのか?

関数の場合は、以下のように受け取ります。

function sample($value=初期値)
{
    echo $value;
}

引数はどの言語でも、関数というフォーマットがあって使用することができます。
クラスは関数ではないため、関数のように引数を受け取ることはできません。

いったいどうやって受け取れるのだろう?
と思っていたら、以下の関数で引数を受け取れるということでした。

それが __construct です。

__constructは、クラス宣言時に自動で呼び出される関数です。
クラスに引数を渡すと、__onstruct関数に引き渡される仕組みでした。

なるほど、これならば関数に引数を渡していることになります。
ちなみに記述方法は以下の通りです。

$sample = new sample("hello world");

class sample
{
public __construct($value)
{
    echo $value;
}

}

このやり方ならば、クラス宣言時に特定の初期値を渡すことができます。

ここで疑問がわきました。

同クラス内の関数では、参照できないのではないか?

引数は同一関数内でしか参照できません。
クラスの初期値目的として__constructに渡しているのに、同一クラス内の他の関数参照できなければ意味がありません。

どうすればよいか調べてみたところ、思いのほか力業で解決できました。

クラス内のグローバル変数に代入すればよい

以下のソースを見ていただければ一目瞭然です。

<?php

$sample = new sample(20);
$sample->display();

class sample
{

private $ini_data;

public function __construct($ini_data=10)
{
    $this->ini_data = $ini_data;
}

function display()
{
    echo $this->ini_data;
}

}
?>

__constructで受けとった引数を、クラス内のグローバル変数$ini_dataへ代入しています。
コロンブスの卵的な発想ですが、これで、他の関数からも引数で渡された値を参照できます。

ではどんな時にクラスに引数を渡せばよいのか?

クラスに引数が渡せることがわかりました。
ではどんな時に、クラスに引数を渡せばよいのでしょうか?

これは作り手の考え一つですが、私は以下の場合にクラスに引数渡しをしています。

  • RSS取得のキャッシュ時間指定
  • 1ページに表示するデータ件数指定
  • NEWマークを付ける日数

いずれも、もともとはグローバル変数で初期値設定していたものです。
こういったものを、クラス引数として渡せば使い勝手がよかったです。

今回は、自分でも目からウロコな出来事でした。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております