PHP マニュアル オブジェクト 指 向 入 門 編 1.オブジェクト 指 向 の 概 要 なぜオブジェクト 指 向 は 難 しいのか 難 しいのは 当 然 すぎる から 実 は 不 自 然 だった 手 続 き 指 向 アクセス 制 御 が 不 可 欠 メッセージ パッシングとは 何 か 関 数 呼 び 出 しとメッセージ パッシングの 違 い オブジェクトとクラスの 違 い 2.オブジェクト 指 向 プログラミング クラス オブジェクト インスタンス 化 コンストラクタ デストラクタ アクセス 修 飾 子 ゲッダメソッド セッダメソッド 静 的 メソッド クラス 内 定 数 継 承 parent 命 令 final 修 飾 子 ポリモーフィズム 抽 象 メソッド インターフェス 3.PHP5 独 自 のオブジェクト 構 文 autoload 関 数 call メソッド get, set メソッド 4.Apache との 連 携.htaccess http.conf の AllowOverride ディレクティブを"All"に 設 定.htaccess ファイルで 設 定 可 能 なパラメータは 決 まっている 1
1.オブジェクト 指 向 の 概 要 オブジェクト 指 向 は 分 かりにくい 登 場 から 30 年 以 上 経 っても 未 だにオブジェクト 指 向 に 対 する 敷 居 は 高 いま まです ここではオブジェクト 指 向 について 考 えていきたいと 思 います 今 や IT 関 連 製 品 や 技 術 は オブジェクト 指 向 抜 きには 語 れないと 言 ってよいほど 普 及 し 一 般 的 になっています Java や C++をはじめとするプログラミング 言 語 に 及 ばず パソコンのユーザー インターフェースは ひとつひとつのプログラムをアイコンで 表 し 直 感 的 な 操 作 を 可 能 にする GUI(グラフィカル ユーザー インタフェース)が 主 流 です GUI は 言 うまでもなくオブジェクト 指 向 の 考 え 方 で 作 られたものです そもそもオブジェクト 指 向 について 正 確 に 解 説 すると プログラムの 構 造 をオブジェクト 群 の 相 互 作 用 とその 雛 形 であるクラス 群 の 関 係 として 捉 え 相 互 にメッセージを 送 りあう オブジェクトの 集 まりとしてプログラムを 構 成 する 技 法 のことを 指 します とあるように 非 常 に 説 明 しずらくわかりずらいものとなっています このオブジェクト 指 向 を 取 り 入 れたプログラミング 言 語 はオブジェクト 指 向 プログラミング 言 語 と 呼 ばれ これらの 言 語 ではクラスとその 継 承 な どの 仕 組 みを 利 用 することで 開 発 効 率 を 高 められるようになっています オブジェクト 指 向 構 文 は 今 となっては 開 発 現 場 ではあたりまえとなっていますが 習 得 するのはなかなか 難 しいのが 現 状 です 特 に 大 多 数 でシステム 構 築 す るような 複 雑 で 大 規 模 なものほどオブジェクト 指 向 という 考 え 方 はなくてはならなくなってきますので 習 得 するにはそ れなりの 時 間 がかかりますが 必 ず 習 得 してほしい 分 野 です 現 在 では C++ Java JavaScript Ruby PHP Perl な どほとんどの 開 発 現 場 でこのオブジェクト 指 向 という 考 え 方 を 元 にした 開 発 言 語 が 主 流 になってきています 今 やオ ブジェクト 指 向 は システム 開 発 における 共 通 の 土 台 となりつつある 考 え 方 です 逆 に 言 えば オブジェクト 指 向 の 考 え 方 を 習 得 することでこれらの 言 語 も 初 見 でもある 程 度 は 理 解 することが 可 能 となります 難 しいと 思 いますが 少 しづつでいいので 理 解 できるまで 何 度 もチャレンジしてくれることを 願 っています オブジェクト 指 向 の 概 要 では 実 際 の PHP でのコード 記 述 紹 介 のまえにオブジェクト 指 向 とはどういったものなのか ということを 現 実 世 界 のモノに 例 え 解 説 していきます 2
なぜオブジェクト 指 向 は 難 しいのか オブジェクト 指 向 の 難 しさはどこにあるのか よく 言 われるのは 耳 慣 れない 用 語 とオブジェクト 指 向 という 考 え 方 にあると 聞 きます オブジェクト 指 向 にはこれから 紹 介 する クラス オブジェクト 継 承 抽 象 化 メッセ ージ 振 る 舞 い などといった IT らしくない 言 葉 が 多 数 登 場 します これらの 言 葉 が 災 いして 慣 れない 人 から すれば なぜそんな 言 い 回 しをするのかと 不 思 議 と 思 うのが 当 然 です オブジェクト 指 向 の 定 義 も 実 はまちまちで オブジェクト 指 向 の 解 説 書 や オブジェクト 指 向 言 語 の 代 名 詞 でもある Java の 参 考 書 ですら 表 現 が 異 なっている ので 混 乱 するのも 当 然 といえば 当 然 です もしかしたら わざと 混 乱 させるためにこんなまわりくどい 言 い 回 しを つかっているんじゃないかと 疑 うこともあります そしてもう 一 点 従 来 の 手 法 ( 手 続 き 型 言 語 などの 非 オブジェクト 指 向 言 語 )になれたプログラマやエンジニアに とってオブジェクト 指 向 を 理 解 するには 180 度 異 なる 発 想 が 必 要 とされる 点 があるためです オブジェクト 指 向 が 登 場 する 以 前 は プロセッサが 行 うひとつひとつの 作 業 すなわち 手 続 き を 順 に 記 述 して 処 理 をこなしていく 方 法 しかなかったため この 考 え 方 でプログラムを 考 えてしまいオブジェクト 指 向 での 発 想 転 換 が 難 しいのです 難 しいのは 当 然 すぎる から では これらの 難 しさをどのように 乗 り 越 えていけばいいのか それには 用 語 やテクニックにとらわれることなく オブジェクト 指 向 の 根 本 的 な 考 え 方 を 理 解 するということがキーになってきます それができれば 最 初 から 苦 労 はしないのですが そこさえ 乗 り 越 えれば 様 々な 難 解 な 概 念 もおのずと 意 味 が 分 かり 実 際 のシステム 構 築 の 場 でも 生 きてきます その 意 味 でぜひ 覚 えておくべき 大 原 則 として オブジェクト 指 向 とは 人 間 にとってごく 自 然 な 考 え 方 というものがあります あなたも 自 分 にとって 当 たり 前 すぎることを 改 めて 問 いただされたら 答 えに 窮 する のではないでしょうか オブジェクト 指 向 が 難 しい 理 由 は オブジェクト 指 向 が 高 度 だからではなく オブジェクト 指 向 とは ソフトウェアを 人 間 にとって 扱 いやすいよう 現 実 の 物 事 になぞらえて 考 える 手 法 だからです 手 続 き 指 向 に 慣 れた あるいは 手 続 き 指 向 のシステムを 担 当 する 多 くの IT エンジニアにとっては このごく 自 然 な 考 え 方 を 理 解 することがかえって 難 しいのです 3
実 は 不 自 然 だった 手 続 き 指 向 でも 本 当 にオブジェクト 指 向 は 自 然 な 考 え 方 なのか? 手 続 き 指 向 でひとつひとつ 処 理 を 記 述 していった 方 が よっぽど 簡 単 だし 自 然 なような 気 がするけど こんなことを 思 っている 方 もいると 思 います 手 続 き 指 向 では プログラムに 対 してデータを 入 力 して 何 らかの 処 理 を 実 行 する つまりプログラム( 処 理 )とデータをまったく 別 物 として 扱 う 考 え 方 でした これはプログラム 上 だけの 話 ではなく 実 際 コンピュータの 中 ではプログラムとデータ を 物 理 的 に 異 なるメモリー 領 域 に 格 納 していることからも 伺 えます 注 目 してほしいのは コンピュータ 内 に 存 在 しているデータは 特 別 な 意 味 を 持 たず 単 なる 数 字 の 羅 列 (2 進 法 で 考 えて)に 過 ぎないということです 例 えば コンピュータの 中 に 1000 というデータが 存 在 するとします すると そのデータは 指 定 された 処 理 (プログラム) によっては 1000 円 にも 1000 個 にも 意 味 を 変 えます ところが 現 実 の 物 事 のあり 方 と 照 らし 合 わせてみると コンピュータ 流 の 方 式 は 極 めて 不 自 然 です なぜなら 現 実 の 世 界 では 1000 という 数 値 だけが 存 在 することはあり 得 ないからです 普 段 はあまり 意 識 したことがない かもしれませんが 必 ずデータには 固 有 の 意 味 があります 1000 円 1000 個 1000km 1000 人 といっ た 具 合 です そうして 考 えてみるとひとつの 疑 問 がわくと 思 います なぜコンピュータは こんな 方 式 でプログラムとデータを 分 離 して 管 理 しているのだろうか? と 答 えは 簡 単 で コンピュータ 内 部 の 処 理 が 手 続 き 指 向 だからです コン ピュータのプロセッサはメモリー 上 のプログラムを 順 番 に 読 み 込 みデータを 処 理 しています データにどんな 意 味 があるのかは 全 く 関 与 していません 加 えて 昔 のコンピュータでは 処 理 性 能 が 現 在 とは 桁 違 いに 低 かったため 貧 弱 なコンピュータ 資 源 を 有 効 活 用 するにはコンピュータが 最 も 処 理 のしやすい 形 態 つまり 手 続 き 指 向 でプログラ ムを 構 築 するしかなかったのです しかし 現 在 では 処 理 性 能 の 向 上 により 人 間 にとって 分 かりやすく 使 いやす いオブジェクト 指 向 という 考 え 方 が 浸 透 してきたというだけの 話 です そして 前 述 したようにデータが 固 有 の 意 味 を 持 つということは 同 時 にそのデータを 使 って 実 行 できる 処 理 も 必 然 的 に 決 まります 例 えば 1000 円 というお 金 をつかってできることは 代 金 を 支 払 う とか 両 替 する といったごく 限 られたことしかできません オブジェク ト 指 向 とは まさにこうした 現 実 と 同 じような 物 事 のありようを ソフトウェアで 実 現 しようという 試 みそのものなの です では どうすればモノのように 扱 えるソフトをつくれるのか 答 えを 言 えば 処 理 とデータをひとまとめのセットと して 扱 えばよいということです 具 体 的 には このデータとこの 処 理 はひとつでワンセットであるとプログラム 上 で 定 義 し 同 時 にデータへアクセスすることのできる 処 理 をこのワンセットのみに 限 定 します 例 えば 1000 円 と いうお 金 のデータを 表 現 したいとき 1000 というデータとそのデータがお 金 であるということを 前 提 にしたプログラ ムをひとつのセットとしてまとめます これで 単 なる 1000 というデータが 1000 円 というお 金 のデータに 固 定 でき ます これがオブジェクト 指 向 の 解 説 書 に 当 たり 前 のように 出 てくる 処 理 とデータの 一 体 化 と 同 じ 意 味 になりま す そしてこのデータの 意 味 を 固 定 した 処 理 をオブジェクト 指 向 ではメソッドと 名 付 け 1000 円 というデータを 属 性 (プロパティ)と 名 付 けただけのことなのです そしてここまで 説 明 してきたような 具 体 的 な 処 理 とデータをひとまと めのセットにしたものがオブジェクトにあたります 4
5
アクセス 制 御 が 不 可 欠 しかし 一 体 化 だけではまだ 不 十 分 です いくら データとメソッドを 一 体 化 してオブジェクトをつくった といっても それをつくったプログラマ 以 外 の 人 間 がその 作 法 に 従 わなければ 元 も 子 もないためです やろうと 思 えば オブ ジェクト 指 向 の 考 え 方 を 無 視 してデータを 直 接 参 照 したり 変 更 したりとオブジェクト 外 部 からやりたい 放 題 する 危 険 性 があります この 事 態 を 防 止 してオブジェクト 指 向 の 目 的 を 達 成 するためには 外 部 からのオブジェクト 内 部 へとつながる 自 由 なアクセスを 遮 断 しなければいけません そこで 設 けられたのがアクセス 制 御 です データアクセスの 入 り 口 を 制 御 して 属 性 にアクセスできるのはオブジェクトのなかのメソッドだけに 限 定 します そうすれば 外 部 から 属 性 を 参 照 したい 場 合 はオブジェクトのなかにあるメソッドを 介 してしかアクセスできなくなります 不 正 な 行 為 をしようと するプログラムがあればこのメソッドの 段 階 でアクセスをさせないようにすればいいのです 簡 単 にいえば 両 替 機 のなかのお 金 を 盗 まれないためにお 金 が 入 った 箱 に 鍵 をかけてなおかつ 偽 札 が 両 替 機 に 入 ってきたら 無 効 に する 機 能 がアクセス 制 御 にあたります オブジェクト 指 向 ではこのオブジェクト 内 のメソッド( 偽 札 防 止 機 能 がついた 両 替 機 能 )のことをインターフェース と 呼 びます また お 金 が 入 った 箱 がいくらはいっているのか 外 部 から 見 えないようにすることをオブジェクト 指 向 でも 現 実 世 界 と 同 じように 隠 蔽 (いんぺい) すると 呼 びます 現 実 世 界 にあるモノ( 両 替 機 )を 表 現 するための 一 体 化 と 隠 蔽 の 説 明 は 以 上 です 最 後 にこのような 一 体 化 と 隠 蔽 をそなえもたせること( 現 実 世 界 では 両 替 機 に 防 犯 機 能 をもたせること)をオブジェクト 指 向 では カプセル 化 と 呼 びます 6
メッセージ パッシングとは 何 か 現 実 のモノをソフトウェアに 置 き 換 える 際 にカプセル 化 という 名 の 防 犯 機 能 がいかに 重 要 かということをお 分 か りいただけたと 思 います では このオブジェクトに 何 らかの 処 理 を 実 行 させる( 両 替 機 に 実 際 のお 金 を 両 替 させ てもらう)ためにはどうすればいいのかをこれからお 話 します 話 は 簡 単 で 現 実 世 界 の 私 たちは 両 替 機 の 内 部 の 仕 組 みを 知 りません というか 両 替 機 をつくって 販 売 している 会 社 (この 場 合 はつくったプログラマにあたる)は 両 替 機 の 内 部 の 仕 組 みを 使 用 者 に 詳 しく 教 えません なぜなら 両 替 機 の 内 部 の 仕 組 みを 教 えてしまえば 仕 組 みの 隙 間 をついて 精 巧 な 偽 札 がつくれてしまうからです これで は 悪 用 してくださいと 言 っているのと 同 じです なんということでしょう 私 たちは 両 替 機 の 内 部 の 仕 組 みを 知 らず に 自 然 と 両 替 機 を 使 用 していたのです! 当 たり 前 ですが 私 たちが 両 替 機 に 対 して 知 っている 知 識 といえ ば 千 円 をいれれば 百 円 玉 が10 枚 返 却 口 からでてくるというごくあたりまえの 両 替 機 に 対 する 使 用 方 法 ぐらいの ものです なにをいれれば なにが 返 ってくるのか そう 最 初 になにを 両 替 機 に 入 れれば なにが 返 却 口 から 戻 ってくるのか 入 力 値 と 結 果 さえわかっていれば 詳 しい 内 容 ( 両 替 機 の 内 部 の 仕 組 み)など 知 ったことではないの です オブジェクト 指 向 も 同 じです 結 果 からいうと カプセル 化 されたオブジェクトの 中 身 など 知 ったことではないので す なにを 入 力 値 として 渡 せば なにが 結 果 として 返 ってくるのか それさえわかっていれば 処 理 の 内 容 を 知 らな くても 利 用 できます 最 低 限 必 要 な 知 識 としては 両 替 機 の 使 い 方 つまり オブジェクトの 使 い 方 だけなのです ここで 登 場 するのば 上 記 の 図 にあるメッセージ パッシングという 用 語 です メッセージ パッシングとやけに 格 好 付 けて 名 乗 っていますが 用 は 両 替 機 の 使 い 方 と 同 じ 意 味 なのです 例 え ば 5000 円 札 を 両 替 機 に 入 れると 1000 円 札 に 両 替 ボタンと 100 円 玉 に 両 替 ボタンが 押 せるようになります メッセージ パッシングでは これから 5000 円 札 を 入 れるので 100 円 玉 に 両 替 してください というメッセージを 両 替 機 につたえていると 考 えればなんのことはないのです 関 数 呼 び 出 しとメッセージ パッシングの 違 い 手 続 き 型 手 法 をつかったことがある 人 ならばなぜわざわざ 処 理 を 呼 び 出 すのに 関 数 呼 び 出 しという 用 語 がある にもかかわらず メッセージ パッシングなどという 新 しい 用 語 をもってくるんだと 卑 屈 になっている 方 がいるかもし れません それは そもそも 関 数 とオブジェクトのなかにある 処 理 は 動 きが 異 なっているので 同 じ 呼 び 名 では 混 乱 するため あえてメッセージ パッシング(または 単 にメッセージと 呼 ぶ)といった 具 合 に 分 けているのです そもそもデータという 観 点 から 見 ると 関 数 とオブジェクトではぜんぜん 扱 いが 異 なります そのため 関 数 では 関 数 呼 び 出 しと オブジェクトではメッセージ パッシングと 混 乱 を 避 けるために 呼 び 名 を 区 別 したというわけです かえってこれが 混 乱 の 元 になることもあるので 注 意 してください 関 数 とオブジェクトのデータの 扱 いに 関 する 違 いはオブジェクト 指 向 プログラミングの 章 で 解 説 していますのでそちらを 参 照 してください 7
オブジェクトとクラスの 違 い 先 ほどのメッセージ パッシングの 説 明 で カプセル 化 されたオブジェクトの 中 身 など 知 ったことではない と 言 いましたが オブジェクト 指 向 の 最 大 のメリットは プログラム 全 体 を 理 解 せずともプログラムを 書 けるという 点 で す 使 用 方 法 さえわかっていればいいだけなので オブジェクト 内 部 を 理 解 する 時 間 をそのまま 省 くことができま す これにより 開 発 スピードが 格 段 にあがるという 利 点 があります これはとくに 大 人 数 でシステムを 構 築 する 際 機 能 ごとに 分 業 が 可 能 になるということも 意 味 しています しかし 私 たちはあくまでもつくる 側 つまり 両 替 機 をつくって 販 売 している 会 社 の 技 術 者 なので 両 替 機 が 故 障 したり 新 しい 偽 札 防 止 機 能 を 追 加 してくれと 偉 い 人 に 命 令 されれば 両 替 機 の 中 身 に 機 能 追 加 したり あたらしくつくり 変 えることをしなければなりません あなたが 両 替 機 の 技 術 者 として 働 いていたとしましょう 偉 い 人 が 唐 突 に 明 日 までに 親 会 社 が 新 しくつくった 偽 札 防 止 機 能 を 急 遽 追 加 してくれ できなければクビだ と 通 告 されたとしたらどうでしょう あなたはまずなにをし ますか? すでに 出 来 上 がっている 実 際 の 両 替 機 (この 場 合 はオブジェクト)を 分 解 し 仕 組 みを 理 解 しようとする と 思 います しかし 両 替 機 の 偽 札 防 止 機 能 の 箇 所 は 外 注 で 他 の 会 社 の 技 術 者 がつくったものなので 仕 組 みがい まいち 理 解 できません しかも その 外 注 した 会 社 は 先 月 唐 突 に 倒 産 してしまい 連 絡 すらとれない 状 態 です 親 会 社 のお 高 くとまっている 技 術 者 が 親 切 に 教 えてくれるわけがない( 前 回 も 怒 鳴 りながら 電 話 口 にでてきたし な ) さて あなたはここでどう 行 動 にでますか? 1. 気 合 で 何 とかする 2.こっそりオリジナルの 偽 札 防 止 機 能 にすりかえる 3. 他 の 外 注 先 をいまから 探 す 4.コンビニでとらばーゆを 立 ち 読 みしてから 明 日 までに 辞 表 を 書 く 5.そういえば 納 品 されたものに 設 計 書 があったよな それをみれば もしかして あなたの 行 動 する 選 択 肢 として 答 えは5だと 願 っています そう ここでいう 設 計 書 こそオブジェクト 指 向 にあた るクラスになります クラスとはオブジェクトの 設 計 書 実 際 のモノである 両 替 機 を 文 面 に 抽 象 化 し 要 約 した 設 計 図 にあたるのです まとめ いままでのながれでクラスとはオブジェクトの 設 計 図 でオブジェクトはクラスをもとにつくられたプログラムとわか っていただけたと 思 います もう 少 し 噛 み 砕 いて 説 明 すると クラスとはオブジェクトの 特 徴 (どんな 性 質 があって どんな 動 きをするのか)をひとくくりにまとめたもので オブジェクトは 実 際 のモノとして 考 えてください 以 上 で 簡 単 ですが 現 実 世 界 の 例 を 用 いたオブジェクト 指 向 の 解 説 は 終 わりです 次 からは PHP の 文 法 をまじえたオブジェクト 指 向 編 へと 続 きます 難 しいと 思 いますが がんばりましょう 8
2.オブジェクト 指 向 プログラミング クラス クラスとは 一 般 に 関 数 の 集 合 体 として 定 義 されていますが 処 理 の 集 合 として 捉 えて 考 えた 場 合 関 数 と 比 べ データの 扱 いという 点 で 見 比 べてみるとその 違 いがよりわかりやすくなります 関 数 は 与 えられた 入 力 値 ( 引 数 ) を 元 にして 処 理 結 果 を 戻 り 値 として 出 力 するだけの 仕 組 みですが クラスまたはオブジェクトは 自 分 自 身 のなか にデータを 格 納 する 変 数 としての 役 割 もはたしています その 結 果 関 数 でのデータの 扱 いは データが 処 理 を 通 過 していくだけなのにたいして クラス オブジェクトではさらに 処 理 前 処 理 後 のデータを 内 部 で 保 持 してお くことが 可 能 になります プログラマは 必 要 に 応 じこの 値 を 取 り 出 して 再 度 利 用 することができるようになるわけで す 関 数 とクラスの 違 いは 以 上 です わかりやすく 下 記 にその 違 いをまとめてみました データを 保 持 データを 処 理 変 数 関 数 クラス オブジェクト オブジェクト クラスを 理 解 するうえで 重 要 になってくるのがオブジェクトです クラスとオブジェクトは 似 て 非 なるものです オ ブジェクトとはクラスを 元 にしてつくられたコピーを 指 します クラスでは データを 保 持 できる という 性 質 をもって いるため 複 数 の 処 理 でひとつのクラスにアクセスした 場 合 データの 上 書 き( 不 整 合 )を 引 き 起 こす 危 険 があり ます そのため 処 理 に 応 じクラスのコピーを 作 成 し そのコピーに 対 してアクセスすることが 考 えだされました 実 際 に 使 う 場 合 には まずクラス 本 体 には 手 を 加 えず オブジェクトと 呼 ばれるクラスのコピーを 作 成 しそれを 処 理 の 対 象 としてプログラムを 組 んでいきます 例 えばこんな 感 じ この 後 にも 紹 介 しますが クラス( 雛 形 / 設 計 図 )からオブジェクト( 実 際 のモノ)を 生 成 することをインスタンス 化 と 呼 びます 処 理 をする 場 合 クラスには 手 を 加 えずインスタンス 化 されたオブジェクトを 処 理 対 象 として 扱 います 下 の 図 の 場 合 インスタンスとはオブジェクトと 同 じ 意 味 になります 9
インスタンス 化 クラスのコピー(オブジェクト)を 生 成 することを インスタンス 化 といいます インスタンス 化 とは クラスを 扱 う ための 自 分 専 用 の 領 域 を 確 保 する 行 為 ともいえます PHP では( 他 の 言 語 でも 大 抵 は 同 意 です) クラスのイ ンスタンス 化 を 次 のように new 演 算 子 を 使 って 行 ないます また インスタンス 化 の 際 に 必 要 に 応 じて 初 期 化 の ためのデータを 引 き 渡 すことも 可 能 です $ 変 数 名 = new クラス 名 ([ 引 数,...]); 引 数 が 必 要 ない 場 合 でもカッコは 省 略 できない 点 に 注 意 してください インスタンス 化 したオブジェクトは $ 変 数 名 に 格 納 され 以 降 はこの 変 数 をオブジェクトとして 扱 うことになります また インスタンス 化 した 変 数 を オブジ ェクト 変 数 と 呼 称 します この 場 合 オブジェクト 変 数 のなかのクラスに 属 する 関 数 と 変 数 のことを メンバ 関 数 と メンバ 変 数 または メソッド と プロパティ と 呼 びます 処 理 の 適 応 戻 り 値 の 取 得 [ 戻 り 値 ] = $ 変 数 名 -> メソッド 名 ([ 引 数,...]); 値 の 参 照 代 入 $ 変 数 名 -> プロパティ 名 [ = 値 ]; コンストラクタ デストラクタ インスタンス 化 の 際 に 実 行 される 特 別 なメソッド(メンバ 関 数 )のことを コンストラクタと 呼 びます PHP4では クラス 名 と 同 名 のメソッドをコンストラクタと 見 なしていましたが PHP5からは construct という 統 一 名 を 採 用 しています もし クラスと 同 じ 名 前 のメソッドがクラス(オブジェクト) 内 に 存 在 する 場 合 には construct が 優 先 して 処 理 されます コンストラクタは インスタンス 化 のタイミングで 実 行 されるという 性 質 上 プロパティ(メンバ 変 数 )の 初 期 化 や クラスで 使 用 する 各 種 リソースの 初 期 化 といった 呼 び 出 されて 最 初 の 一 回 だけ 処 理 を 必 要 とす るものを 記 述 するのが 一 般 的 です 特 に 初 期 化 処 理 が 必 要 ない 場 合 は コンストラクタは 省 略 可 能 です コンストラクタとは 反 対 に オブジェクト(インスタンス)が 破 棄 されるタイミングで 実 行 されるのがデストラクタです デストラクタは PHP5 以 降 でのみ 利 用 可 能 で 統 一 名 として destruct を 採 用 しています デストラクタには ク ラス 内 で 使 用 したリソースを 破 棄 するなど 主 に 終 了 処 理 を 記 述 するのが 一 般 的 です PHP では Java と 同 じくメ モリの 解 放 などは 自 動 である 程 度 おこなってくれるので 使 用 頻 度 としてはコンストラクタより 多 くはみかけません 10
アクセス 修 飾 子 クラスを 理 解 するうえでもう 一 つ 重 要 な 概 念 となるのが アクセス 修 飾 子 です アクセス 修 飾 子 とは クラス 内 のメンバ 変 数 (プロパティ)やメンバ 関 数 (メソッド)に 対 するアクセスの 可 否 を 決 めるための 命 令 になります PHP5で 利 用 可 能 なアクセス 修 飾 子 アクセス 修 飾 子 概 要 public どこからでもアクセス 可 能 (デフォルト) protected 現 在 のクラスとサブクラスでのみアクセス 可 能 private 現 在 のクラス 内 部 でのみアクセス 可 能 アクセス 修 飾 子 を 省 略 した 場 合 そのメソッドとプロパティは public 扱 いと 見 なされ デフォルトでどこからでもア クセス 可 能 になります また PHP4ではプロパティを 定 義 するための var 命 令 がありましたが こちらも public 修 飾 子 と 同 様 の 意 味 であると 見 なされます これら 修 飾 子 として の 役 割 は クラス 内 部 の 機 能 をクラス 外 部 から 隠 蔽 することが 目 的 で 使 われます こうした 機 能 をオブジェクト 指 向 では カプセル 化 と 言 います ゲッダメソッド セッダメソッド クラス 内 の private 変 数 にアクセスするためのメソッドのことを アクセサメソッド(Accesor Method) と 総 称 しま す また get_ メソッドと set_ メソッドをそれぞれ ゲッタメソッド(Getter Method) セッタメソッド(Setter Method) と 呼 ぶこともあります public function get_プロパティ 名 (){ return $this -> プロパティ 名 ; public function set_プロパティ 名 (){ $this -> プロパティ 名 = 引 数 ; アクセス 修 飾 子 $this は 現 在 のクラスを 示 すための 命 令 で クラス 内 のメンバにアクセスするためには こ の$this を 介 して 行 う 必 要 があります アクセサメソッドの 名 前 は 一 般 的 に get_プロパティ 名 set_プロパティ 名 とするのが 慣 例 ですが 構 文 規 則 ではないので 必 ずしもこの 規 則 に 従 う 必 要 はありません get_メソッドが 定 義 された 場 合 にはプロパティは 読 み 取 り 専 用 に set_メソッドが 定 義 された 場 合 にはプロパティは 書 き 込 み 専 用 にな り ま す プ ロ パ テ ィ を 隠 蔽 し て ア ク セ サ メ ソ ッ ド を 介 し て 参 照 設 定 す る こ と で 読 み 書 きの 制 御 が 可 能 となる プロパティ 値 を 設 定 する 際 に 値 の 検 証 を 行 える プロパティ 値 を 参 照 する 際 に 値 の 加 工 を 行 える などのメリットがあります 11
静 的 メソッド クラスを 利 用 するにあたっては 必 ず インスタンス 化 を 行 い クラスのコピーを 生 成 する 必 要 があると 紹 介 し ましたが 例 外 的 に インスタンス 化 を 行 わなくても 利 用 できるメソッドがあります このようなメソッドのことを 静 的 メソッド と 言 います 静 的 メソッドを 定 義 するには メソッド 定 義 の 先 頭 に static 修 飾 子 を 付 加 するだけです MyClass.class.php class MyClass{ public static function triangle ($width, $height){ return $width * $height / 2; クラス 外 部 から 静 的 メソッドを 呼 び 出 すには 一 般 的 なメソッド プロパティを 呼 び 出 す -> 演 算 子 ではなく :: (スコープ) 演 算 子 を 使 用 します static.php require_once('myclass.class.php'); print(' 三 角 形 の 面 積 は'. MyClass::triangle(10,5). 'です<br>'); :: 演 算 子 を 利 用 することでオブジェクト 変 数 名 でなくクラス 名 から 直 接 的 にメソッドを 呼 び 出 すことが 可 能 となり ます ではなぜこのように インスタンス 化 を 必 要 とするメソッドとそうでないメソッドが 存 在 するのかというと それ は 外 部 から 与 えられた 値 を 処 理 し 出 力 するだけということだけをしているからです クラス 内 でプロパティとして データを 留 めることなくメソッドとしてだけ 処 理 し 呼 び 出 し 元 に 返 すだけのいわゆる 関 数 的 な 処 理 を 求 められてい るのでわざわざオブジェクトをつくらなくとも データの 上 書 き( 不 整 合 )が 発 生 しないためです そもそも 静 的 メソ ッドでは クラス 内 にプロパティ(データ)を 設 定 もとい 参 照 しようにもプロパティ 自 体 が 存 在 しないのでできませ ん こうなると $this 命 令 も 当 然 ながら 使 えません 12
クラス 内 定 数 クラス 内 定 数 とは その 名 の 通 り class ブロックの 中 で 定 義 された 定 数 のことです PHP5からは const 命 令 を 利 用 することでクラス 内 部 で 定 数 を 定 義 することができます class MyClass { const AUTHOR = ' 名 無 し'; print(' 著 者 名 :'. MyClass::AUTHOR); クラス 内 定 数 を 参 照 するには 静 的 メソッド 同 様 :: 演 算 子 を 使 います クラス 内 定 数 を 利 用 すると 特 定 のクラ スでしか 利 用 しない 定 数 をクラス 内 部 で 管 理 でき クラス 外 部 に 出 さなくて 済 むのでより 分 かりやすいコードを 記 述 することができます 13
継 承 継 承 とは クラスに 含 まれるプロパティやメソッドを 引 き 続 きながら 新 たな 機 能 を 追 加 したり 元 の 機 能 を 一 部 だ け 修 正 することができる 機 能 のことです 必 要 に 応 じ 元 になるクラスの 機 能 を 引 き 継 ぎつつ 機 能 追 加 変 更 など の 新 しいクラスをつくる 場 合 に 使 われます 継 承 の 際 基 になるクラスのことを スーパークラ ス( 親 クラス 基 底 クラス) と 呼 び 継 承 の 結 果 できたクラスのことを サブクラス( 子 クラス 派 生 クラス) と 呼 びます class サブクラス 名 extends スーパークラス 名 { サブクラスの 処 理 定 義 継 承 によりスーパークラスの 機 能 をサブクラスで 上 書 きすることを オーバーライド と 言 います オーバーライド されなかったスーパークラスのメソッドはサブクラスでもそのまま 引 き 継 がれ あたかも 自 分 自 身 で 定 義 したメソッ ドであるかのように 利 用 できます class MyClass { protected $data; public function construct($data) { $this->data = $data; public function showdata() { return ' 入 力 値 は '.$this->data.' です '; class MySubClass extends MyClass { public function showdata(){ return '*** 入 力 値 は '.$this->data.' です ***'; $obj=new MySubClass ('PEAR'); print($obj->showdata()); [ 出 力 ] *** 入 力 値 は PEAR です *** 14
オブジェクト 指 向 における クラス と 継 承 の 概 要 クラス とはオブジェクトに 共 通 の 性 質 を 抜 き 出 してグループ 化 した オブジェクトの ひな 型 のようなものです 継 承 では 上 位 クラス(スーパークラス)と 呼 ばれる 親 からメソッドや 属 性 といった 性 質 を 引 き 継 いだ 下 位 クラス (サブクラス)と 呼 ばれる 子 供 へ 引 き 継 がれることをいいます また 子 供 は 親 の 性 質 をもちつつ 子 供 だけにしか ない 特 性 を 持 つこと( 定 義 すること)ができます 15
parent 命 令 同 じくオーバーライドするにも スーパークラスの 機 能 を 完 全 に 塗 り 替 えるのではなく スーパークラスの 機 能 を 受 け 継 ぎながらサブクラス 側 で 機 能 を 追 加 したいという 場 合 があります そのような 場 合 には parent 命 令 でスー パークラスのメソッドを 呼 び 出 すことも 可 能 です parent 命 令 を 利 用 するとサブクラスでスーパークラスのメソッド を 少 しだけ 改 変 したいと 思 った 場 合 でもそれを 最 初 から 書 き 直 す 必 要 はなくなります スーパークラスのメソッド の 戻 り 値 を 利 用 しつつ 必 要 な 部 分 だけを 修 正 するということが 可 能 になります class MyClass { protected $data; public function construct($data){ $this->tdata=$data; public function showdata(){ return ' 入 力 値 は '.$this->data.' です '; class MySubClass extends MyClass { public function showdata(){ return '***'.parent::showdata().'***'; $obj=new MySubClass('PERA'); print($obj->showdata()); 16
final 修 飾 子 final 修 飾 子 は 特 定 のメソッドをオーバーライドできないように 制 限 するための 修 飾 子 です 継 承 をすることを 想 定 していないメソッドについては final 修 飾 子 をつけることで 不 用 意 にオーバーライドされることを 防 ぐことができ ます class MyClass { protected $data; public function construct($data){ $this->data=$data; public final function showdata(){ return ' 入 力 値 は '.$this->data.' です '; class MySubClass extends MyClass{ public function showdata(){ return '*** 入 力 値 は '.$this->data.' です ***'; [ 出 力 ] Fatal error: Cannot override final methot MyClass::showData() in filan.php 17
ポリモーフィズム ポリモーフィズムとは 同 名 のメソッドで 異 なる 挙 動 を 実 現 することをいいます ポリモーフィズムのメソッドは 同 じ 目 的 の 機 能 に 同 名 のメソッドを 割 り 当 てる ことができるということです これは 一 連 の 関 連 するクラスを 利 用 す る 場 合 に 異 なるメソッド 名 を 覚 えなくていいため 利 用 者 にとって 利 便 性 が 増 します 実 装 には 単 なる 継 承 と オーバーライドだけではそれぞれのサブクラスが 同 名 のメソッドを 持 つことが 必 ずしも 保 証 できないため 抽 象 メ ソッドという 概 念 を PHP の 場 合 利 用 します polymorphism.php class Figure { protected $width; protected $height; public function construct($width, $height){ $this->width=$width; $this->height=$height; protected function getarea(){ class Triangle extends Figure { public final function getarea(){ return $this->width * $this->height / 2; class Square extends Figure { public final function getarea(){ return $this->width * $this->height; $tri = new Triangle(10, 5); $sqr = new Square(10, 5); print(' 三 角 形 の 面 積 は'.$tri->getArea().'です <br>'); print(' 四 角 形 の 面 積 は'.$sqr->getArea().'です <br>'); [ 出 力 ] 三 角 形 の 面 積 は 25 です 四 角 形 の 面 積 は 50 です 18
ポリモルフィズム の 例 オブジェクト 指 向 では 同 じメッセージに 対 してオブジェクトごとに 異 なる 処 理 を 実 行 させることができます これ を ポリモルフィズム と 呼 びます ポリモルフィズムを 活 用 すれば 簡 潔 な 構 造 で 多 様 な 処 理 を 実 行 するシステム を 開 発 できます ここまで 読 み 進 んできて オブジェクト 指 向 に 対 する 理 解 が 深 まったと 思 います その 上 で もう 1 つ 覚 えてほし いポイントとして オブジェクト 指 向 のシステム 開 発 を 実 践 する 際 には オブジェクト 指 向 を 強 く 意 識 する 必 要 が ある ということです 純 粋 なオブジェクト 指 向 開 発 は 今 も 難 しいのが 現 状 です オブジェクト 指 向 言 語 や GUI を 使 ったとしても 結 局 コンピュータの 内 部 は 手 続 き 指 向 に 則 っているためです オブジェクト 指 向 に 違 反 しようと 思 えば いくらでもで きてしまいます 例 えば,システムの 処 理 性 能 を 優 先 して プログラムからいきなりメモリー アドレスを 指 定 して 直 接 アクセスすることも 可 能 です データベースやミドルウエアなど システム 構 築 に 欠 かせない IT 関 連 製 品 の 中 には オブジェクト 指 向 とは 異 なる 旧 来 の 構 造 を 持 つものも 依 然 として 多 いです オブジェクト 指 向 開 発 を 成 功 に 導 くカギは 知 識 や 技 術 の 習 得 に 加 えて 強 い 意 志 を 持 つことも 必 要 といえます 19
抽 象 メソッド 抽 象 メソッドとは メソッド 定 義 の 先 頭 に abstract 修 飾 子 を 付 加 したメソッドであり 抽 象 メソッド 自 体 は 動 作 を 定 義 しない 空 のメソッドです 抽 象 メソッドは サブクラスで 必 ずオーバーライドしなければいけません クラス 内 の 抽 象 メソッドがサブクラスで 必 ずオーバーライドされていなければそのクラスはインスタンス 化 できません これに より 同 名 のメソッドがサブクラスで 再 定 義 されることを 保 証 します 抽 象 メソッドの 定 義 では 中 身 が 空 であって も { のようなブロックを 定 義 しません また 抽 象 メソッドを 含 むクラスのことを 抽 象 クラスといい class キーワードの 前 に abstract 修 飾 子 を 付 加 する 必 要 があります 抽 象 クラスのサブクラスが 抽 象 メソッドをすべてオーバーライドしていない 場 合 エラーが 出 ま す abstract.php abstract class Figure { protected $width; protected $height; public function construct($width, $height){ $this->width = $width; $this->height = $height; protected abstract function getarea(); class Triangle extends Figure { public final function getarea() { return $this->width * $this->height / 2; class Square extends Figure { public final function getarea() { return $this->width * $this->height; $tri = new Triangle(10, 5); $sqr = new Square(10, 5); print(' 三 角 形 の 面 積 は'.$tri->getArea().'です <br>'); print(' 四 角 形 の 面 積 は'.$sqr->getArea().'です <br>'); 20
インターフェイス 抽 象 クラスによるポリモーフィズムの 実 現 には 問 題 もあります それは PHP では 多 重 継 承 つまり サブクラ スが 同 時 に 複 数 のスーパークラスを 継 承 できないという 点 です この 性 質 を 単 一 継 承 といいます 多 重 継 承 がで きないということはポリモーフィズムを 実 現 したいすべての 機 能 (メソッド)をひとつの 抽 象 クラスに 含 めなければ いけないことを 意 味 します これは 必 ずしもサブクラスがスーパークラスの 機 能 を 必 要 としない 場 合 でも 機 能 を オーバーライドしなければ ならなくなり 当 然 コードは 冗 長 になります コードが 冗 長 になるということはサブクラ スの 役 割 が 分 かりにくくする 一 因 をつくることにつながります そこで PHP では インターフェイスを 利 用 します インターフェイスとは 配 下 のメソッドがすべて 抽 象 メソッドである 特 別 なクラスを 言 います インターフェイ スを 定 義 する 場 合 には class キーワードの 代 わりに interfece キーワードを 使 用 します また 配 下 のメソッドが 抽 象 メソッ ドであることは interfece キーワードから 明 らかなので 個 々のメソッドには abstract 修 飾 子 は 必 要 ありません インターフェイスとクラスとの 決 定 的 な 違 いはいわゆる 多 重 継 承 が 可 能 になるということです インターフェイス を 採 用 することにより サブクラス 側 では 必 要 なメソッドを 含 むインターフェイス を 選 択 し 継 承 することが 可 能 とな ります このとき インターフェイスの 機 能 を 受 け 継 ぐことは 継 承 する ではなく 実 装 する と 言 います インター フェイ スを 実 装 する 場 合 には extends キーワードの 代 わりに implements キーワードを 使 用 します インターフェ イスを 実 装 したクラスのことを 実 装 クラス といいます また 複 数 のインターフェイスを 実 装 する 必 要 がある 場 合 には インターフェイス 名 をカンマ 区 切 りで 記 述 します PHP または Java では 言 語 仕 様 的 に 多 重 継 承 が 許 されていません これは メソッド 名 が 重 複 した 場 合 の 処 置 など 重 複 チェックが 大 変 なことや 多 重 継 承 が 様 々な 問 題 を 引 き 起 こしやすいからといわれています(C++では 仕 様 的 には 認 められています) ただ 多 重 継 承 をサポートすることにより 言 語 の 構 造 が 複 雑 になりすぎることや 本 当 に 多 重 継 承 を 使 わざる 得 ない 場 合 はそれほど 多 くありません Java でも 多 重 継 承 ができない 代 わりにイン ターフェイスが 使 えるようになっています 多 重 継 承 インターフェイスともにそれ 相 応 の 高 レベルのプログラム 制 作 に 使 用 される 技 術 なので 通 常 の 業 務 ではあまり 使 用 されることはありません ただ こういった 考 え 方 もオブ ジェクト 指 向 という 分 野 に 入 るので 概 要 だけでも 頭 に 入 れといてください 21
Figure.class.php interface Figure { public function getarea(); interface.php require_once('figure.class.php'); class Triangle implements Figure { private $width; private $height; public function construct($width, $height){ $this->width = $width; $this->height = $height; public final function getarea(){ return $this->width * $this->height / 2; class Square implements Figure { private $width; private $height; public function construct($width, $height){ $this->width = $width; $this->height = $height; public final function getarea(){ return $this->width * $this->height; $tri = new Triangle(10, 5); $sqr = new Square(10, 5); print(' 三 角 形 の 面 積 は'.$tri->getArea().'です <br>'); print(' 四 角 形 の 面 積 は'.$sqr->getArea().'です <br>'); 22
3.PHP5 独 自 のオブジェクト 構 文 規 則 autoload 関 数 PHP5では オブジェクト 指 向 構 文 が 強 化 され 限 りなく JAVA ライクなオブジェクト 指 向 プログラミングが 可 能 に なりました さらに PHP5では 独 自 で 使 える 構 文 規 則 も 追 加 されています そのひとつが autoload 関 数 です も ともとクラスは 複 数 のスクリプトから 再 利 用 されるというその 性 質 上 1クラス1ファイルで 管 理 することが 望 ましい とされています(ただ 短 いプログラムなどは 可 読 性 を 考 慮 して 設 計 されていることもあるので 例 外 はあります) 1 クラス1ファイルなら 無 駄 なクラスを 読 み 込 む 必 要 もありませんし ファイル 管 理 という 観 点 からも 整 理 しやす くなります ただ 1クラス1ファイル 方 式 で 作 成 していくと 扱 うクラスが 増 えてきた 場 合 にひとつひとつのクラスフ ァイルについて include_once 関 数 や require_once 関 数 を 記 述 す ることが 大 きな 手 間 になりますし 記 述 漏 れや 誤 りの 原 因 にもなります そこで 役 に 立 つのが autoload 関 数 です autoload 関 数 は 未 定 義 クラスを 呼 び 出 したタイミングで 自 動 的 に 呼 び 出 される 特 別 な 関 数 であり 呼 び 出 し た 未 定 義 のクラスの 名 前 が 引 数 として 渡 されます autoload 関 数 は それ 自 体 はなんら 実 装 を 持 たない 名 前 だ け 予 約 された 関 数 です 一 般 的 には クラス 名.class.php のような 形 式 であらかじめファイル 名 に 一 定 の 規 則 性 を 設 けた 上 で autoload 関 数 内 で require_once 関 数 を 呼 び 出 し クラスが 呼 び 出 さ れたタイミングで 自 動 的 に 同 名 のクラスファイルをインクルードするような 用 途 で 使 用 します autoload 関 数 を 利 用 すると クラスごとに require_once 関 数 を 呼 び 出 す 必 要 がなくなるので コードがシンプ ルになります また スクリプト 内 で 使 用 するかどうか 分 からないクラスをインクルードしなくても 済 むので 処 理 上 のオーバーヘッドが 軽 減 します なお autoload 関 数 を 定 義 したスクリプトは その 性 質 上 アプリケーション 内 のすべてのスクリプトで 有 効 にしておくことをお 勧 めします ア プリケーション 配 下 のファイルに 対 し て autoload.php を 自 動 的 に 読 み 込 むためには.htaccess ファイルを 利 用 します autoload.php function autoload($name){ require_once($name. '.class.php'); auto_load.php require_once('autoload.php'); $obj = new MyClass(); $obj -> width = 10; $obj -> height = 5; print(' 三 角 形 の 面 積 は'.$obj->triangle().'です <br>'); 23
call メソッド call メソッドは 未 定 義 のメソッドが 呼 び 出 された 場 合 の 挙 動 を 定 義 するためのメソッドです autoload 関 数 と 同 様 PHP5 独 自 のもので あり それ 自 体 はなんら 実 装 を 持 たない 名 前 だけ 予 約 されたメソッドですので 必 要 に 応 じて 中 身 を 実 装 する 必 要 があります call メソッドは 引 数 として メソッド 名 と 引 数 値 の 配 列 を 受 け 取 ることができ ます 変 わり 種 の 機 能 ではありますが メソッド 名 に 応 じて 共 通 的 な 処 理 を 分 岐 したいなどのケースで 利 用 できる でしょう class MyClass{ public function call($name,$args){ print('メソッド 名 :'.$name.'<br>'); print_r($args); $obj = new MyClass(); $obj -> nothing('x','y'); [ 出 力 ] メソッド 名 :nothing Array ( [0] => x [1] => y ) 24
get, set メソッド get, set メソッドは 未 定 義 のプロパティを 取 得 設 定 しようとしたタイミングで 呼 び 出 されるメソッドです autoload 関 数 と 同 様 PHP5 独 自 のものであり それ 自 体 はなんら 実 装 を 持 たない 名 前 だけ 予 約 されたメソッド ですので 必 要 に 応 じて 中 身 を 実 装 する 必 要 があります get メ ソッドは 取 得 しようとした 未 定 義 のプロパティの 名 前 を 引 数 として 受 け 取 ります set メソッドは 設 定 しようとした 未 定 義 のプロパティの 名 前 と 値 を 引 数 として 受 け 取 ります これらのメソッドを 使 用 して 未 定 義 のプロパティが 参 照 されたときの 処 理 を 記 述 します class MyClass{ public function get($name){ print($name. 'プロパティが 参 照 されました <br>'); public function set($name, $value){ print($name. 'プロパティ 値 '. $value. 'がセットされました <br>'); $obj = new MyClass(); $obj -> nobody = 1; print($obj->nobody); [ 出 力 ] nobody プロパティ 値 1 がセットされました nobody プロパティが 参 照 されました 25
4.Apache との 連 携.htaccess.htaccess ファイル( 先 頭 にドットがつく UNIX 系 列 では 先 頭 にドットがつくファイルは 隠 しファイル 属 性 の 意 味 に なる)は Apache 標 準 の 設 定 ファイルで ドキュメントルート 配 下 の 任 意 のディレクトリに 配 置 することで 該 当 す るディレクトリと その 配 下 のサブディレクトリに 対 してだけ 適 用 されるパラメータを 設 定 することができます php.ini を 利 用 するとサーバー 全 体 に 対 して 設 定 が 適 用 されてしまいますが このように 特 定 のアプリケーション に 対 して 設 定 を 適 用 したいという 場 合 は.htaccess を 利 用 します 書 式 は 以 下 のとおりです <IfModule mod_php5.c> php_value パラメータ 名 パラメータ 値 php_flag パラメータ 名 on off <IfModule> パラメータ 値 が on または off で 表 される 場 合 には php_flag を それ 以 外 の 値 である 場 合 には php_value を 使 用 します php_value,php_flag は 必 要 な 数 だけ 記 述 できます また.htaccess で PHP の 設 定 を 行 う 場 合 には 次 の 2 点 について 注 意 する 必 要 があります http.conf の AllowOverride ディレクティブを"All"に 設 定 AllowOverride ディレクティブは.htaccess ファイルによるパラメータの 上 書 きを 可 能 にするかどうかを 決 めるた めのパラメータです AllowOverride ディレクティブが"None"に 設 定 されている 場 合 は.htaccess ファイルは 無 視 されます.htaccess ファイルで 設 定 可 能 なパラメータは 決 まっている.htaccess ファイルでは すべての php.ini のパラメータを 設 定 できるわけではありません パラメータによっては php.ini でしか 設 定 できないものがあるので 注 意 してください どのパラメータが.htaccess ファイルで 設 定 可 能 か は ini_get_all 関 数 の access 情 報 を 参 照 することで 確 認 できます アクセスレベルが6または7である 場 合 その パラメータは.htaccess で 設 定 可 能 です <? print '<PRE>'; print_r(ini_get_all()); print '</PRE>'; [ 出 力 ] Array ( [allow_call_time_pass_reference] => Array ( [global_value] => 1 [local_value] => 1 [access] => 6 ) 中 略 ) 26