アシアル株式会社主催 開発者向け、一歩先をいくためのテクニカルセミナー

<< 最初の要素で配列を作る必要性を教え... 質問一覧 複数のファイルが読み終わったら実行... >>

  • 0P
メンバ変数の参照について

お世話になります。
PHP初心者です。

メンバ変数の参照について教えて下さい。
今以下のようなclassを作成し、下記①と②で
printで値を表示しています。

①は表示されるのですが、②は空で表示されてしまい
値が取得できていません。

変数***に代入しbbbでglobal ***とすると②でも
表示できました。
同様のことをget、setを用意し行いたいのですが、
どこが間違っているのでしょうか?

オブジェクト言語の経験がつたない為、初歩的な
質問かと思いますが、ご指摘よろしくお願い致します。


//--- index.php ------------------------

$aaa = new aaa();
$aaa = setaaa("あああ")
print $aaa->getaaa();      -----①
$bbb = new bbb()
$bbb->exebbb()

//--- aaa.php --------------------------

class aaa{
var $aaa;

function aaa()
{
}

// 値を設定
function setaaa($aaa)
{
$this->aaa = $aaa;
}

// 値を取得
function getaaa()
{
return $this->aaa;
}
}

//--- bbb.php --------------------------
class bbb{
function bbb()
{
}

function exebbb()
{
$_aaa = new aaa();
print $aaa->getaaa();    ------②
}
}

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。

Qメンバ変数の参照について tsd844u  [02月03日 17時40分] 
┣満開Re:メンバ変数の参照について shimix  [02月03日 18時12分] 
┃┗Re:Re:メンバ変数の参照について tsd844u  [02月04日 11時42分] 
┗Re:メンバ変数の参照について magicflute2  [02月03日 19時27分] 
  ┗Re:Re:メンバ変数の参照について tsd844u  [02月04日 11時45分] 

コメント一覧

並び替え( ツリー順 / 投稿順[降順] / 投稿順[昇順]

Re:メンバ変数の参照について

extbbの中でnewした$aaaは元の$aaaとは(変数の名前は同じでも)別のものです。

  1. $aaa = new aaa();
  2. $aaa->setaaa("あああ");
  3. $bbb = new bbb();
  4. $bbb->exebbb();
  5. print $aaa->getaaa();
として、class bbb内のextbbb()で
  1. function exebbb() {
  2.   $aaa = new aaa();
  3.   $aaa->setaaa("いいい");
  4.   print $aaa->getaaa();
  5. }
とすればわかると思います。両方の$aaaは違うもの指しています。これが同じものを指すようだとclass内での変数の命名が大変なことになってしまいます。


class云々以前にfunctionでも変数のスコープを意識しないとマズイと思いますけど・・。functionでも(global宣言を書かなければ)local変数です。

  http://www.php.net/manual/ja/language.variables.scope.php



(蛇足)
それにしても本当にこのソースで試されているんでしょうか?

  $aaa = setaaa("あああ")

とりあえず$aaa->setaaa("あああ");の意味だと捉えましたが(汗

Re:Re:メンバ変数の参照について

返信ありがとうございます。

>extbbの中でnewした$aaaは元の$aaaとは(変数の名前は同じでも)別のものです。

そうなのですね。変数名が同じであれば、次にnewするまでは、set値は保持されて
いるのかと思っていました。
異なるclass間で値を共有する場合は、global変数を使用するものなのでしょうか?


>class云々以前にfunctionでも変数のスコープを意識しないとマズイと思いますけど・・。functionでも(global宣言を書かなけれ>ば)local変数です。

了解です。参照渡しといったことが理解できてないです。
参考にさせていただきます。

>それにしても本当にこのソースで試されているんでしょうか?
実際の実行しているものとは異なります。
既存のソースがあり、やりたいことだけ書き換えたものでした。

お手数お掛けしました。

回答ありがとうございました。

Re:メンバ変数の参照について

  1. <?php
  2. // _ があるけど?
  3. $_aaa = new aaa();

PHP4のクラスは何かと不自由。
PHP4は忘れて、PHP5で学んだ方がいいと思う。

  1. <?php
  2. /**
  3.  * Aaa Class for PHP5
  4.  *
  5.  */
  6. class Aaa
  7. {
  8.   private $_vars;
  9.   // コンストラクタ
  10.   public function __construct()
  11.   {}
  12.   // 値を設定
  13.   public function setValue($str)
  14.   {
  15.     $this->_vars = $str;
  16.   }
  17.   // 値を取得
  18.   public function getValue()
  19.   {
  20.     return $this->_vars;
  21.   }
  22. }
  23.  
  24. // Error、Warningが発生したら表示する
  25. error_reporting(E_ALL);
  26. ini_set("display_errors"1);
  27. // 
  28. $a = new Aaa;
  29. $_a->setValue('xxx')// Notice: Undefined variable: _a
  30. echo $a->getValue();

以下も参考に。
[コーディング規約]
http://www.phppro.jp/phpmanual/pear/standards.html
http://framework.zend.com/manual/ja/coding-standard.coding-style.html

Re:Re:メンバ変数の参照について

回答ありがとうございました。

PHP4で動いているものがありそれをいじくりながら勉強している
ところです。
PHP5になるといろいろ変わってくるんですね。

書き方についても一つ一つ調べながらといった状況です。
参考にさせていただきます。
最初の要素で配列を作る必要性を教え... 質問一覧 複数のファイルが読み終わったら実行...