PHPシステム構築

<< functionを利用して、出力を共通化。 質問一覧 PHPで作成された独自CMSをHTMLタグ入... >>

  • 募集中!! 300P
Zend_Loader_Autoloaderの設定方法

以下のようなディレクトリ構成の場合、
クラスファイルをautoloadさせるにはどうすれば良いのでしょうか?

MyLib/A.php (class A)
MyLib/A/B.php (class A_B extends B)

MyLibはインクルードパスに入っています。実パスは環境で変わってしまいます。

  1. // client.php
  2. require_once 'Zend/Loader/Autoloader.php';
  3. $autoloader = Zend_Loader_Autoloader::getInstance();
  4.  
  5. // Zendディレクトリ以下は問題ありません。
  6. var_dump(new Zend_Mail_Transport_Smtp);
  7.  
  8. // しかし、MyLib以下は効きません。
  9. var_dump(A_B::getInstance());
  10. //=> Fatal error: Class 'A_B' not found

$autoloader->setFallbackAutoloader(true);
とすると通るのですが、Symfonyのローダーが効かなくなってしまう
//=> Warning: Zend_Loader::include(sfPropelDatabase.php) : failed to open stream: No such file ...
ようなので、setFallbackAutoloader(true) 以外の方法で解決したいのですが、
どうすれば良いのか解る方いらっしゃいますでしょうか?
QZend_Loader_Autoloaderの設定方法 karakiz  [07月09日 16時30分] 
┣Re:Zend_Loader_Autoloaderの設定方法 signal  [07月10日 09時31分] 
┃┗Re:Re:Zend_Loader_Autoloaderの設定方法 karakiz  [07月10日 12時18分] 
┃  ┣Re:Re:Re:Zend_Loader_Autoloaderの設定方法 signal  [07月10日 21時01分] 
┃  ┃┗検討します karakiz  [07月10日 22時51分] 
┃  ┗Re:Re:Re:Zend_Loader_Autoloaderの設定方法 mgngmgng  [07月13日 10時12分] NEW!
┃    ┗Re:Re:Re:Re:Zend_Loader_Autoloaderの設定方法 karakiz  [07月13日 23時33分] NEW!
┗Re:Zend_Loader_Autoloaderの設定方法 wintermute  [07月10日 13時11分] 
  ┗client.phpは単なる例です karakiz  [07月10日 16時04分] 
    ┗Re:client.phpは単なる例です wintermute  [07月10日 16時21分] 
      ┗勉強になりました karakiz  [07月10日 18時09分] 
        ┗Re:勉強になりました wintermute  [07月11日 01時54分] NEW!
          ┗Re:勉強になりました wintermute  [07月11日 09時17分] NEW!
            ┣(皮肉ではなく)あなたの自信は賞賛します1 karakiz  [07月12日 10時46分] NEW!
            ┗(皮肉ではなく)あなたの自信は賞賛します2 karakiz  [07月12日 10時54分] NEW!
              ┗(皮肉ではなく)必死に勉強する事は良い事です wintermute  [07月13日 13時23分] NEW!
                ┗理解が足りなかったのはどっちだ? karakiz  [07月14日 00時33分] NEW!

コメント一覧

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

Re:Zend_Loader_Autoloaderの設定方法

set_include_path
http://www.phppro.jp/phpmanual/php/function.set-include-path.html
を参考にしてみて、include_path に MyLib を追加してみてください

Re:Re:Zend_Loader_Autoloaderの設定方法

signal様
お世話になっております。

既に、
MyLibはインクルードパスに入っています。

  1. require_once 'A/B.php';
  2. //=> MyLibがinclude_pathに入っているのでエラー発生しない。

Re:Re:Re:Zend_Loader_Autoloaderの設定方法

Zend_Loader_Autoloader の使い方がいまいちわからないので

PHP5であれば
http://jp2.php.net/manual/ja/language.oop5.autoload.php
を使って実装してみてはいかがでしょうか

検討します

ありがとうございます。
もう少し待ってから検討してみます。

Re:Re:Re:Zend_Loader_Autoloaderの設定方法

