1. TOPTOP
  2. Webサービス
  3. PHP

PHPでオブジェクト指向プログラミング…でも上手くいかなった件

|

PHP

PHPでオブジェクト指向プログラミングを!と思い立ち、上手くいかなかった件を1つ。

問題の内容

下記のindex1.phpのコードをオブジェクト指向プログラミングであるindex2.phpに書き換えるつもりです。最終的には画面に

  • サイコロ1の目
  • サイコロ2の目
  • true or false

を表示させるのが目的です。

しかし書き換えて実行すると“Notice: Undefined variable:”が表示され「変数が見つからないよ!」と叱られます(画像)

自分で何度も見直した限り、変数はセットされているように見えて、なぜこのエラーが出るのかよく分からない。

construct_error

問題の補足

  • Notice: Undefined variable: dice1 in /var/www/html/dice/index.php on line 30
  • Notice: Undefined variable: dice1 in /var/www/html/dice/index.php on line 9

上記は3つあるメンバー変数のうち1つの変数(dice1)についてのエラーを転記したものです。

そもそもline 9はコンストラクタで使用している変数なので、ここでの初期化の処理が上手くいっていないと思われますが、なぜこのコードで上手くいかないのかが分かりません。

なお、__construct()に$dice1, $dice2, $zoromeの引数を入れると、Warning: Missing argumentと「引数数違い」を指摘されます。

かえってエラーが増えるため、index2.phpでは引数を空にしています。(この点もなぜエラーが指摘されるのか?イマイチ分からない
コードは以下の通りです。

// index1.php
<?php

$dice1 = mt_rand(1, 6);
$dice2 = mt_rand(1, 6);

$zorome = ($dice1 == $dice2) ? true : false;

?>
//index2.php
<?php
class Dice {

	public $dice1;
	public $dice2;
	public $zorome;

	public function __construct() {
		$this->dice1 = $dice1;
		$this->dice2 = $dice2;
		$this->zorome = $zorome;
	}

	// サイコロ1の目を取得
	public function getShake1() {
		$this->dice1 = mt_rand(1, 6);
	}

	// サイコロ2の目を取得
	public function getShake2() {
		$this->dice2 = mt_rand(1, 6);
	}

	// サイコロ1とサイコロ2のゾロ目を判定
	public function getZorome() {
		$this->zorome = ($dice1 == $dice2) ? true : false;
	}
}

$saikoro1 = new Dice($dice1);
$saikoro2 = new Dice($dice2);
$judge = new Dice($zorome);

echo $saikoro1->getShake1();
echo $saikoro2->getShake2();
echo $judge->getZorome();

?>

問題の解決方法

問題の解決方法といってもindex1.phpの上手い書き換えコードが見つかったわけではありません(2014年3月15日現在)。

いろいろな方にアドバイスしてもらったところ、そもそもオブジェクト指向以前にクラスについてよく理解していないということがよく分かりました。

PHPのオブジェクト指向プログラミングの勉強として下記のサイトを参考にしたいと思います。

〔参考サイト〕