PHPで引数の違うメソッドを作成する方法

このQ&Aのポイント
  • PHPで同名で引数の違うメソッドを作成することは可能です。
  • ただし、同じクラス内に同名のメソッドを作成する場合、引数の数や型が異なっている必要があります。
  • また、メソッドのオーバーロードを利用することで、引数の違うメソッドを実装することもできます。
回答を見る
  • ベストアンサー

引数の違うメソッド

PHPで同名で引数の違うメソッドを作成したいのですが、可能でしょうか? <?php class Test { var $test_str = ""; function set($str){ $test_str = $str; //$this->$test_str = $str; // どちらでも良い? } function Test() { // 引数なし } function Test($str) { // 引数あり $this->set($str); } } $obj = new Test(); ?>

  • ne5
  • お礼率4% (5/124)
  • PHP
  • 回答数1
  • ありがとう数0

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

同じクラス中に同名のfunctionを作りたいということですか? それはできませんね。 なんとなくやりたいことはわかるので、こんな感じでどうでしょう function Test($str=null) { if(is_null($str)) return false; $this->set($str); } $strを省略したときに、$strにnullを代入する。 $strがnullつまり省略されたときには何もしないで戻る そうでないときはプログラム実行。

関連するQ&A

  • PEARを使ったフェッチのしかた。

    いつもお世話になっています。 pear と phpを使ったclassを勉強しており 行き詰った点があったので教えてください。 **** class.php ************************ require_once("DB.php"); class DB_Class{ var $db_object;//DB::connectが入る var $db = "mysql"; var $db_user = "user"; var $db_host = "localhost"; var $db_name = "db_name"; var $pass = "pass"; function DB_Class(){ //コンストラクタ $db_string = $this->db."://".$this->db_user.":".$pass."@".$this->db_host."/".$this->db_name; $this->db_object = DB::connect($db_string); } } **** test.php ******************************** require_once("class.php"); $obj = new DB_Class(); $sql = "select * from TEST_TABLE"; $res = $obj->db_object->query($sql); while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)){ print("<td>".$row["TEST"]."</td>"); } class.phpファイルのメンバ変数 var $db_objectにDB::connectが入っており、 test.phpでfetchRowを使ってDBの内容を 取り出したいのですが、 fetchRowメソッドが見つからないというエラー がでます。 それまでのqueryメソッドまではエラーがなく 呼び出せます。 while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)) ここを $res->$obj->db_object->fetchRowや $res->$obj->$this->DB_object->fetchRowや とにかく色々な方法を試してみたのですが うまくいきませんでした。 どなたかご教授お願い致します。

    • ベストアンサー
    • PHP
  • クラスのメソッド

    inidat.phpに$global_a=3;と書いてありますがクラス内でこれが得られません。 <?php require_once 'inidat.php'; class test5 { var $a; function test5() { $this->a = 'inidat-a=' . $global_a; } } ?>

    • 締切済み
    • PHP
  • クラスの中のクラスへのアクセス

    お世話になります。 クラスが以下のようにあります。 class ClassName1{ var $classname2_obj; // クラス「ClassName2」のオブジェクト function getClassName2Obj(){ return $this->$classname2_obj; } } class ClassName2{ var $array_list; // 配列です  function getArrayList(){ return $this->array_list; } } やりたいのは、ClassName1のgetClassName2Obj関数でClassName2の配列をgetArrayListで取得したいのです。 $a = new ClassName1; $b = $a->getClassName2Obj(); $c = $b->etArrayList(); 上の$b = … と$c = …の部分の処理を一行にまとめることはできないでしょうか? 何卒よろしくお願い致します。 PHPは5です。

    • ベストアンサー
    • PHP
  • 関数の引数とグローバル変数について

    javascript初心者です。 どうしても分からないことがあるので質問させて頂きます。 グローバル変数の値を関数で処理して増やしコンソールログに表示していく、 というようなソースがあるとします。(以下) //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 var afunc = function(){   a++;   console.log(a); } var bfunc = function(){   b++;   console.log(b); } var cfunc = function(){   c++;   console.log(c); //onclickなどで呼び出す関数 function test1(){   var aplus = new afunc(); } function test2(){   var aplus = new bfunc(); } function test3(){   var aplus = new cfunc(); } グローバル変数や関数などが3つと数が少ないならこれでもいいかも知れませんが、 これが数十個とかに増えると、ソースの量もかなり多くなり 管理も大変になると思い簡略化させたいと考えました。 そこで以下のように変えてみたのですが、 加算がうまくいきません。 //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 vvar xxfunc = function(xx){   this.xx = xx;   this.show = function() {     this.xx++;     console.log(this.xx);   } } //onclickなどで呼び出す関数 function test1(){   var aplus = new xxfunc(a);   aplus.show(); } function test2(){   var aplus = new xxfunc(b);   aplus.show(); } function test3(){   var aplus = new xxfunc(c);   aplus.show(); } もしかすると、関数の引数にはグローバル変数を指定することができないのでしょうか? 何かうまいやり方はあるでしょうか? プログラミング自体が勉強し始めたばかりなので、 おかしなソースの書き方をしているかもしれませんのが、 ご教授、よろしくお願いいたします。

  • クラスのメンバが上書きされる。

    クラスのメンバーがなぜか上書きされてしまう事態になってしましいます。 以下はソースです。そのまんまです。 <?php $obj = new CMessegLog(); $obj->setMsg1("gogo"); $obj->setMsg2("toto"); echo $obj->$Msg1."\n"; echo $obj->$Msg2."\n"; class CJapanTotalMusic { var $msg1; var $msg2; function setMsg1($message) { $this->$Msg1 = $message; } function setMsg2($message) { $this->$Msg2 = $message; } } ?> これを実行すると下記のように、 $Msg1が$Msg2に上書きされたような出力を返してきます。 ----------------------- $ php MsgLog.php toto ※ gogoであってほしい。 toto           ----------------------- どうなっているんでしょうか? よろしくお願いします。 PHPの環境は PHP 5.0.4 (cli) (built: Jun 12 2005 23:14:24) Copyright (c) 1997-2004 The PHP Group Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies です。

    • ベストアンサー
    • PHP
  • javascript new演算子について質問があります。

    javascript new演算子について質問があります。 只今javascript勉強中なのですが、どこかのサイトでnew演算子は悪いパーツとの 記事を読みました。 そこでnew演算子を使用せずにオブジェクト生成の方法を試行錯誤考えてみたのですが (IE用に__proto__もなしで)例えば以下コードはアリなコードでしょうか?? あるいはありえない感じでしょうか?? またnewが悪なのはインスタンスを作る時にnewを付け忘れると、 グローバルな汚染をしてしまうということだけなのでしょうか?? オブジェクトとプロトタイプの理解に苦しんでいるところなので 色々と曖昧なのですが、どなたかどうぞご教授お願い致します。 var obj = {}; obj.method = function(){ this.prop1 = "hoge" return this; }; obj.method.prototype = obj.method(); obj.method.prototype.prop2 = "fuga"; var obj2 = obj.method(); console.log(obj2)

  • flash javascript php の引数受け渡しで

    http://61.197.170.205/~tobacco/htdocs/test.php があり。戻り値があります。 javascriptに var req_argument = null; function File_Request(data, fileName){ //XMLHttpRequestオブジェクト(ブラウザー対策できてるものとして) var http_obj = new XMLHttpRequest(); http_obj.open("POST", fileName); http_obj.onreadystatechange = function(){ if(http_obj.readyState == 4){ req_argument = http_obj.responseText; } } http_obj.setRequestHeader('Content-Type','text/plain;charset=UTF-8'); http_obj.send(data); } function flash_kick(argument) { File_Request(argument, "http://61.197.170.205/~tobacco/htdocs/test.php"); return req_argument; } を設置したページを用意し、さらにactionscript上に以下と「bt_test」ボタン・「kakunin_text_box」のあるflashを配置しました。 import flash.external.*; bt_test.addEventListener(MouseEvent.MOUSE_UP, test_action); function test_action(e){ var argument:String = "渡したい引数"; var s:String = String(ExternalInterface.call("flash_kick", argument)); kakunin_text_box.text = s; }; うまくいかず、http_obj.readyState == 4を待ってくれないのでnullが戻ってきます。 どのような処理をするとスムーズにphpの返り値をflashへ受け渡せるのか、ご教授いただけると嬉しいです。 質問用書き換え時に文法エラーあったらごめんなさい。

    • ベストアンサー
    • AJAX
  • newでコンストラクタ関数が受け取った引数の行き先

    ・Test1とTest2で何が違うのでしょうか? ・Test1のtenは、this.scoreで生成するインスタンスプロパティへ格納 ・Test2のtenは、どうなっているのでしょうか? ・どこへも格納していないのに、「new Test2('100');」で文が終わった後、呼び出せている理由は? ■Test1 var Test1 = function (ten) {  this.score = ten;  this.getScore = function() {   alert(this.score);  } } var result1 = new Test1('100'); result1.getScore(); ■Test2 var Test2 = function (ten) {  this.getScore = function() {   alert(ten);  } } var result2 = new Test2('100'); result2.getScore(); ■下記★部分の「alert(this.score);」「alert(ten);」何れも100と表示されるのですが、中でどういう処理が走ってそういう結果になるのでしょうか? var Test3 = function (ten) {  this.score = ten;  this.getScore = function() { //★  alert(this.score);   alert(ten); } } var test3 = new Test3('100'); test3.getScore();

  • Jsonpのコールバック関数に内に引数を渡すには?

    APIで返されたJsonpコールバック関数に引数を渡したいのですが、やり方が判りません。 それともそもそも、間違っていて 1.引数を渡さない 2.コールバック関数内のデータを一旦変数にいれてコールバック関数内から取り出す。 3. 2で取り出したコールバック関数内のデータと1で渡そうとしていた引数を使う。 とやったほうがいいのでしょうか。 当方経験が浅いためよくわかっていません。基本的な間違いの可能性が高いと思います。 識者の方ご教授下さい。お願いします。 function start(){ var str = "渡したい引数"; var param = new Object(); param.keyword = '東京'; param.inputcharset = 'utf8'; param.outputcharset = 'utf8'; param.format = 'jsonp'; param.callback = 'jsonp4travelAPI'; var url = 'http://api.4travel.jp/Ver1/SearchAlbum.php?'+obj2query( param ); // script 要素の発行//ここでAPIへリクエストを送る。 var script = document.createElement( 'script' ); script.type = 'text/javascript'; script.src = url; document.body.appendChild( script ); } // 4travel検索終了後のコールバック関数 function jsonp4travelAPI ( data ) { // データが取得できているかチェック // //ここに渡したい引数も持ってきたい。でも str is not definedになります。 alert(str); } // オブジェクトからクエリー文字列を生成する関数 function obj2query ( obj ) { var list = []; for( var key in obj ) { var k = encodeURIComponent(key); var v = encodeURIComponent(obj[key]); list[list.length] = k+'='+v; } var query = list.join( '&' ); return query; } window.onload =start;

  • リフレクション 可変長引数メソッドの取得

    リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか? //JDK 6.0 public Hoge { void method1(String str, Object ...objs){}//(1) void method1(String str, String str2){}//(2) } Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method", String.class, String.class); Method m11 = c.getMethod("method", ?? );

    • ベストアンサー
    • Java

専門家に質問してみよう