signalさんがかかれてますが、__autoloadでいけそうですね。
試しに以下のようなソースで確認してみました。
# Zend FrameworkやSymfonyで解決しているわけではないので、
# あくまで参考程度に


/path/to/MyLib/A.php
  1. <?php
  2. class A {
  3.   public function __construct() {
  4.     echo "class A called \n";
  5.   }
  6. }

/path/to/MyLib/B.php
  1. <?php
  2. class B {
  3.   public function __construct() {
  4.     echo "class B called \n";
  5.   }
  6.   protected $_prop = 'prop';
  7. }

/path/to/MyLib/A/B.php
  1. <?php
  2. class A_B extends B {
  3.   public function __construct() {
  4.     echo "class A_B extends B called \n";
  5.     echo '$this->_prop : ' . $this->_prop . "\n";
  6.   }
  7. }

/path/to/__autoload.php
  1. <?php
  2. // include_pathにMyLibを通しておく
  3. ini_set('include_path''.:/path/to/MyLib/');
  4.  
  5. // __autoload
  6. function __autoload($class_name) {
  7.   $class_file_path = str_replace('_'DIRECTORY_SEPARATOR$class_name) . '.php';
  8.   require_once $class_file_path;
  9. }

/path/to/test.php
  1. <?php
  2. require_once './__autoload.php';
  3. $a   = new A;
  4. $b   = new B;
  5. $a_b = new A_B;

で、実行結果。
  1. > php /path/to/test.php
  2. class A called
  3. class B called
  4. class A_B extends B called
  5. $this->_prop : prop


# __autoload 便利ですね...

Re:Re:Re:Re:Zend_Loader_Autoloaderの設定方法

ありがとうございます!!
とても丁寧なコードまで書いていただいて感激です。
試してみます。
ありがとうございます。

Re:Zend_Loader_Autoloaderの設定方法

> Symfonyのローダーが効かなくなってしまう
この部分にだけ注目して答えますが

「client.php」という名前自体が、Symfonyの命名規則に合っていませんよ。

# 恐らく、もう少しフレームワークというものについて理解する事が必要かと

client.phpは単なる例です

失礼しました。
実際は client.php というファイル名ではありません。
クラスを利用する側(クライアント)のファイルという意味で書いてしまいました。

しかし、実際に client.php という名前であったとしても
問題には何も影響していないように思うのですが...

> # 恐らく、もう少しフレームワークというものについて理解する事が必要かと 
どういう意味ですか?

Re:client.phpは単なる例です

> どういう意味ですか? 
これを説明するのは難しいですね

symfonyでは、基本的なアプリケーションならば、actions.class.phpと、{action name}Success.php、{action name}Error.phpしかスクリプトを書くような所はありません。

以上の事は、symfonyのチュートリアルを勉強していればわかっているはずなのですが、書かれている内容からすると、チュートリアルを勉強していない、という事ですよね?

基本となる前提の部分が無い人に説明するのはちょっと時間がかかりすぎます。

勉強になりました

>>>>> # 恐らく、もう少しフレームワークというものについて理解する事が必要かと
>>> どういう意味ですか?
>> これを説明するのは難しいですね

フレームワークについて説明しろとは誰も言ってませんよ。

あなたは私の質問を見て、
>>>>> # 恐らく、もう少しフレームワークというものについて理解する事が必要かと
と言いました。
私の質問を見て、「フレームワークの利用に際し、致命的な理解不足がある」
と判断されたわけですよね?

それは具体的にどういうことなのですか?
どうぞ率直に言ってしまってください
と尋ねたわけです。

それほど大きな過ちだったら、簡単に指摘できるはずではありませんか?

Symfonyの命名規則云々が大間違いだというなら Symfony の理解不足といえるかもしれませんが、
「フレームワークというもの」に対する理解とは関係ない話でしょう。


> symfonyでは、基本的なアプリケーションならば、actions.class.phpと、
> {action name}Success.php、{action name}Error.phpしかスクリプトを書くような所はありません。

本気ですか!?

その上、基本的なアプリケーション??
なぜここで「基本的なアプリケーション」なるものが登場するのでしょうか?

アクションとテンプレートだけで仕上げるのが「基本的なアプリケーション」というものだとすれば、私が取り組んでいるのは「基本的なアプリケーション」ではありません。

