オブジェクト指向処理の要約

このQ&Aのポイント
  • PHPのオブジェクト指向の処理に関して
  • 特定の順番で表示される理由について
  • $tv->setChannel(20)の次に$tv->setChannel(10)の処理をするため、順番が異なる
回答を見る
  • ベストアンサー

PHPのオブジェクト指向の処理に関して

http://www.phpbook.jp/tutorial/member/index4.htmlに下記のオブジェクト指向を含んだスクリプトがありました。 <html> <head><title>PHP TEST</title></head> <body> <?php $tv = new Television(); $tv->setChannel(20); print('現在のチャンネルは'.$tv->getChannel().'<br>'); $tv->setChannel(10); print('現在のチャンネルは'.$tv->getChannel().'<br>'); class Television{ private $channelNo = 8; function setChannel($channel){ if (($channel >= 1) and ($channel <= 12)){ $this->channelNo = $channel; }else{ print('チャンネルは1から12の間で設定して下さい<br>'); } } function getChannel(){ return $this->channelNo; } } ?> </body> </html> これをブラウザ経由でみますと、 「チャンネルは1から12の間で設定して下さい 現在のチャンネルは8 現在のチャンネルは10」 と表示されます。 なぜ、この順番で表示されるのでしょうか? 個人的には、$tv->setChannel(20)の次に$tv->setChannel(10)の処理をしますので、 「チャンネルは1から12の間で設定して下さい 現在のチャンネルは10 現在のチャンネルは8」 の順番ではないかと思っております。 もしよろしければ、教えてください。お願いします。

  • PHP
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
noname#212058
noname#212058
回答No.2

class の中のメンバ変数の宣言コード ( private $channelNo = 8; ) は、その class が new されたとき ( $tv = new Television(); ) に 実行されます。 従って、実際の実行順序は  1. $tv = new Television();   → このときに private $channelNo = 8; が実行される  2. $tv->setChannel(20);   → このときに function setChannel メソッド内が実行される   → "チャンネルは1から12の間で設定して下さい" を表示  3. print('現在のチャンネルは'.$tv->getChannel().'<br>');   → このときに function getChannel メソッド内が実行される     (結果は、1.で設定した 8 が返る)   → "現在のチャンネルは8" を表示  (以下略) ですね。

sryou1985kun
質問者

補足

値をそれぞれ 「$tv->setChannel(4); $tv->setChannel(20);」 に変更すると ブラウザ上では、 「現在のチャンネルは4 チャンネルは1から12の間で設定して下さい 現在のチャンネルは4」 と表示され、「8」が表示されません。 これは、1度目の処理で、 private $channelNo = 8; の8が4に変更されたからなのでしょうか? 続けてのご質問してしまい申し訳ございません。

その他の回答 (1)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

