&や&=について

このQ&Aのポイント
  • 【&getInstance()】の&は何を意味していますか?
  • 【$myts =& TextSanitizer::getInstance();】の&=は何を意味していますか?
  • getInstance()関数の使用時の目的は何ですか?
回答を見る
  • ベストアンサー

&や&=について

--------------------------------------- class TextSanitizer { function &getInstance() { static $instance; if (!isset($instance)) { $instance = new TextSanitizer(); } return $instance; } } $myts =& TextSanitizer::getInstance(); ------------------------------------------- 上記について3点質問がございます。 1.【&getInstance()】の&は何を意味していますでしょうか? 2.【$myts =& TextSanitizer::getInstance();】の&=は何を意味していますでしょうか? 3.getInstance()関数はどんなとき使用すべきでしょうか? ご検討がつく方アドバイスを宜しくお願いします。

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

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

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

&は変数の値ではなく、値への参照(ポインタ)を意味します。PHP5では、オブジェクトの代入や、関数の引数ではオブジェクトの参照を渡します。 $a = new MyClass(); $a->aProperty = 0; $b = $a; $b->aProperty = 1; echo $a->aProperty; と書いた場合、PHP4では0が、PHP5では1が出力されます。つまりPHP4では代入の時に$bに$aがコピーされます。同じプロパティを持ちますが別のオブジェクトです。しかし、PHP5では$aと$bは同じオブジェクトを指します。 ここで、$b = &$a とすると、PHP4でも$bに$aの参照がコピーされ、同じオブジェクトを指すようになります。 質問の2番目は &= ではなく = &ですね。この&も同じ意味です。&=はこれで1つの別の演算子です。 最後の質問ですが、これはシングルトンと言うデザインパターンです。クラスのオブジェクトが複数生成されないようにします。 使用例ですが、データベース接続オブジェクトなどはいい例でしょう。 データベース接続オブジェクトは生成にコストがかかり、リソースも食います。複数のメソッドで同じデータベース接続オブジェクトを必要とする場合、他のメソッドですでに接続オブジェクトを生成していれば、それを再利用できますが、すでに作成されているかどうかを調べるのはそう簡単ではありません。しかし、このパターンを使えば、すでに存在すればそのオブジェクトを返しますし、なければ新しく作って返します。 使用するメソッドの中では、存在するかどうかを気にする必要がなくなります。

