I would like to share one very useful tip with include_* statements. For example we have two classes first.class.php and second.class.php both located in the same directory (./classes) and first one uses the second one. So we have:
first.class.php
<?php
include_once './second.class.php';
...
?>
also we have file which uses first.class.php:
<?php
include_once './classes/first.class.php';
...
?>
if you will try to execute your script you will get error. Reason: the current directory is different and the relative path in first.class.php (./second.class.php) will be incorrect.
Here is two possible solution I have found:
<?php
include_once dirname(__FILE__).'/second.class.php';
...
?>
or
<?php
chdir(dirname(__FILE__));
include_once './second.class.php';
...
?>
Hope that tip will be useful for some other software developer
Admin of http://FreeProxyList.org
include_once()
include_once()문은 스크립트 수행기간동안 특정파일을 인클루드하고 적용시킨다. 이것은 include()문과 비슷하게 동작한다. 단지 파일의 특정 코드가 이미 인클루되었다면 그 코드는 다시는 인클루드 될수 없다는 차이점만 있다. 이 이름이 제시하듯이 한번만 인클루드할것이다.
include_once()는 특정 스크립트 수행기간동안 동일한 파일이 한번 이상 인클루드되고 적용될지도 모르는 상황에서 사용해야 할것이다. 그리고 함수 중복정의, 변수값 중복 지정 등의 문제를 회피하려면 정확히 한번만 인클루드할 때가 있을것이다.
require_once()와 include_once()의 더 많은 사용예는, 최신 PHP 소스 내의 » PEAR코드를 참고할것.
반환값은 include()와 동일합니다. 파일이 이미 포함되었으면, TRUE를 반환합니다.
Note: include_once()는 PHP 4.0.1에서 추가됨
Note: include_once()와 require_once()는 대소문자를 구별하지 않는 운영체제(윈도우 등)에서 기대하지 않은 동작을 할 수 있습니다.
Example #1 include_once()는 윈도우에서 대소문자를 구분하지 못합니다.
<?php
include_once "a.php"; // a.php를 포함합니다.
include_once "A.php"; // 윈도우에서 또다시 a.php를 포함합니다. (PHP 4만)
?>이 동작은 PHP 5에서 바뀌었습니다 - 경로를 표준화를 먼저 하기 때문에, C:\PROGRA~1\A.php를 C:\Program Files\a.php로 인식하고, 파일을 한 번만 포함합니다.
PHP 4.3.0 이전의 윈도우 버전 PHP에서는 이 함수를 이용하여 원격 파일에 접근할 수 없습니다. allow_url_fopen을 활성화하여도 마찬가지입니다.
참고: include(), require(), require_once(), get_required_files(), get_included_files(), readfile(), virtual().
include_once
31-Mar-2009 01:51
08-Jan-2009 06:42
Using include_once() in the __autoload() function is redundant. __autoload() is only called when php can't find your class definition. If your file containg your class was already included, the class defenition would already be loaded and __autoload() would not be called. So save a little overhead and only use include() within __autoload()
Neil Holcomb
28-Jun-2008 09:22
If you include a file that does not exist with include_once, the return result will be false.
If you try to include that same file again with include_once the return value will be true.
Example:
<?php
var_dump(include_once 'fakefile.ext'); // bool(false)
var_dump(include_once 'fakefile.ext'); // bool(true)
?>
This is because according to php the file was already included once (even though it does not exist).
19-May-2008 09:40
For include_once a file in every paths of application we can do simply this
include_once($_SERVER["DOCUMENT_ROOT"] . "mypath/my2ndpath/myfile.php");
09-Aug-2007 07:29
If you are like me and make heavy use of the __autoload magic function, always set include paths so you can just instantiate your class, and have multiple locations and name schemes for your custom libraries then you might be frustrated by simple parse errors being supressed when using @include_once('lib.php').
The solution I came up with was:
define('IN_PRODUCTION_ENV',FALSE);
function __autoload($class){
$paths = array();
$paths[] = "{$class}_lib.php";
$paths[] = "{$class}_inc.php";
$paths[] = "{$class}.php";
if(IN_PRODUCTION_ENV){
foreach($paths as &$path){
if((@include_once $path) !== false){ return; }//if
}//foreach
}else{
// we are not in a production environment so we want to see all errors...
$include_paths = explode(PATH_SEPARATOR,get_include_path());
foreach($include_paths as $include_path){
// go through each of the different class names...
foreach($paths as $path){
// attach each class name to the include path...
$include_file = $include_path.$path;
if(file_exists($include_file)){
if((include_once $include_file) !== false){ return; }//if
}//if
}//foreach
}//foreach
}//if/else
trigger_error("{$class} was not found",E_USER_ERROR);
}//method
Now, just make sure you define IN_PRODUCTION_ENV to true or false to get either the slower (with all parse errors shown) or the faster (just suppress everything) autoloading. Hope this helps someone else since it was annoying just having blank screens show up when I had a simple parse error. Thanks to flobee at gmail dot com for providing me with the epiphany on why pages were showing up blank...-Metagg
10-Aug-2006 09:11
Since I like to reuse a lot of code it came handy to me to begin some sort of library that I stored in a subdir
e.g. "lib"
The only thing that bothered me for some time was that although everything worked all IDEs reported during editing
these useless warnings "file not found" when library files included other library files, since my path were given all relative to the corresponding document-root.
Here is a short workaround that makes that gone:
<?php
// Change to your path
if(strpos(__FILE__,'/lib/') != FALSE){
chdir("..");
}
include_once ('./lib/other_lib.inc');
// ... or any other include[_once] / require[_once]
?>
just adjust the path and it will be fine - also for your IDE.
greetings
Dealing with function redefinitions
include_once and require_once are very useful if you have a library of common functions. If you try to override with - that is define - an identically named local function however, PHP will halt noting that it cannot redeclare functions. You can allow for this by bracketing (within the include file):
function myUsefulFunc($arg1, $arg2) {
... }
with
if (!function_exists('myUsefulFunc')) {
function myUsefulFunc($arg1, $arg2) {
... }}
Top level functions (ie. those not defined within other functions or dependent on code running) in the local file are always parsed first, so http://php.net/function_exists within the included/required file is safe - it doesn't matter where the include statements are in the local code.
Csaba Gabor from Vienna
26-May-2005 11:55
i already had a discussion with several people about "not shown errors"
error reporting and all others in php.ini set to: "show errors" to find problems:
the answer i finally found:
if you have an "@include..." instead of "include..." or "require..('somthing') in any place in your code
all following errors are not shown too!!!
so, this is actually a bad idea when developing because paser errors will be droped too:
<?php
if(!@include_once('./somthing') ) {
echo 'can not include';
}
?>
solution:
<?php
if(!@file_exists('./somthing') ) {
echo 'can not include';
} else {
include('./something');
}
?>
18-Mar-2005 07:17
Inlude_once can slower your app, if you include to many files.
You cann use this wrapper class, it is faster than include_once
http://www.pure-php.de/node/19
include_once("includeWrapper.class.php")
includeWrapper::includeOnce("Class1.class.php");
includeWrapper::requireOnce("Class1.class.php");
includeWrapper::includeOnce("Class2.class.php")
29-Oct-2004 07:06
Something to be wary of: When you use include_once and the data that you include falls out of scope, if you use include_once again later it will not include despite the fact that what you included is no longer available.
So you should be wary of using include_once inside functions.
