我正在关注PRO PHP AND JQUERY
一书中的一些例子,但出于某种原因,这些例子不起作用。即使我从书籍网站下载的示例也不起作用。不确定什么是错的,因为我完全按照书中所做的那样......
/public/Index.php
include_once '../sys/core/init.inc.php';
$cal = new Calendar($dbo, "2010-01-01 12:00:00"); //ERROR Class 'Calendar' not found
/sys/core/init.inc.php
function __autoload($class)
{
$filename = "../sys/class/class." . $class . ".inc.php";
if ( file_exists($filename) )
{
include_once $filename;
}
}
/sys/class/class.calendar.inc.php
class Calendar extends DB_Connect
{
private $_useDate;
private $_m;
private $_y;
private $_daysInMonth;
private $_startDay;
/**
* Create a database containg relevant info
*
* @param object $dbo a database object
* @param string $useDate the date to build calender
*/
public function __construct($dbo=NULL, $useDate=NULL)
{
/*
* Call the parent constructor to check db object
*/
parent::__construct($dbo);
}
}
这非常令人讨厌,因为书中的每一章都建立在这个简单的基础之上。我的猜测是__autoload()
是问题所在,但我不知道......
答案 0 :(得分:3)
文件路径没有指向正确的位置。
在Index.php
...
define('DOCROOT', dirname(__FILE__));
...然后像这样修改你的__autoload()
......
function __autoload($class)
{
$filename = DOCROOT . "/sys/class/class." . strtolower($class) . ".inc.php";
if ( file_exists($filename) )
{
include_once $filename;
}
}
在包含文件名之前,您应strotlower()
,因为您的课程为Calendar
,但您的文件名为calendar
。
答案 1 :(得分:1)
首先,根据官方文件,你不鼓励在新代码中使用__autoload(),因为它可能在未来被删除或删除;相反,像这样使用spl_autoload_register():
//first define a custom function
function myAutoLoader( $className ){
$path = strtolower( path/to/your/class/ . $className . '.php' );
include_once( $path );
}
注意我们如何strtolower()$ className。这是为了确保类名(通常以大写字母开头)与文件名一致(通常全部为小写)。在某些环境(尤其是Windows)中,这可能不是必需的,而只是为了更安全。例如,我不必在我的开发环境中使用Windows,但我的生产环境(debian)不会接受它。
然后将该函数名称作为参数传递给spl_autoload_regsiter。请注意,函数名称是字符串
//Now use spl_autoload_register()
spl_autoload_register( 'myAutoLoader' );
如果您希望捕获异常,您可以在自定义函数中执行以下操作:
//first define a custom function with exception handling
function myAutoLoader( $className ){
$path = strtolower( path/to/your/class/ . $className . '.php' );
include_once( $path );
if( !class_exists( $className, false ) ){
throw new RuntimeException( 'Class '. $className . ' has not been
loaded yet' );
}
}
//then the spl_autoload_register(), just like before
spl_autoload_register( 'myAutoLoader' );
然后,在声明你的课程时,你必须抓住抛出的异常。
答案 2 :(得分:0)
我使用'
替换"
时出现此类型错误,如果使用"
,则不会出现此错误:
正确的写作:
function __autoload($class) {
echo HOME_INC."/$class.class.php";
if(is_file(HOME_INC."/$class.class.php")){
include_once HOME_INC."/$class.class.php";
}elseif(is_file(ADMIN_INC."/$class.class.php")){
include_once ADMIN_INC."/$class.class.php";
}
}
错误的写作:
function __autoload($class) {
echo HOME_INC.'/$class.class.php';
if(is_file(HOME_INC.'/$class.class.php')){
include_once HOME_INC.'/$class.class.php';
}elseif(is_file(ADMIN_INC.'/$class.class.php')){
include_once ADMIN_INC.'/$class.class.php';
}
}