Re: note 8967 added to include
| From: | J. M. Castagnetto | Date: | Mon, 09 Oct 2000 23:33:16 +0000 |
| Subject: | Re: note 8967 added to include | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-6275@lists.php.net to get a copy of this message | ||
Use include_once() or require_once() for a solution to
multiple file inclusion, also include w/ respect to
the document root to avoid similar problems, or put
the include dirs in the include_path configuration
file, this will sidestep the relative path problems
that can occur.]
Your note has been edited to include the comment
above.
--- wes@cooper.edu wrote:
> I've been working on a project in PHP that keeps
> getting larger and larger, with my source tree
> getting bigger and bigger.
>
> I had been sidestepping the issue of include()ing a
> file from another file by being very careful as to
> where dependencies were. For instance:
> a.php
> actions/b.php
> conf/c.php
>
> Having a.php include() conf/c.php is fine. However,
> if only b.php needs c.php, what you'd like to do is
> have b.php include("../conf/c.php"). Now, the
> problem people run up against is that if a.php
> include()s b.php, and b.php is set to
> include("../conf/c.php"), b.php won't be able to
> find "../conf/c.php"! That's because php stay's in
> a.php's directory.
>
> As I said before, I dealt with this by sidestepping
> the issue. I was always calling "b.php" from the
> a.php directory, so I include()d "conf/c.php" and
> things worked.
>
> It finally bit me in the butt last week. So, I
> broke down redid the include statements on my site.
> Here's what I do now... any include()s are wrapped
> in chdir()s. To continue my example from above
> (within a.php):
> $old_a_php_dir = getcwd();
> chdir("actions");
> include("b.php");
> chdir($old_a_php_dir);
>
> Now, when b.php include()s c.php (that include is
> also wrapped in chdir()s), it can find c.php. The
> truly nice part about all this is that there's no
> hard-wiring here, so when I move my site to another
> box with a different $DOCUMENT_ROOT, it should all
> continue to work.
>
> Warnings:
> I used to use require() exclusively. However, since
> require() does it's thing very early on (i.e.,
> before any chdir()s can be executed), this trick
> will only work with include().
>
> Also, I lied a little. I don't actually
> include("b.php"). I include("../actions/b.php").
> Since you are in "actions/", it's the same thing,
> but I think it helps readability.
>
> BIG HUGE AMAZING WARNING:
> You have to be VERY careful to uniquely name your
> $old_dir variable from getcwd(). Think about it...
> you're include()ing files left and right, all of
> which are using the same method. If all your
> variables are name $old_dir, it gets overwritten
> with each include()! There are various clever
> things one could do about this, but I prefer the
> simple approach show above. That is, use the
> filename itself as part of the variablename.
> Prepend the directory name if you like to have lots
> of files with the same name. Just be careful!
>
> BTW - I also use define("__B_PHP__", 1) to deal with
> multiple inclusions, but there are other posts here
> that explain the problem/solution very well, so it's
> not repeated here.
>
> Giving back...
> Wes Hertlein
>
> http://www.php.net/manual/function.include.php
>
>
> --
> PHP Notes Mailing List (http://www.php.net/)
> To unsubscribe, e-mail:
> php-notes-unsubscribe@lists.php.net
> For additional commands, e-mail:
> php-notes-help@lists.php.net
> To contact the list administrators, e-mail:
> php-list-admin@lists.php.net
>
=====
--- Jesus M. Castagnetto (jcastagnetto@yahoo.com)
__________________________________________________
Do You Yahoo!?
Yahoo! Photos - 35mm Quality Prints, Now Get 15 Free!
http://photos.yahoo.com/