多数の独自ファイルをSymfonyアプリの中で使っていますが、特に問題のある手法だとは思っていません。


> 以上の事は、symfonyのチュートリアルを勉強していればわかっているはずなのですが、
> 書かれている内容からすると、チュートリアルを勉強していない、という事ですよね?

チュートリアルを完璧に理解してはいませんが、
「アクションとテンプレート以外でコードを書くような奴は最低レベルの勉強不足野郎だ!」
という認識の方が理解不足なのでは... ?


ご返信ありがとうございました。
勉強になりました。

Re:勉強になりました

> フレームワークについて説明しろとは誰も言ってませんよ。
Zend Frameworkもsymfonyもフレームワークです。
それなのに、フレームワークについて理解しないで使おうとしているのですか?

> その上、基本的なアプリケーション??
> なぜここで「基本的なアプリケーション」なるものが登場するのでしょうか?
ここを見ても、理解不足という事が露呈しているのですが
> 多数の独自ファイルをSymfonyアプリの中で使っていますが、特に問題のある手法だとは思っていません。
上の書き込み、この部分からすると、恐らく「単なるライブラリ」として使用しようとしているのかと思います。

> 「アクションとテンプレート以外でコードを書くような奴は最低レベルの勉強不足野郎だ!」
ぜんぜんそのような事は書いてないのですが・・・
ご自身で、そう思っている、という事なのでしょうか?

http://jp2.php.net/manual/ja/language.oop5.autoload.php
Zend Frameworkや、symfonyのオートローダーの中身でも見てみると、何をしているのか分かるのではないでしょうか?

# 自分の思い込みのままに進んで行っても新しい事は学べないですよ
# なぜ、不快感を感じた時には、新しい事にぶつかったのだ、と気づかないのか

Re:勉強になりました

ちょっと、1つ大事な事を忘れていました。

symfonyの通常の起動は、front controllerから立ち上げることを通じて、各種ディレクトリの設定、各種ライブラリの位置を確認してキャッシュしていくような事をしています。
そして、大抵のライブラリは、その設定を前提に動作するので、その一部を取り上げてただのライブラリとして使用するのは困難です。
(フレームワークという言葉が嫌いなら、ソリューションとでも言いましょうか?)

まぁ、チュートリアルを経てこういった動作を理解していくはずなのですが、
もし、いきなりその部分をすっとばして「その中のライブラリのひとつだけを使いたい」という事でしたら、
新しい言葉を習うのに、基本的な文法や、個々のよく使われる単語を勉強する事をすっとばしていきなりスラングを学ぶようなものです。
もう少し、基本的な力をつけてから挑戦するようにしてください。

(皮肉ではなく)あなたの自信は賞賛します1

やれやれ...

>>>> フレームワークについて説明しろとは誰も言ってませんよ。
>> Zend Frameworkもsymfonyもフレームワークです。
>> それなのに、フレームワークについて理解しないで使おうとしているのですか?

だ、か、ら、
私がフレームワークの何を理解していないと言うのですか?
(そう言っているのはあなたですよ、念のため)

あなたは根拠も無く他人をけなしつけ、反論してもそれについてはまったく説明が無い。

もしかしたら、根拠を示しているつもりなのでしょうか?
そうだとしたら、誤った前提(非論理的な思い込み)が多すぎて議論になりません。



>>>> なぜここで「基本的なアプリケーション」なるものが登場するのでしょうか?
>> ここを見ても、理解不足という事が露呈しているのですが

意味不明。(わかる人いるのでしょうか?)
「基本的アプリケーション」なんて言葉を勝手に持ち出して、
どうしてこの話に「基本的アプリケーション」が関係するのか説明せず
(できないでしょう)相手を小ばかにするとは、参りましたね...



>> 上の書き込み、この部分からすると、恐らく「単なるライブラリ」として
>> 使用しようとしているのかと思います。

いいえ、ここでは Symfonyはフレームワークとして
Zend Frameworkはライブラリとして利用しています。



>> symfonyの通常の起動は、front controllerから立ち上げることを通じて、
>> 各種ディレクトリの設定、各種ライブラリの位置を確認してキャッシュしていくような事をしています。

