我试图理解codeigniter中的框架结构,我刚刚开始,并提出了这个小小的误解。
所以有人能帮助我站在下面:
1-为什么他们使用引用来传递类的实例…我的意思是为什么不只是一个简单的变量?
2-为什么函数将类的名称存储在一个数组中而不是一个“字符串变量”(请不要将我的php术语判断为im是最差的)。?!
static $_classes = array();
^^^^^^^ this cloud be just ("") or am i missing something
这是函数,所以你不会去找它。
function &load_class($class, $directory = 'libraries', $prefix = 'CI_')
{
static $_classes = array();
// Does the class exist? If so, we're done...
if (isset($_classes[$class]))
{
return $_classes[$class];
}
$name = FALSE;
// Look for the class first in the local application/libraries folder
// then in the native system/libraries folder
foreach (array(APPPATH, BASEPATH) as $path)
{
if (file_exists($path.$directory.'/'.$class.'.php'))
{
$name = $prefix.$class;
if (class_exists($name) === FALSE)
{
require($path.$directory.'/'.$class.'.php');
}
break;
}
}
// Is the request a class extension? If so we load it too
if (file_exists(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php'))
{
$name = config_item('subclass_prefix').$class;
if (class_exists($name) === FALSE)
{
require(APPPATH.$directory.'/'.config_item('subclass_prefix').$class.'.php');
}
}
// Did we find the class?
if ($name === FALSE)
{
// Note: We use exit() rather then show_error() in order to avoid a
// self-referencing loop with the Excptions class
exit('Unable to locate the specified class: '.$class.'.php');
}
// Keep track of what we just loaded
is_loaded($class);
$_classes[$class] = new $name();
return $_classes[$class];
}
最佳答案
关键是static
之前的$_classes = array();
关键字。这使得$_classes
数组在多次调用函数之间保持其值。基本上,它们将它用作实例化类的本地缓存。为了这个目的,一根绳子不起作用。
有关静态关键字in the manual的详细信息。
至于引用返回,我认为这是PHP4的行李,CI被支持在PHP4直到2。x。您可能会发现这个“AA>”来看看从PHP4到PHP5的变化。