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
include_once()命令は、スクリプトの実行時に指定 したファイルを読み込み評価します。この動作は、 include()命令と似ていますが、ファイルからのコー ドが既に読み込まれている場合は、再度読み込まれないという重要な違い があります。その名が示す通り、ファイルは一度しか読み込まれません。
include_once()は、スクリプトの実行時に同じファイ ルが複数回読み込まれ、評価される可能性がある場合に、関数の再定義や 変数値の再代入といった問題を回避するために一回だけ読み込ませるため に使用します。
require_once()および include_once()の使用例に関する他の例については、 最新のPHPソースコード配布ファイルに含まれる » PEARのコードを参照ください。
include_once() は、PHP 4.0.1で追加されまし た。
注意: (Windowsのように)大文字小文字を区別しないオペレーティングシステムでは、 include_once()および require_once()の動作が意図したものにならない 可能性があるので注意してください。
例 16.12. include_once() はWindowsでは大文字小文字を区別しません
include_once("a.php"); // a.phpを読み込みます
include_once("A.php"); // Windowsはこれもa.phpを読み込みます!
PHP 4.3.0 より前のバージョンの Windows 版 PHP は、現在この関数に関してリモートファイルアクセス機能を サポートしていません。これは、allow_url_fopen を 有効にした場合でも同様です。
include()、require()、 require_once()、 get_required_files()、 get_included_files()、 readfile()、virtual() も参照してください。
include_once
09-Aug-2007 07:29
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.