それは理解していますよ。
何を根拠に、私がその程度のことを理解していないと「思い込んで」いるのですか?



あなたは、私がSymfonyを単なるライブラリとして使用しようとしている、
ということを批判し続けています。

>> まぁ、チュートリアルを経てこういった動作を理解していくはずなのですが、
>> もし、いきなりその部分をすっとばして「その中のライブラリのひとつだけを使いたい」
>> という事でしたら、
>> 新しい言葉を習うのに、基本的な文法や、個々のよく使われる単語を勉強する事をすっとばして
>> いきなりスラングを学ぶようなものです。
>> もう少し、基本的な力をつけてから挑戦するようにしてください。

私がSymfonyをライブラリとして使用しようとしている、という点を礎にいきなり、
「フレームワークへの理解が足りない」という話にまで発展させ
(論理は不明、というか論理なんか無いんですよね)、
さらには「基本的な力不足」とまでこき下ろす。(何の力?)


今回、Symfonyはフレームワークです。これは私側の「事実」です。
つまり、私が「Symfonyをライブラリ使用している」というのは、
完全にあなたの勝手な「思い込み」です。


要するに、あなたは事実には立脚せず、あなた自身の勝手な思い込みを基に、
他人にとやかくケチをつけたいのでしょう。

(皮肉ではなく)あなたの自信は賞賛します2

>> そして、大抵のライブラリは、その設定を前提に動作するので、
>> その一部を取り上げてただのライブラリとして使用するのは困難です。

そんなことはありませんよ。
この点についてはSymfony上級者の方なら軽く否定してくれるでしょう。
チュートリアルにも大きく書いてあったと思います。


問題の矛先を Zendライブラリの併用に変えますか?
「Symfonyの中でZendライブラリを使うこと自体がアホや!」と。

SymfonyでZendライブラリを利用する方法は、Symfonyのチュートリアルにも登場します。

Zend_Loader_Autoloader を使うことは、まさにSymfonyのチュートリアルで教わったのです。


私は、あなたがチュートリアルを本当に「学んで」いるのかどうか、追求しません。
そんなことはあなたのご自由だからです(過去にどんな発言をしていようとも!)


あるいはクラス名やディレクトリ構成を理由にしますか?
「Symfonyの命名規則に合ってない」と。

「既存のクラスやライブラリは使わない、
あるいはSymfonyの構造に合うよう修正する」のが鉄則
と「思い込んで」いるなら、あなたの頭の中より外にも世界があることを知るべきでしょう。


>> # 自分の思い込みのままに進んで行っても新しい事は学べないですよ
>> # なぜ、不快感を感じた時には、新しい事にぶつかったのだ、と気づかないのか

良いことおっしゃる(笑)
ご自分にも適用されてはいかが?

1. Symfonyの中でclient.phpというファイルを呼んでいる。
2. Zend_Loaderを使おうとしている。

この2点があなたのスタイルとは異なっていたんでしょ?→(新しい事にぶつかったのだ)
ところが「自分の思い込みのままに進んで行って」いるから、
自分が誤っているとは気づかない→(「学べなかった」結果)

そして「自分の自尊心を補うネタを見つけた」と思い込んで他人を見下しつけた「御意見」を投げつけ、憂さを晴らす。


# 「不快感を感じた」けれども、「新しい事にぶつかった」のかもしれないと考え、
  丁重に返答したら、相手はそんな輩だったというわけです。やれやれ...
  お読みくださった皆さんが私のようなアホな対応をせず、どうぞ賢明に対応されることを願います。


今回の質問に対するあなたのご発言は、(控えめに言うなら)支離滅裂です。
それに付き合った私も相当なアホですね。


「基本的アプリケーション」の話がどれほど「支離滅裂」か、ご理解いただけませんかね?

「基本的アプリケーション」て何?
この質問と「基本的アプリケーション」がどう絡むの?

説明できないでしょう。


