[PHP-users 34093] Re: クラス オブジェクト の取扱いについて

KOYAMA Tetsuji koyama @ hoge.org
2008年 10月 21日 (火) 21:21:48 JST


小山です。

2008/10/21 WAKITA, Yoshi <ysh @ wakita.no-ip.com>:
>  わきた と申します。 余りにも初歩的で恐縮しますが ・・・
> PHP におけるクラスオブジェクトの扱いについて質問させて頂きます。
> PHP では型を指定しての宣言、例えばC風な下記のような変数宣言(オブジェ
> クト確保)はできないものと理解しています。
>        int     $i;
>        char    $c;
> ということは、あるクラス宣言 cClass があったとして、
>        class   cClass{
>        ・・・
>        }
> 下記のようなクラスオブジェクト宣言(確保)もできないのだと思います。
>        cClass  $cc;

PHP は型指定のない言語なので、そもそも型を指定した変数宣言
はできません。

> PHP でクラスオブジェクトを確保するときは、必ず new を使って、
>        $cc =new cClass();      // ・・・(1)
> としなくてはならない・・・

そうですね。

> ここまでの私の理解が正しいとすれば、PHP でクラスオブジェクト(のメンバ
> 変数/関数)を扱う際には、必ず -> 演算子を使わなくてはならないということ
> でしょうか?

オブジェクト(インスタンス) のメソッド(メンバ関数)や
プロパティ(メンバ変数) に対しては、基本的にはおっしゃる通り
-> を使います。メソッド内でも $this の省略はできないので

class cClass {
  public function a() {
  }
  public function b() {
    $this->a();
  }
}

のように、同一オブジェクトのメソッドを呼び出す場合も -> が
必要です。

ただ必ず -> を使わなければ絶対にダメかというとそういうことはなく、

$obj = new cClass;
call_user_func(array($obj, 'a'));

という呼び出し方もできます。裏技的ですけが。

> またこの場合、上記(1)で new によって $cc に格納される実体は、C++ な
> どと同様に「ポインタ」と解釈するべきですか? それとも、(PHP には「ポイ
> ンタ」という語が出てきませんので)「参照」と解釈すべきでしょうか?

そのどちらでもありません。PHP は C++ ほど実際のメモリ空間が
透けて見える仕組みにはなっていません。C++ のポインタと参照は
どちらも、メモリアドレスに少し言語的な皮をかぶせたものと言えますが、
PHP の場合は基本的にメモリモデルをユーザに見せないように
なっています。

最終的には、PHPの内部でその変数に相当するメモリが確保される
のは確かにその通りですが、変数を操作した際にメモリ空間そのもの
がコピーされるかどうかは、PHP の文法的に自然になるように
調整されて処理されています。

この辺のことは、アシアルの森川さんが詳しい記事を書かれていります。

http://www.phppro.jp/news/304

あまり C++ のパラダイムに囚われ過ぎると、PHP の良さを理解できません。
一度 C++ のことは頭から全部追い出して、PHP を触ってみては
いかがでしょうか?

-- 
    小山哲志@ビート・クラフト
    koyama @ beatcraft.com
    koyama @ hoge.org


PHP-users メーリングリストの案内