$obj->varの変数のアクセスの仕方

このQ&Aのポイント
  • $obj->varの変数のアクセス方法を教えてください。
  • php5で$objMyClassというオブジェクトを作成し、$objMyClass->varという変数が定義されているようですが、アクセスの方法がわかりません。
  • zendFrameWorkでは、$authNamespaceというZend_Session_Namespaceオブジェクトの$userプロパティを設定すると、$_SESSION['Zend_Auth']['user']に値が設定されるようです。同じような実装をしたいので、方法を教えてください。
回答を見る
  • ベストアンサー

$obj->varの変数のアクセスの仕方。

php5で、 $objMyClass = new MyClass(); $objMyClass->var // varは任意で、実際は何でもよい。 print_r($objMyClass); として見たら、varという変数が$objMyClassに定義されているようなのですが、この変数へのアクセスをどうやったらいいのかわかりません。 教えてください。 と、言いますのは、zendFrameWorkでは、 http://framework.zend.com/manual/ja/zend.session.basic_usage.html $authNamespace = new Zend_Session_Namespace('Zend_Auth'); $authNamespace->user = "myusername"; とすると、 $_SESSION['Zend_Auth']['user'] = "myusername"; と同じ結果になるようなのです。 これは"user"を、Zend_Session_Namespaceクラス内で、 $_SESSION['Zend_Auth']の後ろにくっつけて多次元配列化しているんですよね? これと同じ実装をしたいと思っています。 もしかして何か勘違いしてますでしょうか?

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

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

  • ベストアンサー
  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

マジックメソッド __call() を実装しているかしていないかの差 もしくは、class定義するときに、メンバ変数で class MyClass { public $var; } としている必要性がある。 ここから個人的な意見 class内のメンバ変数をやたらめったら外から直接叩けるようにしてしまうのはあまりよろしくない。 例えば、class内で varという変数をつかっていたとする。 なーんも考えないでアホみたいに、 public public・・・ と厳密な意味も理解せずに呪文のようにとなえていると。なんのためのメンバ変数か分からなくなる。 Zend_Session_Namespace のように単にデータをクランプしているだけであればそういう使い方もないわけじゃないが、一般的に作るclassのほとんどが何かしらの処理を行うためのもの。 例えば、var は MyClass内でのみしか使ってはいけないのにもかかわらず。 class MyClass{ public $var; public function setVar($var){ $this->var = $var; } public function getVar(){ return $this->var + 1; } } という作り方をした場合、外部から $obj = new MyClass(); $obj->setVar(1); $obj->var = 'かきくけこ'; と出来てしまう。 そうすると、 print $obj->getVar(); は全く期待していない値が返ってくることになる。 もし、何人かでシステムを組んでいるときに、このような事が出来てしまっては、非常に発見しにくいバグを生む。

dalianse
質問者

お礼

zend Frameworkをダウンロードして読んだところ、__set()を使って実装してました。 public function __set($name, $value) 略… $name = (string) $name; $_SESSION[$this->_namespace][$name] = $value; public $var;として、 $obj->var = 'かきくけこ'; とできてしまうのは、カプセル化できていないという問題ですよね? 詳しいご回答ありがとうございました。

