我现在很为难。 在我关于这个问题的最后一个职位的答案是使用一个单,以确保一个对象仅启动1次,但我有相反的问题。
如果我有一个名为index.php文件,然后我有这些文件进去,class1.php,class2.php,class3.php,class4.php。
在我的index.php都会有,
<?PHP
$session = new Session();
require_once '/includes/class1php';
require_once '/includes/class2.php';
require_once '/includes/class3.php';
require_once '/includes/class4.php';
?>
然后在测试文件,我会尝试从会话类访问的方法名为get(),假设会话类文件的所有4个已纳入index.php页面为好。
现在,如果我尝试使用...
$testvar = $session->get($var1);
在任何测试类的文件,我会得到这个错误
Fatal error: Call to a member function get() on a non-object
代码工作没有错误的唯一方法是,如果我使用
$session = new Session();
在每一个文件。
如何解决/避免必须initaite在每一个文件中的类时,它在index.php文件已经initated?
我们的目标是让我启动类1个文件一样的index.php然后包含类文件到该页面,美中不足的是大多数类使用其他类的方法,以便将是很好,如果我没有启动在每一个文件中的每一类
如果没有看到代码,这很难说,但我想我可以做一些假设。 如我错了请纠正我:
编辑:因此,发布您的源,以便我们可以停止猜测
1)要包括的文件类文件。 换句话说,它们含有类似:
class a
{
function a(){}
function b()
{
}
}
2)你是不是想在类文件执行代码,在加载时,但在一段时间后通过初始化它们
即
require("class.a.php");
$myA = new a();
$a->b();
如果你想引用这些类中的会话变量,那么你有一个范围的问题。 一个类定义之外声明的变量不能在类内使用,除非它被声明为类中的全局变量。
class a
{
function a(){}
function willFail()
{
$session->doSomething(); //fails
}
function b()
{
global $session;
$session->doSomething(); //succeeds
}
}
即使是这样,你可能不希望这样做,而是你应该在你的会话传递作为一个变量,如果类需要访问它:
class a
{
function a(){}
function b($session)
{
$session->doSomething(); // yay!
}
}
你可以有一个基类,它们都全部来自延伸
例
class test1 extends Base {
public function doSomething() {
$this->session->get('something');
}
}
class Base {
protected session;
public function __construct() {
$this->session = new Session();
}
}
你有种想它倒退。 将使用会话对象的任何文件将需要包括含有类定义的文件。 另一种方法是使用__autoload拉在类:
function __autoload($classname)
{
if ($classname == 'Session')
{
include_once 'Session.php';
}
}
编辑:你需要把包含自动加载该文件到每个将使用它的文件。