基本的に、今回の問題にSymfonyの利用形態など関係ありません。
--------
Zend_Loader_Autoloaderが
Zend/x/y.php をロードしてくれるのに
A/B.php をロードしてくれない。
$autoloader->setFallbackAutoloader(true);とすればロードしてくれるが
$autoloader->setFallbackAutoloader(FALSE);のままでも解決できるのでは?
なんでtrueにしたくないかと言うと、
(ここで消極的にSymfonyが出てくるだけ)Symfonyのローダが無効になる様だから。

# 質問文 B.php は class A_B extends "A")ですね
--------


不快な発言になってしまったことは、すみません。お詫び申し上げます。

今夜中ですけど、寝る前に読んでほしくはないので、朝になってから投稿します。


もう書かないで下さいね。

(皮肉ではなく)必死に勉強する事は良い事です

>「基本的アプリケーション」て何?
チュートリアルで出てくる、Hello Worldレベルのアプリケーションの事です。

> この質問と「基本的アプリケーション」がどう絡むの?
「この質問」が、「フレームワーク外」でフレームワークのライブラリを使用しようとしているように見えたので、まずチュートリアルを理解したのか?という所で絡みます。

何か、過剰反応されているようですが、本当に理解されているのなら要点だけまとめて書かれればよろしいかと。
なにか、指摘されてから慌てて勉強した上に弁解をされているように見えます。

> もう書かないで下さいね。
おっと。失礼しました。

理解が足りなかったのはどっちだ?

相変わらず本当に失礼な人ですね。

> 本当に理解されているのなら要点だけまとめて書かれればよろしいかと。

意味不明。
不明快な文に相手への侮辱を乗せてくるんだから、敵いません...


> なにか、指摘されてから慌てて勉強した上に弁解をされているように見えます。

やれやれ... またずいぶんと「卑怯」な言い草ですね。


「慌てて勉強した上に弁解をされているように見えます」
その根拠は何ですか?
何をもってそう「見える(感じる)」のですか?

そういう根拠も無く、勝手に他人のことを

- フレームワークという言葉すら理解できていないくせにコード書いてるバカ
- Symfonyのチュートリアルすら勉強していない厄介者
- 基本となる前提部分すらない、話にならない低能者
- 指摘されてから慌てて勉強した上に弁解を垂れている

という人間のように仕立て上げようとしている。


率直に言いますが、こんな風に非生産的な言い争いになっているのは
あなたの理解不足が原因ではないのですか?

- この質問がSymfonyの利用形態とは関係が無いこと。
- client.phpというのは単なる「ファイルの例」であり、状況の条件では無いこと。
- 皆が Hellow Worldレベルのアプリケーションを作ろうとしているわけではないこと。
  現実の開発では Symfony内でhoge.phpという名のファイルを使うことは珍しくもない上に何の障害にもならないこと。
- Zend_Loader_Autoloader をSymfony内で使おうとしていること自体が、チュートリアルからの影響を示していること。
  だいたい最低限の資料も読まずにフレームワークを利用することなどできる道理が無いでしょう。
  現在の状況でJobeetを読まずに Symfony1.2を動かしている人などどれだけいるのだろうか...と。
- 勝手な思い込みで他人を見下し、侮辱すれば相手が怒ること。
- 非難の根拠を求めても、あなたは筋の通った答えを返せずにいること。
- 非を認め謝罪するどころか、理不尽な非難の上塗りを繰り返し、相手の感情を逆なでしていること。

あなたは以上のことを理解しているのですか?

mgngmgngさんが良心的な投稿をしてくれた(ありがとう!!)のを機に、このへんであなたへの対応は終わりにします。
1,2日中に閉めますので言いたいことがあればそれまでにどうぞ。


ちなみに、
> あなたの自信は賞賛します
というのは、本当に皮肉でも嫌味でも揶揄したわけでもありません。

「真実に立脚しない思い込み」というのは必ずしも悪いことばかりではなく、
内面的な事柄でなおかつポジティブならば、むしろ非常に有意義に作用すると思う
というコンピューターとは関係ない意見を表明しただけです。

感情的に書いていたので、内容の不快さを少しでも下げようと書きました。
効果があったかどうか怪しいですが、嫌味でも皮肉でもなく、本気で感服します。
functionを利用して、出力を共通化。 質問一覧 PHPで作成された独自CMSをHTMLタグ入...