> $tv->setChannel(20); としても > if (($channel >= 1) and ($channel <= 12)){ > $this->channelNo = $channel; のところではじかれるからです。

関連するQ&A

  • PHPのオブジェクト指向の処理に関して

    http://www.phpbook.jp/tutorial/member/index4.htmlに下記のオブジェクト指向を含んだスクリプトがありました。 <html> <head><title>PHP TEST</title></head> <body> <?php $tv = new Television(); $tv->setChannel(4); print('現在のチャンネルは'.$tv->getChannel().'<br>'); $tv->setChannel(20); print('現在のチャンネルは'.$tv->getChannel().'<br>'); class Television{ private $channelNo = 8; function setChannel($channel){ if (($channel >= 1) and ($channel <= 12)){ $this->channelNo = $channel; }else{ print('チャンネルは1から12の間で設定して下さい<br>'); } } function getChannel(){ return $this->channelNo; } } ?> </body> </html> これをブラウザ経由でみますと、 「現在のチャンネルは4 チャンネルは1から12の間で設定して下さい 現在のチャンネルは4」 と表示されます。 3行目に8ではなく4が表示されるのは、一度目の処理でprivate $channelNo = 8;が4に上書きされたのが原因なのでしょうか? もしよろしければ、教えてください。お願いします。

    • ベストアンサー
    • PHP
  • PHPでクラス内のpublicでエラーになる原因

    Apache/1.3.27を使っています。 下記コードをローカルで表示すると Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in c:\phpdev\www\ajax\sql.php on line 11 というエラーが出てしまいます。 なぜエラーになるのか原因が分かりません。 アドバイスを頂けないでしょうか。 <html> <head><title>PHP TEST</title></head> <body> <?php $tv = new Television(); $tv->$channelNo = 8; $tv->dispChannel(); class Television{ public $channelNo; function dispChannel(){ print('現在のチャンネルは'.$this->channelNo); } } ?> </body> </html>

    • ベストアンサー
    • PHP
  • オブジェクト指向の上手い使い方を教えてください

    以下のような、クラスにまとめた処理を一度実行してるファイルがあります。 <?php class Hoge {  public function __construct() {   // 設定値   $this->a = 1;   $this->b = 2;   $this->c = 3;  }  public function main() {   // 設定値を使った処理   print $this->a + $this->b + $this->c;   } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); ?> 設定値を変更して2回処理を行いたい場合、 一番スマートな形はどれになるか教えてください。 もしくは、それ以外の方法など。 1.設定値を引数で制御し、インスタンスを2回生成する (※設定値自体を引数に渡すことは考えてないです) <?php class Hoge {  public function __construct($flg) {   // 設定値   if ( $flg ) {    $this->a = 1;    $this->b = 2;    $this->c = 3;   } else {    $this->a = 4;    $this->b = 5;    $this->c = 6;   } }  public function main() {   // 設定値を使った処理   print $this->a + $this->b + $this->c;  } } // インスタンス生成・実行 $hoge = new Hoge(true); $hoge->main(); // インスタンス生成・実行 $hoge = new Hoge(false); $hoge->main(); ?> 2.インスタンスの生成・実行は1度のままにし、クラスの処理を変更する <?php class Hoge {  public function __construct() {   // 設定値   $this->a = 1;   $this->b = 2;   $this->c = 3;   $this->a2 = 4;   $this->b2 = 5;   $this->c2 = 6;  }  public function main() {   // 設定値を使った処理   print $this->a + $this->b + $this->c;   // 設定値の変更   $this->a = $this->a2;   $this->b = $this->b2;   $this->c = $this->c2;   // 設定値を使った処理2回目   print $this->a + $this->b + $this->c;   } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); ?> 3.設定値を変更するメソッドを作り、呼び出す <?php class Hoge {  public function __construct() {   // 設定値   $this->a = 1;   $this->b = 2;   $this->c = 3;  }  public function change() {   // 設定値変更   $this->a = 4;   $this->b = 5;   $this->c = 6;  }  public function main() {   // 設定値を使った処理   print $this->a + $this->b + $this->c;   } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); $hoge->change(); $hoge->main(); ?> 4.子クラスを作り、2回インスタンス生成・実行を行う <?php class Hoge {  public function __construct() {   // 設定値   $this->a = 1;   $this->b = 2;   $this->c = 3;  }  public function main() {   // 設定値を使った処理   print $this->a + $this->b + $this->c;   } } class Hoge2 extends Hoge{  public function __construct() {   parent::__construct();   // 設定値   $this->a = 4;   $this->b = 5;   $this->c = 6;  } } // インスタンス生成・実行 $hoge = new Hoge(); $hoge->main(); // インスタンス生成・実行 $hoge = new Hoge2(); $hoge->main(); ?> 5.設定値だけ異なるファイルを作りそれぞれ実行する ※省略 よろしくお願いします。m(__)m

    • 締切済み
    • PHP
  • PHPについて教えてください

    以下のコードでthanks.phpにemailとgoikenが表示されません なぜでしょうか? おそらくthanks.phpが間違えてると思いますが見直してもわかりません index.html <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <form method="POST" action="check.php"> ニックネームを入力してください<br> <input name="nickname" type="text" style="width:100px"><br> メールアドレスを入力してください<br> <input name="email" type="text" style="width:200px"><br> ご意見を一言でお聞かせください<br> <input name="goiken" type="text" style="width:300px"><br> <input type="submit" value="送信"> </form> </body> </html> check.php <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <?php $nickname=$_POST['nickname']; $email=$_POST['email']; $goiken=$_POST['goiken']; if ($nickname==''){ print'ニックネームが入力されていません<br>'; } else { print'ようこそ'; print $nickname; print' 様'; print'<br>'; } if ($email==''){ print'メールアドレスが入力されていません<br>'; } else { print'メールアドレス:'; print $email; print'<br>'; } if ($goiken==''){ print'ご意見が入力されていません<br>'; } else { print'ご意見『'; print $goiken; print'』<br>'; } if($nickname=='' || $email='' || $goiken=''){ print'<form>'; print'<input type="button" onclick="history.back()" value="戻る">'; print'</form>'; } else { print'<form method="post" action="thanks.php">'; print'<input name="nickname" type="hidden" value="'.$nickname.'">'; print'<input name="email" type="hidden" value="'.$email.'">'; print'<input name="goiken" type="hidden" value="'.$goiken.'">'; print'<input type="button" onclick="history.back()" value="戻る">'; print'<input type="submit" value="OK">'; print'</form>'; } ?> </body> </html> thanks.php <DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>PHP基礎</title> </head> <body> <?php $nickname=$_POST['nickname']; $email=$_POST['email']; $goiken=$_POST['goiken']; print $nickname; print'様<br>'; print'ご意見ありがとうございました<br>'; print'頂いたご意見『'; print $goiken; print '』<br>'; print $email; print'宛にメールを送信しました'; ?> </body> </html>

    • ベストアンサー
    • PHP
  • <HEAD>に書かれたグローバルインスタンスのオブジェクト階層について

    BODYに貼られたIMGタグのイベント関数func_a内で thisを使って、<HEAD>に書かれたxclassのpic1にアクセスしたいのですが、 xclass.pic1とせず、thisを使ってアクセスする方法はありますか? <BODY>内の<IMG>タグは、オブジェクト階層でいうと windows.document.のことでしょうか? それならば、 this.parent.xxxxxxxxx.pic1でアクセスできますか? xxxxがわかりません。 <HEAD>の位置に書いたグローバルインスタンスは document.階層のどの位置にあるのでしょうか? 何か設定でも必要でしょうか? <HEAD> <SCRIPT> ... var XClass = function(){ this.namae = "pic1"; } var xclass = new XClass(); function func_a() { this<--- ここでのthisはImageオブジェクト? xclass.pic1にアクセスしたのですが、thisを使ってアクセスしたい。 } ... </SCRIPT> </HEAD> <BODY> <IMG id="gazou1" onMouseDown="func_a()"> </BODY>

  • php クラス

    phpエクラスの勉強をしているのですが、参考書に書いているメンバ変数に値を代入している意味がよくわからないので教えてください。メンバ変数の値を書かなくtも動作できるのになぜ必要なのでしょうか? 参考書 <html> <head> <title>サンプル</title> </head> <body> <?php $pr = new Person; $pr->name = "鈴木"; $pr->age = 56; ?> <table border="2"> <tr bgcolor="#AAAAAA"> <th>名前</th> <th>年齢</th> </tr> <?php print "<tr><td>"; print $pr->getname(); print "</td><td>"; print $pr->getage(); print "</td></tr>"; ?> </table> <?php class Person { public $name ="姓名"; public $age = 20; function getname(){return $this->name;} function getage(){return $this->age;} } ?> </body> </html> テスト <?php class Person { public $name ;←ここに値を格納する意味 public $age ;←ここに値を格納する意味 function getname(){return $this->name;} function getage(){return $this->age;} } ?>

    • ベストアンサー
    • PHP
  • PHPの問題

    下のプログラムご覧ください。 <HTML> <HEAD> <TITLE> 門題2</TITLE> </HEAD> <BODY> <?php $val1 = 90; $val2 = 30; $answer = 90 * 30; $answer1 = 90 / 30; $answer2 = 90 % 30; print "変数X1の初期値は$X1です。<BR>"; print "変数Y2の初期値は$Y2です。<BR>"; print "XとYの積は answerです。<BR>"; print "XとYの商は answer1です。<BR>"; print "XとYで割った剰除は answer2です。<BR>"; ?> </BODY> </HTML> 実行してみたもののエラーになりX1,Y2の所が出ていなくて 答えも出ませんなぜでしょうか? ご存知の方どうかお教えください。

    • ベストアンサー
    • PHP
  • なぜエラーが出るのか分からない(PHP)

    ●質問の主旨 check.phpファイルの最終行(</html>のところ)で Parse error: syntax error, unexpected end of file としてエラーが表示されます。 なぜエラー表示されるのでしょうか?ご存知の方ご教示願います。 (eclipseでもエラー表示されているのは分かりますが、 何がエラーなのか分かりません) ●状況 1.index.htmlのフォームに入力し、送信ボタンを押す (添付画像) 2.check.phpに飛ばす 3.飛ばすとエラーが表示される ●環境 windows8 xammp1.8.1 ●コード (index.html) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <form method="post" action="check.php"> ニックネームを入力してください<br/> <input name="nickname" type="text" style="width:100px"><br/> メールアドレスを入力してください<br/> <input name="email" type="text" style="width:200px"><br/> ご意見を入力してください<br/> <input name="goiken" type="text" style="width:300px"><br/> <br/> <input type="submit" value="送信"> </form> </body> </html> (check.php) <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHPの基礎</title> </head> <body> <?php $nickname = $_POST['nickname']; $email = $_POST['email']; $goiken = $_POST['goiken']; if($nickname =='') { print'ニックネームが入力されてません'; } else { print'ようこそ!'; print $nickname; print'様'; print'<br/>'; } if($email =='') { print'emailが入力されてません'; } else { print'ようこそ!'; print $email; print'<br/>'; if($goiken =='') { print'ご意見が入力されてません'; } else { print'ご意見'; print $goiken; print'』<br/>'; } ?> </body> </html>

    • ベストアンサー
    • PHP
  • 参考サイトのサンプルコードを試すとエラーになる原因

    2K-NT-XP-phpdev_start.batを開いたときに出てくるコマンドプロンプトは開いたままで、 Apache/1.3.27 (Win32) PHP/4.2.3 running... と表示されています。 http://www.phpbook.jp/tutorial/member/index1.html のサイトのコードを開いて見ると、 Parse error: parse error, expecting `'{'' in c:\phpdev\www\ajax\goo.php on line 14 というエラーメッセージが表示されてしまいます。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>サンプル</title> </head> <body> <?php $tv = new Television(); $tv->channelNo = 8; $tv->dispChannel(); class Television(){ public $channelNo; function dispChannel(){ print('現在のチャンネルは'.$this->channelNo); } } ?> </p> </body> </html> なぜエラーメッセージが出てしまうのでしょうか。 ちなみに、 <?php echo 'テスト'; ?> と書き変えるとちゃんと表示されます。

    • ベストアンサー
    • PHP
  • phpのプログラム

    php初心者です。 以下がうまく実行できません。 どなたかご教授お願いします。 <html> <body> <?php $pr1 = new Person; $pr2 = new Person; ?> <table border = "2"> <tr bgcolor = aqua> <th>名前</th> <th>年齢</th> </tr> <?php $pr1->setname("佐藤"); $pr1->setage(34); $pr2->setname("田中"); $pr2->setage(45); print"<tr><td>"; print $pr1->getname(); print "</td><td>"; print $pr1->getage(); print"</td></tr>" print"<tr><td>"; print $pr2->getname(); print "</td><td>"; print $pr2->getage(); print"</td></tr>" ?> </table> <?php class Person{ private $name = "姓名"; private $age = 20; public function setname($nm) { $this->name = $nm; } public function setage($ag) { $this->age = $ag; } public function getname(){return $this->name;} public function getage(){return $this->age;} } ?> </body> </html> よろしくお願いします。

    • 締切済み
    • PHP