関連するQ&A

  • CakePHPでシングルトンパターン

    CakePHPでシングルトンパターンで、インスタンスを使いまわしたいのですが、 うまく動作しません。 以下のようなプログラムですが、何か設定が足りないのでしょうか class Test{   public static $instance = null;   public function __construct(){}   public function getInstance(){    if(is_null(Test::$instance)){     Test::$instance = new Test();    }    return Test::$instance;   } } 上記クラスを以下のように呼び出しております。 $instance = Test::getInstance(); 何度やっても、インスタンスが新しく生成されてしまします。 良い方法がございましたら、ご教授下さい。

    • ベストアンサー
    • PHP
  • 同期について

    ちょっと疑問に思ったので質問させてください。 たとえばあるオブジェクトに対して同期(ここではinstance)する場合、ケース1とケース2では違いがありますでしょうか? ケース1: public static Test getInstance() {   synchronized(instance) { if(instance != null) { return instance; } else { instance = new Test(); return instance; } } ケース2: public static synchronized Test getInstance() { if(instance != null) { return instance; } else { instance = new Test(); return instance; } } 以上宜しくお願いします。

    • ベストアンサー
    • Java
  • PHP T_STRINGエラー?

    新しくPHPのサイトを作成しようとしたんですが、 syntax error, unexpected '{', expecting T_STRING in と表示されてどうにも使用がありません。 どこが原因でエラーが出てるのでしょうか? エラー行は7行と表示されていますが、いまいちわかりません スクリプトは以下の記述の通りです <?php require './Request.php'; require './Cookie.php'; final class SystemMain extends { private static $instance; private $modeName; public static function getInstance() { if (self::$instance === null) { self::$instance = new SytemMain(); } return self::$instance; } public function setMode() { if (file_exists('./maintenance')) { $this->modeName = 'Maintenance'; } else { $str = Request::both('mode'); if (!$str) { $this->modeName = 'Top'; } else if (file_exists('./script/mode/' . $str . '.php')) { $this->modeName = $str; } else { $this->modeName = 'NotFound'; } } require_once './script/mode/' . $this->modeName . '.php'; } public function getMode() { return $this->modeName; } } ?> Request.php <? class Request extends { public static function get($str) { return isset($_GET[$str]) ? $_GET[$str] : null; } public static function post($str) { return isset($_POST[$str]) ? $_POST[$str] : null; } public static function both($str) { $post = self::post($str); return $post ? $post : self::get($str); } } ?> Cookie.php <? class Cookie extends { public static function set($name, $value, $expire = 0) { return setcookie($name, $value, $expire); } public static function get($str) { return isset($_COOKIE[$str]) ? $_COOKIE[$str] : null; } public static function clear($str) { $_COOKIE[$str] = ""; return setcookie($str, ""); } } ?>

    • ベストアンサー
    • PHP
  • C++ シングルトン マルチスレッド

    標準C++でシングルトンを実装したいのですが。 class Singleton{ public: static Singleton* getInstance(){ if (_instance == NULL){ //スレッドAがこの時点で、スレッドBがNULLチェックすると破綻する _instance = new Singleton(); } return _instance; } private: Singleton(); static Singleton* _instance; }; マルチスレッドになると上記のパターンで破綻するといわれどうしたものかと考えております。 static Singleton* _instance = new Singleton(); と出来れば解決なのですが 「static const int データメンバ以外をクラス内で初期化することはできません」 とのことでそれもできず。 どのようにすればよいでしょうか。

  • singletonの使い方

    はじめまして。 singleton(GoF)で少し疑問に思ったところがありましたので、 アドバイスをいただけたらと思い質問させていただきます。 たとえば以下のようなプログラムですが、 ==form.html== <html> <body> <form action="./Main.php" method="post"> name:<br /> <input type="text" size="20" name="name" /><br /> text:<br /> <textarea rows="8" cols="40" name="text"></textarea><br /> <br /> <input type="submit" value="submit!" /> <input type="reset" value="reset!" /> </form> </body> </html> ==Main.php== <?php require_once "Data.php"; require_once "NullCheck.php"; $data =& Data::getInstance(); $data->setName($_POST["name"]); $data->setText($_POST["text"]); $nc = new NullCheck($data); $result = $nc->check(); if(!$result == ""){ echo $result; }else{ echo "ok"; } ?> ==Data.php== <?php class Data{ var $name; var $text; function &getInstance(){ static $instance; if(!isset($instance)){ $instance = new Data(); } return $instance; } function setName($name){ $this->name = $name; } function setText($text){ $this->text = $text; } function getName(){ return $this->name; } function getText(){ return $this->text; } } ?> ==NullCheck.php== <?php class NullCheck{ var $data; var $err = ""; function NullCheck($data){ $this->data = $data; } function check(){ if($this->data->getName() == ""){ $err .= "nameが空欄です。<br>"; } if($this->data->getText() == ""){ $err .= "textが空欄です。<br>"; } return $err; } } ?> 上記を作る際、 submitを押すたびにオブジェクトが作られるのは無駄だと思い、 singletonを使いました。 しかし、空欄チェックのときはnewでインスタンスを生成しています。 やはりこの場合もsingletonを使用したほうがいいのでしょうか? 仮にもっと複雑な問い合わせフォームを作成し、 利用者が多くなった場合、 いろいろとインスタンス化(空欄チェックや文字列チェック等)すると オブジェクトがたくさんできてしまい負荷がかかるで、 できる限り不必要なインスタンス化は避けたいと思っています。 長々と書いてしまい申し訳ありませんが、 なにとぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • singletonによるインターフェイスの実装

    Java勉強中の初心者です。 標題の件についてお願いします。 以下、簡単に条件を説明させていただきます。 Aクラス = メインクラス Bクラス = インターフェイスクラス Cクラス = DとEを動的に生成するクラス Dクラス = インターフェイスを実装するクラス Eクラス = インターフェイスを実装するクラス AクラスにB.getInstance(name)があります。 for文の無限ループがあります。 Cクラス class C { public static B getInstance(String name) { // Aクラスのaと変数nameが比較して一致したら // Dクラスのインスタンス生成 // 一致しなかったらEクラスのインスタンス生成 if(A.a.equals(name)){ return D.getInstance(); }else{ return E.getInstance(); } } } Dクラス class D implements B{ private D() { } public static D getInstance() { D d = new D(); return d; } // インターフェイスでのメソッド省略します。 } Eクラス class E implements B{ private E() { } public static E getInstance() { E e = new E(); return e; } // インターフェイスでのメソッド省略します。 } この条件の時にnewするたびにインスタンスが 生成されてしまいます。 インスタンスの生成が一度だけしか 生成されないようにするには、C,D,Eクラスで どのように記述すればいいか悩んでいます。 (骨組みは書けましたが) クラスを簡単に省略してわかりづらいと 思いますがよろしくお願いします。

    • ベストアンサー
    • Java
  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • singletonパターン

    デザインパターンを勉強しているのですが、一つ気になっていることがあります。singletonパターンを使うとき、staticなメソッドgetInstance();で、唯一のインスタンスを得る場合、コードは Singleton obj1 = Singleton.getInstance(); となります。ここで疑問に思ったんですが、あるメソッドを使う場合、 instance名.method();という具合に記述されるんですが、この場合、 class名.method();となっています。メソッドを使うときって、class名.method();でも大丈夫なんですか?質問文がわかりにくいかもしれませんがどうぞよろしくお願いします。

    • ベストアンサー
    • Java
  • シングルトン内で使用したオブジェクトのGC

    基本的な質問で恐縮ですがGCについて教えてください。 例えば、シングルトンインスタンス内のhogemethodメソッドにてHashMapのインスタンスを 生成・使用した場合(以下の質問に続く)、 【質問】 hogemethodメソッドが終わればHashMapのインスタンスはスコープを外れるので、hogeMap = null;などしなくてもGC対象となり、そのうちGCされるのでしょうか?いやいや、hogeMap = null; することによりGC対象となり、そのうちGCされるのでしょうか?それとも、nullセットしようがしまいが、シングルトンのインスタンスが存在し続ける限りGC対象とはなってもGCされることは無いのでしょうか? package hoge; public class MySingleton {  private static MySingleton instance = new MySingleton();  private MySingleton() {}  public static MySingleton getInstance() {   return instance;  }  public void hogemethod() {   HashMap hogeMap = new HashMap();   hogeMap .put("りんご", "apple");   hogeMap .put("ぶどう", "grapes");     :   hogeMap = null; ←★hogeMap をGC対象にするためにはnull代入は必要なのか?  } } よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう