[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 メーリングリストの案内