関連するQ&A

  • ZendFrameworlkでZend_Sessionがつかえません

    表題の通り、Zend_Sessionが使えません。 $session = new Zend_Session_Namespace('global'); と記述すると、下のエラーがでます。インスタンスを生成する部分を除けば 正常に動作し、他のZendFrameworlkコンポーネントは使える状態です。同じソースでもレンタルサーバ上では思い通りに動くので私のローカル環境の設定がおかしいと思うのですが、何を見たらいいでしょうか。 環境はWindowsVista、Apache 2.2.6、PHP 5.2.4(xampp)、ZendFramework1.0.3です。 Fatal error: Uncaught exception 'Zend_Session_Exception' with message 'Session must be started before any output has been sent to the browser; output started in C:\xampp\htdocs\index.php/1' in C:\xampp\ZendFramework\library\Zend\Session.php:359 Stack trace: #0 C:\xampp\ZendFramework\library\Zend\Session\Namespace.php(116): Zend_Session::start(true) #1 C:\xampp\htdocs\index.php(22): Zend_Session_Namespace->__construct('global') #2 {main} thrown in C:\xampp\ZendFramework\library\Zend\Session.php on line 359

    • ベストアンサー
    • PHP
  • セッション変数と配列

    通常の変数であれば、 $var = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); ですが、セッション変数を配列にするにはどうしたら良いのでしょう? (配列から取り出す方法も含め) $var = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); $_SESSION["$var"]; や $_SESSION["$var"] = array($_POST["var1"], $_POST["var2"], $_POST["var3"]); としてみましたが、ダメなんですね。 よろしくお願いいたします。 *PHPバージョンは5です

    • ベストアンサー
    • PHP
  • ZendFrameworkのindex.phpで

    【環境】 ZendFramework Version 1.11 PHP 5.3.8 ZendFrameworkの学習をしているのですが、見るサイトによってindex.phpが異なりそれらの違いが分かりません。 下記の3種類の実装はどのような違いが有り、どのようなときに使用するべきなのでしょうか? 1.Zend_Applicationのインスタンスを使用するもの $application = new Zend_Application( APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini' ); $application->bootstrap() ->run(); 2.Zend_Controller_Front::run()を使用するもの Zend_Controller_Front::run('../application/controllers'); 3.$front->dispatch();を使用するもの $front = Zend_Controller_Front::getInstance(); $front->setControllerDirectory('../application/controllers'); $front->dispatch();

    • ベストアンサー
    • PHP
  • コールバック中の変数操作

    表題のままですが、Ajaxコールバックの中から、外部の変数(オグジェクト)を操作するにはどうたら良いですか? // グローバルオブジェクト定義 function MyClass(){ this.myValue = 'foo'; } var myObj = new MyClass(); $.ajax({ url : '/hoge'; // 以降オプション省略 success : function(){ // ここで、myObj.myValue に 'hoge' を代入したいです } }); コールバックの中で、this.myObj.myValue = 'hoge'; とはできないですよね? よろしくお願いします。

    • ベストアンサー
    • AJAX
  • C# 配列のスタックは可能でしょうか?

    C# でスタックは、次のように実装されます Stack<int> _Stack = new Stack<int>(); この場合、_Stack は、1次元のデータです。 これが、2次元配列、多次元配列でもスタックを実装することが可能でしょうか? 可能ならば実装方法もおしえていただければ幸いです。

  • Zend Frameworkが機能しなくて

    困っています。 Fedora11にZendFrameworkをDLして解凍して /usr/local/ZendFramework-1.9.3PL1 として入れました。 /etc/php.ini: ......... include_path = ".:/usr/local/ZendFramework-1.9.3PL1/library" ......... と設定し /etc/httpd/conf/httpd.conf: ......... LoadModule rewrite_module modules/mod_rewrite.so ......... <Directory "/var/www/html/zend/public"> AllowOverride All </Directory> と設定し /var/www/html/zend/public/.htacess: RewriteEngine on RewriteBase / RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php と設定し /var/www/html/zend/public/index.php: <?php require_once 'Zend/Version.php'; echo Zend_Version::VERSION; とし #service httpd restart とアパッチを実行し Firefoxブラウザのアドレス欄に http://localhost/index.php を入力しアクセスしたところブラウザに Not Found The requested URL /index.php was not found on this server. Apache/2.2.13 (Fedora) Server at localhost Port 80 と404エラーがでます。 ちなみに http://localhost/zend/public/index.php にアクセスすれば 1.9.3PL1 が問題なく表示されます。 しかしこれではZendフレームワークでWebアプリを組めません。 どうすれば解決できるでしょうか?

    • ベストアンサー
    • PHP
  • 文字列のメンバ変数を外部変数のように扱いたい

    済みません。質問なのですが、 メンバ変数を外部変数のように扱うにはどうしたらよいのでしょうか? int型などの場合、 class test{ static const int a; }; const int test::a = 10; とすればよいですよね? これをcharの配列にして class test{ static char a[7][32]; }; char test::a[0] = "test"; とすると サイズが0の配列を割り当てまたは宣言しようとしました というコンパイルエラーがでてしまいます…。 多次元配列の場合はstatic変数としてもてないのでしょうか? char** として宣言してもどこでnewを行えばよいか解りません。 コンストラクタの中で行えば そこでstaticではなくなってしまいますし…。 後、できればstringクラスの配列で持ちたいのですが #include <string> class test{ static string test[7]; }; string test::test[0] = "aaa"; なんてことができますでしょうか? 質問内容が解りにくいかも知れませんが どうか教えてください。 宜しくお願いいたします。

  • PHP4で、メンバ変数の値を忘れてしまう2

    PHP4での質問です。 前の質問がわかりにくかったので、書き直しました。 オブジェクト指向的にいかがなものかとは思いますが、オブジェクトのメンバ変数を直接外部から変更したいと思います。 ---------<a.php>---------- class myClass {   var member = 0; } ---------<b.php>---------- $ary_c = array(); for ($i=0; $i<10; $i++) {   $c = new myClass();   $c->member = 1;   echo "(1)c->member=".$c->member;   array_push($ary_c, $c); } foreach ($ary_c as $c) {   echo "(2)c->member=".$c->member; } ------------------------------ 以上の様なソースで、(1)のデバッグライトでは、メンバ変数memberの値は1であるのに、(2)のデバッグライトでは、0になってしまいます。 この原因がお分かりのかた、もしよろしければ知恵をお貸し下さい。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのセッション変数 絞り込み検索

    PHP Version 5.1.6 flash actionscript2.0 最初の検索条件をセッション変数['first']に保存し、 (GETにより、種別を判断しています。 ~~/index.php?kind=A&value=1という形) 絞込検索時(値はページ内のチェックボックスからPOSTで受け取り、hiddenタグで、type=newを受け取ります。)に 最初の検索条件をセッション変数['first']から取り出すようにしています。 また絞り込み検索時でなければ、とりあえずいったん保存用の セッション変数['first']を初期化しています。 ここで、ページ内にフラッシュのNEWというボタンがあり、その中に var kind = "new"; get_URL("http://~~/index.php", "_blank","GET"); とだけ記述して、ページへkind=newという検索種別を渡すように しているのですが、挙動がおかしくなる場合があります。 [正常な動きをする場合] 1、ページ内のNEWのフラッシュボタンを押す。 予想通りの最初の検索ができる。 (この時点で、セッション変数['first']に"new"が入っているのは 確認済みです。) 2、ページ内のチェックボックスで、絞込み検索をかける。 予想通り、最初の検索条件+絞り込み条件を加えた検索ができる。 [異常な動きをする場合] 1、ページ内のリンクから最初の検索をする。 (~/index.php?kind=A&value=1)を押す。 (この時点で、セッション変数['first']に"A"が入っているのは 確認済みです。) 2、ページ内のチェックボックスで、絞込み検索をかける。 予想通り、最初の検索条件+絞り込み条件を加えた検索ができる。 3、ページ内のフラッシュのNEWボタンを押す。 予想通り、再度別条件での検索ができる。 4、ページ内のチェックボックスで、絞込み検索をかける。 なぜか、セッション変数['first']に、"A"が入ったままになっている。 よって、2の検索に変わってしまう。 ただし、このフラッシュボタンからではなく、たとえば ~/index.php?kind=new というGETで送るタイプのリンクからでは、予想通りの動きをします。 このあたりの挙動につきまして、ご教授いただければ幸いです。 下記コードです。(処理に関係ない部分は省略しております。) session_start(); session_register("first"); //パラメータを受ける。 //絞込検索でなければ、セッション変数を初期化 if($_REQUEST['kind'] != "more") { unset($_SESSION['first']; } switch($_REQUEST['kind']){ case "A": $_SESSION['first']= "A"; break; case "new": $_SESSION['first']= "new"; break; //絞込み検索 case "more": break; }

    • 締切済み
    • PHP
  • 二次元配列に値をセットしたいんですが

    ASP(html)での変数をJavaScriptに渡して 二次元配列を作成したいのですが、どうもうまくいきません。 どなたか、ご教授願います。 サンプル 変数:strFact = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" -------------------JavaScript strFact_WK = <%=strFact %>  ※1 var test = new Array(); var rows = strFact_WK.split("/"); for( var i in rows) { test.push(new Array()); var cols = rows[i].split(","); for( var j in cols) { test[i].push(cols[j]); } } ---------------------- 当然ですが、 ※1の所で strFact_wk = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" とすると作成されます。

専門家に質問してみよう