乱数のライブラリについて

このQ&Aのポイント
  • PHP5.2.4を使用して乱数のライブラリを作成する際のフォルダの構造やクラスの分け方、メンバについてアドバイスを求めています。
  • 具体的には、Libraryフォルダ内にRandomフォルダを作成し、その中にAbstract.php(各クラスで共通の処理)、Integer.php(整数の乱数)、Decimal.php(小数の乱数)、NormalDistribution.php(正規分布の乱数)のクラスを配置する構成を考えています。
  • また、Random.phpというファイルにはどのようなクラスを書けば良いか、このファイルが必要なのかも教えていただきたいです。
回答を見る
  • ベストアンサー

乱数のライブラリについて

PHP5.2.4を使用しています。 小数を含む乱数を取得したい思ったのですが、そういう関数が見当たらなかったので いっそのこと、そういう機能が集まったライブラリのようなものを作ろうと思いました。 そこでフォルダの構造やクラスの分け方、メンバなどのアドバイスをして頂きたいのですが、 自分としては次のような構成を考えていて ┬ Libraryフォルダ │├Randomフォルダ ││├Abstract.php(各クラスで共通の処理) ││├Integer.php(整数の乱数、分ける目的とはいえ必要かなぁ・・・) ││├Decimal.php(小数の乱数) ││└NormalDistribution.php(正規分布の乱数) └Random.php(このファイルには何のクラスを書けばいいのか・・・そもそもこのファイルは必要?) [Integer.php] class Library_Random_Integer extends Library_Random_abstract { public function __construct($seed = false) { if ($seed !== false) { $this->setSeed($seed) } } public function Next($min, $max) { return rand($min, $max); } } [Decimal.php] class Library_Random_Decimal extends Library_Random_abstract { protected $_decimalPlace; // 最大、小数8位まで public function __construct($decimalPlace = 0, $seed = false) // これだと統一感ないなぁ・・・ { if ($seed !== false) { $this->setSeed($seed) } $this->setDecimalPlace($decimalPlace); } public function setDecimalPlace($decimalPlace) { $decimalPlace = ($decimalPlace > 8) ? 8 : $decimalPlace; $this->_decimalPlace = $decimalPlace; return $this; } public function next($min, $max) { $pow = pow(10, $this->_decimalPlace); $min *= $pow; $max *= $pow; $r = rand($min, $max); return $r / $pow; } } [NormalDistribution.php] class Library_Random_NormalDistribution extends Library_Random_abstract { public function __construct($seed = false) { if ($seed !== false) { $this->setSeed($seed) } } public function next($mu, $sigma) { $r = new DecimalRandmizer(8); $alpha = $r->Next(0, 1); $beta = $r->Next(0, 1) * pi() * 2; $boxMuller1 = sqrt(-2 * log($alpha)); $boxMuller2 = sin($beta); return $sigma * ($boxMuller1 * $boxMuller2) + $mu; } } 使用例 $r = new Library_Random_NormalDistribution(time()); print $r->next(10, 5); .NETのSystem.RandomのNextDouble()メンバのように いちいちクラス分けしなくてもこの例ならNextNormalDistribution()のように 一つのクラスに追加していく形でもいいのかもしれませんが限界がありそうなので こういう構造にしたのですが、自分ならこうするとかここがおかしいとか何でもいいのでアドバイスを頂けないでしょうか?

  • PHP
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.1

うーん、 <?php class Library_Random{ public static function factory($type){ $className = 'Library_Random_' . $type; $classPath = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'Random' . DIRECTORY_SEPARATOR . $type . '.php'; if(class_exists($className)) return new $className(); if(file_exists($classPath)){ require_once $classPath; if(class_exists($className)){ $instance = new $className(); return $instance; }else{ throw new Exception('Class Not Found'); } }else{ throw new Exception('File Not Found'); } } } ?> とか、ファクトリークラスにしてしまって、 <?php require_once 'Library/Random.php'; $random = Library_Random::factory('NormalDistribution'); $random->setSeed($seed); foreach($random as $val){ //Library_Random_AbstractにIteratorでも実装してやって //foreachで気の済むまでランダムを生成させ続けることが出来るようにしたりとか? } ?> $decimalPlaceは、初期値持たせちゃって、カスタマイズ必要な人が、インスタンス生成後に セッターメソッド叩くようにすれば良いのではないでしょうか。

takagoo100
質問者

お礼

ご回答ありがとうございます。 すいません、お題で間違っていた部分があったので少し訂正しました。 [Integer.php] class Library_Random_Integer extends Library_Random_abstract { public function __construct() { } public function Next($min, $max) { return rand($min, $max); } // 0から1までの小数の乱数を返す public function NextDouble($min, $max) // 整数担当のクラスなのにこれを設けるのはどうかと思いますが・・・ { return $this->Next(0, 2147483647) * (1.0 / 2147483647.0); } } [Decimal.php] class Library_Random_Decimal extends Library_Random_abstract { protected $_decimalPlace = 0; public function __construct() { } public function setDecimalPlace($decimalPlace) { $this->_decimalPlace = $decimalPlace; return $this; } public function next($min, $max) { // どうもうまくいってないようなので、とにかく小数を含む値を返すということで^^ } } [NormalDistribution.php] class Library_Random_NormalDistribution extends Library_Random_abstract { public function __construct() { } public function next($mu, $sigma) { $r = new Library_Random_Integer(); $alpha = $r->NextDouble(); $beta = $r->NextDouble() * pi() * 2; $boxMuller1 = sqrt(-2 * log($alpha)); $boxMuller2 = sin($beta); return $sigma * ($boxMuller1 * $boxMuller2) + $mu; } } 使用例 $r = new Library_Random_NormalDistribution(); $r->setSeed(time()); print $r->next(1000, 500); 質問があるのですが、今回のは__constructに引数を指定しない形にしたのですが、 そもそも__constructにはあまり引数を与えない方がクラス的にはいいのでしょうか? 自分なんかは、クラスをインスタンス化する時についでに指定したい値も追加できたら 便利というか楽(逆に分かり難くはなりますが・・・)だなぁと思ったりするのですが。 あと >Library_Random_AbstractにIterator とのことですが、これを実装するメリットのようなものは何なのでしょうか? $r->next($min, $max); ではなくてIteratorを使うことのメリットというか実装も含めてよく分からないので、 もしよろしければ何か1つ実例を示して頂けないでしょうか? よろしくお願いします。

その他の回答 (2)

回答No.3

小数点のランダム、に関しては、私は不勉強でアルゴリズムとかはわからないんですが、 return (float) rand(0, 10000) . "." . sprintf("%08s", rand(0, 99999999)); とかみたいな、ランダムでとった値を文字列で表現してから型変換してリターンというのではまずいですか? メソッドに関しては、メソッドチェーンとかすればセッターでセットして、値を出力する、というのもまぁそんなに苦じゃないのかなと思ったんですが、 <?php $res = $r->set($nu, $sigma)->get(); ?> みたいな感じで。単純にsetとするのかそれぞれの値をsetXXとか分けるのかはまた考えるとして。

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、メソッドチェーンを使えば良さそうですね。 小数の方は、それだと例えば最小が-3.5で最大が1.2の乱数を取得したい場合に おそらくそのやり方だと、整数の部分がrand(-3, 1)で仮に1が取得できた時に 小数の部分がもし2より大きな値だと範囲外(例えば1.5とか)になってしまうんです。 なので整数部分が-2から0の間なら小数部分はなんでもかまわないのですが、 そこらへんを工夫すればでなんとかきるんじゃないかなぁと思ってるんですけど(かなりめんどくさいですが^^) なので最初に提示したように10乗のやりかたを試みたわけです。 ただ知りたかったのはライブラリの構造などでしたので、大変参考になりました。 ありがとうございます。

回答No.2

Iteratorについては、今回のランダムな値を出すライブラリではさほど意味を成さないですね。 ちょっと面白いかと思っただけで、深い意味はないです。 Iteratorの実装については、 http://jp2.php.net/Iterator こちらです。 具体的にどういうときに便利か、といえば、fopen関数などのラッパークラスを作ったりしたときに <?php $file = new MyFile('filename.csv', 'r'); foreach($file as $line){ //foreachで1行ずつ取り出せる } $file->close(); ?> とか出来ると記述がシンプルになって良いかなと。 コンストラクタの引数に関しては、 >(逆に分かり難くはなりますが・・・) とおっしゃるとおりで、分かりづらくなります。 特に同じような動作をするライブラリなのであれば、インターフェイスは統一させたほうが使いやすいかなと。 話は変わりますが、参考資料として、 Zend_Http_Clientなどを見てもらうと何かヒントがもらえるかも。 Zend_Http_Clientはアダプタとして、cURLを使うとか普通にfsockopen使うとか、proxyをかました接続をするとか切り替えられます。 でもソレはそれぞれを自分でnewしてインスタンスを生成するのではなくて、 <?php $uri = 'https://example.com'; $config = array( 'adapter' => 'Zend_Http_Client_Adapter_Curl', 'curloptions' => array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_SSL_VERIFYHOST => 1, CURLOPT_SSL_VERIFYPEER => 1, CURLOPT_CAPATH => 'path', CURLOPT_CAINFO => 'path/to/ca.pem', CURLOPT_SSLCERT => 'path/to/client.pem', CURLOPT_SSLCERTPASSWD => 'password', ), ); $client = new Zend_Http_Client($uri, $config); //※以前別の質問に回答したものをコピペしてきました。 ?> というように、 親となるクラスに、配列で使用するクラスの名前とプロパティを渡してやると、ソレを使った動作を行うようになります。 いかがでしょう。

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、このランダムクラスの場合だとZend_Http_Client_Adapter_Interfaceに相当するのが Library_Random_Interface(またはLibrary_Random_Atapter_Interface)というわけですよね? [Library_Random_Interface.php] interface Library_Random_Interface { public function setConfig($config = array()); public function next();// 引数なし } ただどうなんでしょう、next()に引数なしにすれば統一感があるのですが、 例えばこれは整数の乱数の例えなのですが、やっぱり $random = Library_Random::factory('Integer'); $random->setSeed($seed); $random->next(1,5); $random->next(10,20); というふうに引数を指定できた方がこのクラスの場合だとなんとなく良さげな感じがするんです。 なので引数なしのnext()とは別にそれぞれのアダプターでnext($min,$max)とかnext($mu,$sigma)とか追加すればいいんでしょうか? そもそもLibrary_Random_Decimal(小数を含む乱数)は乱数を取得すること自体に無理があるような気がしてて 初めは例えば最小が-3.5と最大が1.2の乱数を取得したいなぁと思ったことがきっかけで、 正規分布の乱数もあるしその他にもありそうなのでアダプターした方がいいのかなぁと思って 一応「小数を含む乱数」ということで分類したのですが、案外それが難しかったりします。 簡単に思いつくやり方(それがほんとに乱数と定義できるかは分かりませんが・・・)は最初に示したように まず取得したい分10乗してそれをrand(10乗したmin, 10乗したmax)、そして最後にかけた分を割ると。 でもこれだと整数部分が大きい数(例えば10000000.232034234)とかだと桁あふれするので無理っぽいんですよね・・・ Library_Random_Decimal(小数を含む乱数)に関しては別にどうしても実現したいってわけでもないので できなきゃ別にいいのですが、もしhogehoge78にアイデアがあれば教えていただけないでしょか?

takagoo100
質問者

補足

すいません・・呼び捨てになってました・・・ hogehoge78→hogehoge78さん

関連するQ&A

  • codeigniterのsessionについて

    codeigniterで、管理画面を作っていて、今認証画面に取り掛かってますが、sessionが引き継がれません。 ※以下のコードは、session以外は省いてます。 controller側のtop.phpで、 class Top extends MY_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); } public function index() { $superuser = array( 'superuser' => 'yes' ); $this->session->set_userdata($superuser); redirect('show'); } $this->load->view('admin/top', $page); } とし、controller側のshow.phpで、 class Show extends MY_Controller { public function __construct() { parent::__construct(); $this->load->library('session'); } public function index() { var_dump($this->session->userdata('superuser')); $this->load->view('admin/show'); } } としてますが、show.phpで、var_dumpがfalseを返してしまい、sessionが引き継がれません。 ご教授下さい。

    • 締切済み
    • PHP
  • 乱数について

    乱数の分布を見るために以下のようなプログラムを書きました。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int i,imax, S[RAND_MAX], r; double x,y; FILE *output1; output1=fopen("random2.data","w"); imax=100000; for(i=0;i<=imax;i++){ r = rand(); S[r] += 1; } for(i=0;i<=RAND_MAX;i++){ fprintf(output1,"%d %d \n",i,S[i]); } return 0; } するとコンパイルできて実行もできるのですが、なぜか乱数が30000を 超えるくらいのところでおかしな値になりました。 原因がわからないのでどなたか教えてください。

  • 【乱数】任意の範囲、固定個数、重複しない乱数

    テニスのダブルス組み合わせ用のスクリプトを考えております。 ネットでいろいろ探して試してみましたが Javascript初心者で、寄せ集めでは限界がありますので質問させてください(;^_^A 【何をしたいのか】 ・テキストボックスで任意の数字(整数)で範囲と行数を指定。 ・結果は数値4個固定とし、4個で1グループ。この4個内は重複がないように。 ・4個1グループを指定の行数分求める。 ・このとき、なるべくならすでに出た数字は後回しにしたい。例えば1~10の範囲としたら、1~10すべて出るまでは一度出た数字は後回しになるように。 ・小さい範囲で大きな行数を指定すれば、必ず同じ組み合わせが出ることは了承。 ・結果は下記のようにしたい。 1,6,8,3 2,4,5,10 9,7,2,3 ・ ・ 3,6,8,1(1行目と同じ組み合わせだが順不同なので可、またはまったく同じのが出ても可) 【現在の状況】 ネットで拾ったサンプルから、何をどのように書き換えたらいいのかわからずです(;^_^A 【サンプルの提示】 ■範囲の乱数■ <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- function gen_random(num1, num2) { retval=Math.random(); document.write(Math.floor(retval * (num2 - num1)) + eval(num1)); } //--> </SCRIPT> </HEAD> <BODY> <center> <table border=1 cellpadding=4> <form name=myform> <tr><td bgcolor=#ffffe4 align=center> <font color=blue> 乱数の範囲 </td></tr> <tr><td align=center> <input type=text name=d1 size=2 maxlength=2> ~ <input type=text name=d2 size=4 maxlength=4> </td></tr> <tr><td align=center> <input type=button name=btn1 value=乱数発生 onClick=gen_random(myform.d1.value,myform.d2.value)><br> </td></tr> </form> </table> </center> </BODY> </HTML> ---------------------------------------- ■30個を5行ずつ出している <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> var i; for(i=1 ; i <=30 ;i++) { document.write(Math.floor(Math.random()*10) +"<BR>"); if(i%5 == 0) document.write("<HR>"); } </SCRIPT> </HEAD> <BODY> </BODY> </HTML> --------------------------------------------------------- ■重複しない、しかも後回しになる?■ <HTML> <HEAD> <SCRIPT LANGUAGE="JavaScript"> //once_rand: min以上max未満の重複しない乱数を生成するためのオブジェクト function once_rand(min,max){   this.cnt=max-min;   this.arr=[];   //乱数候補を配列に格納   for(var i=0;i<this.cnt;i++){this.arr[i]=min++;} } //乱数を取り出すメソッド once_rand.prototype.next=function(){   if(this.cnt<=0){     //もう乱数候補が残っていない     return undefined;   }   //乱数を取り出す位置を決定   var idx=Math.floor(Math.random()*(this.cnt));   //乱数を取り出す   var rand_val=this.arr[idx];   //重複しないように最後尾の要素で上書き(今のthis.arr[this.cnt-1]は次回以降使われない)   this.arr[idx]=this.arr[this.cnt-1];   //残りの乱数候補が減少   this.cnt--;   return rand_val; } //テスト var rand1 = new once_rand(1,15); //1以上15未満 var str=rand1.next(); while(1){   var rand_val=rand1.next(); //乱数を取り出す   if(rand_val == undefined){break;}   str += ","+rand_val; } alert(str); </SCRIPT> </HEAD>

  • 【乱数発生】 JavascriptからPerlへ移植したい

    テニスのダブルス組み合わせ用のスクリプトを考えております。 ネットでいろいろ Javascriptでは教えていただいたのですが、 携帯からはJS使えないことを後で知り、 Perl-CGIならいけるのでは?と。 Perlについてまったくわからないので 下記の件について、大変僭越ではありますが 移植をお願いしたいのです(;^_^A 【何をしたいのか】 ・テキストボックスで任意の数字(整数)で範囲と行数を指定。 ・結果は数値4個固定とし、4個で1グループ。この4個内は重複がないように。 ・4個1グループを指定の行数分求める。 ・このとき、なるべくならすでに出た数字は後回しにしたい。例えば1~10の範囲としたら、1~10すべて出るまでは一度出た数字は後回しになるように。 ・小さい範囲で大きな行数を指定すれば、必ず同じ組み合わせが出ることは了承。 ・結果は下記のようにしたい。 1,6,8,3 2,4,5,10 9,7,2,3 ・ ・ 3,6,8,1(1行目と同じ組み合わせだが順不同なので可、またはまったく同じのが出ても可) 以下は、Javascriptで稼動するソースになります。 ※後半のFORM部分からPOSTして CGIにて受取、乱数生成したHTMLを表示させるようにしたいのです。 ---------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <script type="text/javascript"> <!-- function OnceRand(min, max) { if(isNaN(min) || isNaN(max) || parseInt(min) >= parseInt(max)) throw new Error("指定の値に誤りがあります。"); this.min = parseInt(min); this.max = parseInt(max); this.createArray(); } /* 配列を作成します。 */ OnceRand.prototype.createArray = function() { this.original = []; for(var ix = this.min; ix <= this.max; ix++) { this.original.push(ix); } this.arr = this.original.concat(); }; /* 次の値を取り出します。 */ OnceRand.prototype.next = function(length) { var per = []; if(0 >= length) return per; for(var ix = 0; ix < length; ix++) { if(this.arr.length <= 0) this.arr = this.original.concat(); do { var dup = false; var ax = Math.floor(Math.random() * this.arr.length); for(var px = 0; px < per.length; px++) { if(per[px] == this.arr[ax]) dup = true; } } while(dup) per.push(this.arr.splice(ax, 1)[0]); } return per; }; /* 乱数を生成します。 */ function genRandom() { var minBox = document.getElementById("min"); var maxBox = document.getElementById("max"); var lineBox = document.getElementById("line"); var console = document.getElementById("console"); var consoleClone = console.cloneNode(false); var lineMax = parseInt(lineBox.value); var rand1 = new OnceRand(minBox.value, maxBox.value); for(var lx = 0; lx < lineMax; lx++) { var texts = rand1.next(4); var textLine = document.createTextNode(texts.join(" ,")); var breakLine = document.createElement("br"); consoleClone.appendChild(textLine); consoleClone.appendChild(breakLine); } console.parentNode.replaceChild(consoleClone, console); } // --> </script> <title>範囲乱数</title> </head> <!--ここからはページ表示部分--> <body> <div> 範囲:<input type="text" id="min" value="" size=2 maxlength=2> ~<input type="text" id="max" value="" size=2 maxlength=2> <br> 行数:<input type="text" id="line" value="" size=2 maxlength=2> <br> <input type="button" value="乱数発生" onclick="genRandom();"> </div> <div id="console"></div> </body> </html> -------------------------------------------------------

  • C#の乱数取得について

    C#の乱数取得について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 C#の乱数取得について調べましたところ以下のプログラムサンプルを見つけました。 1| int seed = Environment.TickCount; 2| string s = ""; 3| 4| for (int i = 0; i < 10; i++){ 5| Random r = new Random(seed++); 6| for (int j = 0; j < 5; j++){ 7| s += r.Next(50).ToString("00") + " "; 8| } 9| s += Environment.NewLine; 10| } 11| this.textBox1.Text = s; C#は勉強し始めたばかりで、まだまだ知識不足なのでこのプログラムが理解できません。 今の自分の知識で考えたことは、 1行目、int型のseedに、C#の乱数を生成するときにデフォルトで設定されるseed値を格納。 2行目、stringクラスのsを定義。 5行目、Random型(?)rにseedを設定 7行目、わかりません。。乱数を取得してることはわかるのですが。 9行目、sに保持。 11行目、GUIに表示。 どなたか、詳しく解説していただけると助かります。 よろしくおねがいします。

  • Codelgniterのコンストラクタ記述方法

    PHP5 で Codelgniter (Ver2.0.3-1) を使用してコンストラクタを書く方法につきお尋ねします。 ある参考書で Codelgniter の使用法を学習していますが、その本のフォーム処理のためのコントローラーの例文として下記の記述があります(一部要約)。 Class Form extends Controller { function Form(){ parent:: Controller(); $this->load->helper('url'); $this->load->library('form_validation'); $this->form_validation->set_rules('name', '名前', required); } } ところがこのコンストラクタは PHP4 形式で記述しているとの注記が付いています。 このコンストラクタを PHP5 形式で Codelgniter (Ver2.0.3-1) を使用して書くにはどのようにすれば良いでしょうか? ネスト形式で次のようにすれば良いですか? Class Form extends CI_Controller { function Form(){ public function __construct(){ parent:: construct(); } $this->load->helper('url');   中略 } }

    • ベストアンサー
    • PHP
  • PEARのライブラリを使うと文法エラー

    現在PHP5でプログラムをしていますが、非常に困っています。 PEARのライブラリNet_UserAgent_Mobileを使用しているのですが、このライブラリを呼び出している行で文法エラーが出てしまいます。 ソースとエラーは以下のような感じです。 [ソース] <?php require_once('Net/UserAgent/Mobile.php'); class MyMobile extends Test { $agent = Net_UserAgent_Mobile::singleton(); function __construct() { } (以降省略) [エラー] 抜粋 PHP Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /somedir/MyMobile.php on line 5 エラー内容から察するに、Net_UserAgent_Mobile::singletonの部分が問題だと思うのですが、まったく原因がわかりません。 気になる点としましては、今回初めてオブジェクト指向でプログラムしているという点です。 オブジェクト指向プログラム時に、pearライブラリの使い方を変えなければならないなど注意点があるのでしょうか? 上記エラーの対処法をご教授いただければ幸いです。

    • ベストアンサー
    • PHP
  • 継承クラスで定義したメソッドのtry-catch文

    親クラスで、子クラスで実装されたメソッドのExceptionをキャッチしたいのですが、 うまくいきません。 何か良い方法はないでしょうか? abstract class A { public __construct(){ try{ $this->testA(); }catch(Exception $e){ var_dump(1); } } abstract function testA(); } class B extends A { function testA(){ throw Exception('test',1); } } try{ new B; }catch(Exception $e){ var_dump(2); // こっちが動く } よろしくお願いします。

    • ベストアンサー
    • 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
  • Ajaxで画像の削除

    Ajaxで画像を削除しようといろいろ試行錯誤しているのですが、 最終的なところで詰まっています。 $(function(){ $("input:button").click(function(){ //クリックされた画像のidを取得 var id = $(this).attr("id");   alert(id); //削除ボタンの無効化 $(this).attr("disabled",true); //idをサーバに送信(PHP側で削除処理)して結果を受け取る $.ajax({ url : "/test/delete_image", dataType : "json", data : {id:id}, type : "post", success : function(data){ if(data.id){ alert(data.id); $("#tblh img#image"+data.id).attr("src","/images/noimage.gif"); } }, error : function(){ alert("通信に失敗しました。"); } }); }); }); codeigniterというフレームワークを利用しPHP側では画像をディレクトリから削除しています。(こちらの動作は問題なし) <?php class Delete_image extends CI_Controller { function __construct(){ // Model クラスのコンストラクタを呼び出す parent::__construct(); $this->load->model('array_constant'); $this->load->helper(array('form', 'url')); $this->load->library('form_validation'); $this->load->library('form_ex'); } function index(){ if(!$this->input->post("id")){ return false; }else{            //画像の削除とDBの画像名称を更新 $arr = array('id' => $this->input->post("id")); } echo json_encode($arr); } } としています。 画像の削除とDBの画像名称は更新されてるのでPHP側は問題ないようです。 jsonの値を受け取って画像を置き換えようとしているのですが、エラー側のほうに 判断されてしまいます。「alert("通信に失敗しました。");」となります。 なぜか分からず困っています。 教えてください。

    • ベストアンサー
    • AJAX