参照渡しを使う理由がわかりません

このQ&Aのポイント
  • PEARの 'HTML/QuickForm.php'を利用してフォームを作成しようとしていますが、ラジオボタンの部分で参照渡しが使用されています。他の要素では代入が使用されているのに、なぜラジオボタンだけ参照渡しが使用されるのか疑問です。
  • 参照渡しを使用するメリットや理由について教えていただけると助かります。
  • また、PEARの 'HTML/QuickForm.php'を利用する際のハッシュタグにもご教授いただきたいです。
回答を見る
  • ベストアンサー

参照渡しを使う理由がわかりません

PEARの 'HTML/QuickForm.php' を利用し、フォームを作成しようと思いました。 以下ソースを入力していたところ、ラジオボタンのところで参照渡しが出てきました。 【$obj =& $form->addElement("radio", "age", "年代:", "10代", "10", array("checked"));】 ラジオボタン以前のテキストボックス等は = だったのですが、なぜ、 ラジオボタンだけ参照渡しをするのでしょうか? 何かメリットがあるから参照渡しをしているのだと思うのですが…。 ご教授よろしくお願いします ====ソースここから <?php // 必要パッケージの読込み require('HTML/QuickForm.php'); // ●Form要素の構築 $form = new HTML_Quickform("test","POST"); // formの設定 $form->setRequiredNote("<span style=color:red>*</span> 記入必須項目"); // 記入必須項目の説明用文字列設定 $form->setJsWarnings("エラー",""); // Javascriptエラーの際の文字列設定 // header 要素を追加 $form->addElement("header", "title", "情報を記入"); // hidden 要素を追加 $form->addElement("hidden", "id", uniqid("")); // text 要素を追加 $form->addElement("text", "name", "名前:", array("value"=>"","size"=>"24")); // radio 要素を追加 $obj =& $form->addElement("radio", "age", "年代:", "10代", "10", array("checked")); // デフォルトでチェックの設定にする $obj->setChecked(TRUE); $form->addElement("radio", "age", "", "20代", "20"); $form->addElement("radio", "age", "", "30代", "30"); $form->addElement("radio", "age", "", "40代", "40"); : : =========ソースここまで

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • 1minn
  • ベストアンサー率57% (52/90)
回答No.1

そのクラスの中を見てないので恐らくですが・・・ 疑問とされている直後に $obj->setChecked(TRUE); って処理があるからなんでしょうねきっと。 参照を使わないなら、 $form->addElement("radio", "age", "年代:", "10代", "10", array("checked"))->setChecked(TRUE); こんなんで動きませんか? そんな意味合いだと想像してみました。

kureakai
質問者

お礼

情報ありがとうございます。 早速試したところ教えて頂いた内容でも動きました。 addElementでラジオボタンのオブジェクトが返ってきてる? そのオブジェクトのsetChekedメソッドを利用してる感じかなぁ位は なんとなく感じることができました。 ただ、最初のソースの参照渡しの&をぬいて実行すると 【$obj = $form->addElement("radio", "age", "年代:", "10代", "10", array("checked")); $obj->setChecked(TRUE);】 ・結果 年代: 10代 年代: 10代 二行でてきます。 多分この現象を防ぐために参照渡しなのだと思うのですが… もう少し考えてみたいと思います。

