ようこそゲストさん

CPA-LABテクニカル

2008/01/26(土) はじめに-PHP変数管理解説(1)-参照と値渡しの明確な理解のために

PHPの参照はおかしいか?

「PHP5からオブジェクトは参照渡しに変更になった」というのはウソである。PHP4からPHP5への以降は、PHPで混乱している「参照」という用語を統一するせっかくのチャンスであったのに、PHPコミュニティ(又はZEND社)は重大な過ちを犯した。同じreference(s)という言葉を使っても、「シンボルテーブルを使った参照」と、(C言語のような)「ポインタを利用した参照」は、その原理も使い方も全く異なるのに、同じ「参照」という言葉を使ったがために、大きな混乱を呼んでいるように思う。

このカテゴリの記事について

この連載は、PHPの変数管理、特に参照代入と値渡し(コピー)代入の不十分な理解に基づく混乱を少しでも収束させるために書いた。実際は、自分自身がわからなくて、改めて調べ直したものである。言葉遣いは偉そうだが、これは簡潔に書くためであって、決して偉ぶっているわけでも、その道のプロであるわけでもない。

前口上

PHPの変数は柔軟である。型を明確に宣言せずとも自由に使え、メモリ管理も完全に任せておける。プロになればなるほど、型の明確な区別がないことを嫌がる人もいるが、やはりこの点はPHPの明確な利
点と思う。
調べて改めてわかったことは、PHPの変数管理はすばらしい、ということだ。一方で、PHPの変数管理方法が若干複雑なこともあり、それでいて、ネット上(あるいは書籍でも)にはまとまって解説している記事は少ない。さらに、PHPの「参照」という言葉が混乱して使用されており、それが誤解に拍車をかけていると思われる。

この連載の予定

この連載では、
  1. 2つ以上の変数が、完全に連動する「参照」---オブジェクト以外の変数管理方法
  2. ポインタを利用する「参照」----PHP5でのオブジェクトの管理方法
の違いを明確して、
  1. 変数、配列とオブジェクトのPHP内部での管理方法
  2. オブジェクトの参照渡しと、オブジェクト以外の変数の参照渡しの違い
  3. グローバル変数、スタティック変数での参照渡しの挙動
を明らかにしたい。
しかし、全体像を確定しないまま書いているため、これらの項目は変更になるかもしれない。

PHPのバージョンについて

なお、基本的にPHP5.2以上について述べているが、オブジェクト以外については、PHP4,PHP5とも変わるところはない。オブジェクトについては、PHP4とPHP5で、その管理方法は異なるが、PHP4は、2007年12月でセキュリティ関係以外のサポートが終了するため、PHP5を中心とし、PHP4については軽く触れるだけにしたい。(今後PHP4の利用者は減少していくだろうが、それは好ましいことである。PHP4とPHP5では、段違いにPHP5のほうが使いやすいからだ。以前によく言われていたPHP5の欠点、バグが多い、スピードが遅い、という点は、すでに解消されている。)

内容について

私はプロのプログラマーでなく、誤った点もあろうかと思う。その点はぜひご指摘いただければ、きっとそっと直してしまうだろう(笑)。
ただし、わかりやすさ優先のため、詳細については、わざと省いた点もある。これが逆に誤解や(あるいは私の根本からの誤りかもしれないが)、さらなる不十分な理解を招いたとすれば私の責任である。ぜひ、もっとこう説明すべき、事実関係を誤っている、というのがあればご意見いただければ幸いである。

目次と今後の予定

  1. はじめに(この記事)
  2. PHPの変数管理(メモリ管理)の基礎
  3. 変数の代入は、値のコピーにあらず
  4. issetを正しく理解する。null値とunsetの違い-PHP変数管理
  5. PHPの配列管理方法を正しく理解する-ハッシュテーブルとZval
  6. PHPの配列上限数-PHP変数管理
(今後の予定)
一般の値の代入、配列の管理、オブジェクトの管理、グローバル変数の管理、スタティック変数の管理

参考書籍、参考ウェブサイト

この執筆には多くのWEBコンテンツ、書籍を参考にさせていただいた。それぞれのコンテンツの詳細はすばらしく、私には目から鱗が落ちるものがほとんどだった。以下は、参考にした主なコンテンツである。
一方で、部分的にはすばらしくとも、基本的なことを網羅しているかどうか、という点では、どのコンテンツも不十分なものだった。
この連載は、そうした「基本」についての網羅的な情報を掲載できればと思う。
  1. php architect-References in PHP An In-Depth Look by Derick Rethans(英語)
    参照代入と一般代入について、実に簡潔に説明している。私が理想とするコンテンツに最も近いものである。しかし、static宣言について触れておらず、そこが惜しい。
  2. Re: References with 'new' operator?
    「オブジェクトの参照について」上の著者が読者の質問に答えたもの。
  3. How to Manage Memory in PHP
    「PHPのメモリ管理全般について」多少マニアックです。
  4. 言語リファレンス
    PHPマニュアルを熟読するのは必須でしょう。しかし大切なことがさらっと書いてある傾向があり、深読みするのは難しい。
  5. ほでなすPHP ホーム > プロジェクトP > PHPの基本 > クラス
    様々なコード実験を掲載されており、大変参考になりました。
  6. PHPプロ-Zend API: PHP のコアをハックする
    C言語&マクロにてPHPのエクステンションを作成方法をまとめている。すべてはわからなくとも、データの並び方などが参考になります。
  7. phpにおけるオブジェクト試行「的」機能の特徴
    辛口ですが、変数、関数管理の概念図がわかりやすいです。
  8. [PHPプロ! PHPでの内部変数の扱われ方 - PHP5のオブジェクトコピーでありがちな勘違い]
  9. パネルディスカッション ll とオブジェクト指向について
    2003年のもののようですが、ruby,phyton等のオブジェクト指向の概略や、当時のPHPの扱いなどが興味深いです。
  10. PHP5.3/6.0で参照カウンタを操作するマクロが変更されている件
  11. php.ini-recommendedで、variables_orderがGPCSである理由と、PHP5のauto_globals_jit

1: hashi 2008年05月21日(水) 午後0時37分

PHPの何が嫌いって、変数管理がわかりずらいとこでした。この記事で大分すっきりしました。

2: ookami 2010年12月14日(火) 深夜0時52分

このウェブサイトも役に立つと思うよ
使ってみよう
http://bbs.flatworld.jp/forum/65

3: taka_taka 2012年07月30日(月) 午前7時26分

参考になります。助かりました。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/032/tb/