関連するQ&A

  • コンストラクタで参照渡しをする理由

    すでに質問済みの内容でしたら申し訳ありません。 php4を使用していまして、 HTML_QuickFormとSmartyを最近使い始めました。 ネットや書籍のサンプルコードを見ながら使用しているのですが、 $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty); 上記のような場合や フォームのコンストラクタ呼び出しの場合に =&を使用している意味が理解できません。 ・=&はオブジェクトの参照渡しという認識で合っていますでしょうか? ・参照渡しであった場合、実態を渡すのでなく参照で渡すべき理由とは何でしょうか? ご教授願えれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • HTML_QuickFormのAdvCheckBox にデフォルトでチェックを入れるには

    HTML_QuickFormのAdvCheckBoxにデフォルトでチェックを入れたいのですが、 $form->addElement('advcheckbox', 'c1', '', 'Check1', NULL, array("f", "t")); $form->addElement('advcheckbox', 'c2', '', 'Check2', NULL, array("f", "t")); $form->addElement('advcheckbox', 'c3', '', 'Check3', NULL, array("f", "t")); $form->setDefaults(array('c2'=>'checked')); 上記のようにやってみたのですが Check2 にチェックを入れることは出来ませんでした。通常のcheckboxでは下記のようにやってチェックを入れることができました。 $form->addElement('checkbox', 'c1', '', 'Check1'); $form->addElement('checkbox', 'c2', '', 'Check2'); $form->addElement('checkbox', 'c3', '', 'Check3'); $form->setDefaults(array('c2'=>'checked')); AdvCheckboxは方法が違うのでしょうか?

    • ベストアンサー
    • PHP
  • PEAR::HTML_QuickFormのfreezeについて

    PEAR::HTML_QuickFormのfreezeを使って、特定の項目だけフリーズさせたいと考えてます。 全体をフリーズさせるときは、 $this -> freeze(); としてますが、項目のみの場合も出来るような事が書いてありました。 下記のソースの場合は、どのように設定すればよいかおしえてもらえますでしょうか? <?php require_once "HTML/QuickForm.php"; $form = new HTML_QuickForm('frmTest', 'get'); $form->addElement('header', 'MyHeader', 'Testing QuickForm'); $form->addElement('text', 'MyTextBox', 'What is your name?'); $form->addElement('reset', 'btnClear', 'Clear'); $form->addElement('submit', 'btnSubmit', 'Submit'); if ($form->validate()) { # If the form validates then freeze the data $form->freeze(); } $form->display(); ?>

    • ベストアンサー
    • PHP
  • QuickFormのradioボタンでエラーが出る

    require_once("HTML/QuickForm.php"); $form = new HTML_QuickForm(); $ques[] = &HTML_QuickForm::createElement('radio', null, 'Yes', 'Yes', '1');←”ここでエラーがでる” $ques[] = &HTML_QuickForm::createElement('radio', null, 'No', 'No', '2'); $form->addGroup($ques, 'ques'); $form->addRule('ques', '入力してください。', 'required', null, 'client'); if ($form->validate()){ $form->freeze();} $form->addElement('submit','submit', '送信'); require_once("HTML/QuickForm/Renderer/ArraySmarty.php"); $renderer= new HTML_QuickForm_Renderer_ArraySmarty($smarty); $form->accept($renderer); $smarty->assign('form', $renderer->toArray()); $file = 'test.tpl'; $smarty->display($file) ----------------------------------------------------------- HTML_QuickFormでラジオボタンをチェックしたいのですが、「←”ここでエラーがでる”」の部分で、Fatal error: [] operator not supported for strings in /virtual/パス/test.php on line 19←ここの数字はエラー行 のエラーがでます。 どうやったら、エラーを回避できるか分かりません。 よろしくお願いします。

    • 締切済み
    • PHP
  • PHPの参照渡しについて

    以下のようなコードがあったとき $obj = new stdClass(); $foo = $obj; この場合、動作は いわゆる【参照の値渡し】というとらえかたでよいのでしょうか? 変数$obj には、 new stdClass();という記述によって 新規に作成されたオブジェクトの参照(※正確には別のメモリ内に保持されたオブジェクトのアドレス) が保持されるわけですよね? そのとき $foo = $obj; というコードは$objが保持するオブジェクトのアドレス値を$fooという変数にも コピーするという動作を意味するわけですよね。 この場合、両変数を用いて生成されたオブジェクトのプロパティなどの状態を 共有することとができます。 しかしながら変数$fooに別の値、例えば文字列を代入すうると $foo = "文字列"; とすると$fooの値が変更され$objの値は変更されません。 対して、次のようなコードがあった場合 $foo = &$obj; というコード、これはPHPにおける参照渡しですが、 この場合は$objが指し示す、オブジェクトが保持されているメモリ上のアドレスではなく そのメモリ上に確保された変数$objそのもののアドレスが$fooという変数にコピー? されるのでしょうか? この明示的な参照渡しだと、オブジェクトの状態を共有するのはもちろん $foo = "オブジェクト破棄"; と片方に文字列を代入すると print $obj; 同様に文字列にかわってしまいます。 この本来の意味?であろう参照渡しとは実際 $fooに変数$objそのもののアドレスが保持されるという 解釈でよいのでしょうか? おくわしいかたご教授ください。

    • ベストアンサー
    • PHP
  • クラスで使用する「参照渡し」のやり方

    クラスを使い始めて間もないので、ご教授願います。 PHPでMySQLからSELECT文でデータを持ってくる記述です。 関数での参照渡しは使うことが出来るので、同じように考え、下記のように記述しました。ただ、loadメソッドの最後に 「return $data;」 と書くと、一応意図する通りに実行できるのですが、これはなぜですか? 「参照渡し」ならばreturnで値を返す必要が無いのでは?と思うのですが、この一行を削ると"$article->load(&$data)"は”FALSE”になるようです。 アンパサンド「&」の位置が間違っているのでしょうか? class XXX{ function load(&$data){ $query = "SELECT * FROM テーブル名"; if(!$result = @mysql_query($query, データベースへの接続)){ echo "失敗"; } while(@$line = mysql_fetch_array($result, MYSQL_ASSOC)){ array_push($data, $line); } return $data; } } // クラスの生成 $obj = new XXX; // 配列の設定 $data = array(); if($obj ->load($data)){ print_r ($data); }else{ echo "失敗"; }

    • ベストアンサー
    • PHP
  • HTML_QuickForm ラジオボタンにデフォルト値を設定するには

    HTML_QuickForm::createElementにて作成したラジオボタンのグループの1つにデフォルトでチェックを入れるにはどうしたら良いでしょうか。 addElementではなくcreateElementです。 具体的にはこのようなソースです。 for($i=0;$i<=$m;$i++) { $tmp[$i] = array( $form->createElement("text","t", ), $form->createElement("radio","r",NULL,"r0",0), $form->createElement("radio","r",NULL,"r1",1), $form->createElement("radio","r",NULL,"r2",2) ); $form->addGroup($tmp[$i],"gp".$i,"rgp".$i.":"); } r0をチェックした期待するhtmlは下記の通りです。 <input type="radio" name="gp1[r]" value="0" checked>r0 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Webサービスの参照渡し

    PHP初心者です。調べても有効な情報が得られなかったので質問します。 PHP(5.2.6)から(VB.NET2008で作成した)Webサービスを呼び出したのですが、 引数が値渡しになっているらしく、Webサービスで設定した値が返ってきません。 参照渡しにするにはどうしたらいいのでしょうか? -------------------------------------------------------------- ***[PHP]********************************** <?php $client = new SoapClient("http://IPAdress//WebSv.asmx?WSDL"); $AAA = "AAA"; $params = array('rAAA'=>$AAA); $result = $client->__soapCall("ATOB", array('parameters' => $params)); print_r($AAA); ?> ****************************************** ***[Webサービス]************************** <WebMethod()> _ Public Sub ATOB(ByRef rAAA As String) rAAA = "BBB" End Sub ****************************************** -------------------------------------------------------------- PHPを実行すると BBB と表示させたいが AAA と出てくる。 ちなみに呼び出し自体はうまくいっていて、エラーにもなっていません。

    • ベストアンサー
    • PHP
  • DB抽出結果を配列のままフォームのSELECTに使いたい

    環境はWINDOWS XP Apache2.2 PHP 5.2.3 MYSQL5 です PDOにてDB接続してます quickformを使ってフォームを作成したいと思っています include 'connect.php'; $rs=$db->query("select id,name from master"); にてIDと名前の配列を抽出し、 require_once'HTML/Quickform.php'; $form=new HTML_quickform('myform','POST','test.php'); $form->addelement('select',name,'氏名',$rs); として、氏名のドロップダウンリストを表示させたいのですが、 $rs->fetch()などで一行ずつ取り出さずに配列のままリストに入れる方法がうまくいきません。 ご教授下さい

    • 締切済み
    • PHP
  • 機種依存文字が?になる

    HTML_QuickFormを利用してフォーム送信しているのですが 受信したメールを見ると特定の文字が?になってしまい 文字化けをしてしまいます。 具体的にはメールで確認した際に<input type="text" ・・・>に 入力した半角カタカナと機種依存文字が?に変わっておりました。 php,tplファイルは全てutf-8で保存されphpのソースは以下のようになっております。 header('Content-Type: text/html; charset=utf-8'); mb_language('Japanese'); mb_http_input('UTF-8'); mb_http_output('UTF-8'); mb_internal_encoding('UTF-8'); require_once 'HTML/QuickForm.php'; require_once 'HTML/QuickForm/Renderer/ArraySmarty.php'; require_once 'Smarty/Smarty.class.php'; $to = 'mail@ad.com'; $form = new HTML_QuickForm('inq', 'post'); $form->addElement('text', 'name', '名前', array('class' => text)); $form->addElement('text', 'ad', '住所', array('class' => text)); $form->addElement('textarea', 'msg', 'コメント', array('rows' => 8, 'cols' => 30)); $value = $form->getSubmitValues(); if (isset($value['accept'])) { $subject = '連絡'; $message = <<<EOD 【名前】 {$value['name']} 【住所】 {$value['ad']} 【メッセージ】 {$value['msg']} 【メッセージ】 {$value['msg']} EOD; mb_send_mail($to, $subject, $message, "From: {$value['連絡']}"); $form->freeze(); ~略~ 半角カタカナの件は $message = mb_convert_kana ($message, 'K'); とし解決したのですが機種依存文字の解決策が見つからず自分なりに なんとか調べてみたところ下記のurlがみつかりました。 http://shimax.cocolog-nifty.com/search/2007/12/phpeucjputf8_f714.html utf-8では機種依存文字が?になるのは当たり前のことなのですね。 これを応用しなんとかできるかと思い下記のようにしてみたのですが 結果は同じでした・・・ $message = mb_convert_encoding(mb_convert_encoding($message,"sjis-win","UTF-8"),"UTF-8","sjis-win"); どのようにすれば解決できるものなのでしょうか? 宜しくお願い致します。

    • 締切済み
    • PHP

専門家に質問してみよう