我现在很难过.在我关于这个问题的上一篇文章中,答案是使用单例来确保一个对象只启动一次,但我遇到了相反的问题.
如果我有一个名为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';
?>
Run Code Online (Sandbox Code Playgroud)
然后在所有4个测试文件中,我将尝试从会话类访问一个名为get()的方法,假设会话类文件已经包含在index.php页面中.
现在,如果我尝试使用......
$testvar = $session->get($var1);
Run Code Online (Sandbox Code Playgroud)
在任何测试类文件中,我都会收到此错误
Fatal error: Call to a member function get() on a non-object
Run Code Online (Sandbox Code Playgroud)
代码在没有错误的情况下工作的唯一方法是使用
$session = new Session();
Run Code Online (Sandbox Code Playgroud)
在每个文件中.
如何在index.php文件中初始化时,如何修复/避免必须在每个文件中初始化该类?
我们的目标是让我启动类1个文件一样的index.php然后包含类文件到该页面,美中不足的是大多数类使用其他类的方法,以便将是很好,如果我没有启动每个文件中的每个类
没有看到代码就很难说,但我想我可以做一些假设.如我错了请纠正我:
编辑:所以发布您的来源,以便我们可以停止推测
1)您包含的文件是类文件.换句话说,它们包含如下内容:
class a
{
function a(){}
function b()
{
}
}
Run Code Online (Sandbox Code Playgroud)
2)您不是在加载时尝试在类文件中执行代码,而是稍后通过实例化它们来执行代码
即
require("class.a.php");
$myA = new a();
$a->b();
Run Code Online (Sandbox Code Playgroud)
如果您尝试在这些类中引用会话变量,那么您会遇到范围问题.在类定义之外声明的变量不能在类中使用,除非它在类中声明为全局变量.
class a
{
function a(){}
function willFail()
{
$session->doSomething(); //fails
}
function b()
{
global $session;
$session->doSomething(); //succeeds
}
}
Run Code Online (Sandbox Code Playgroud)
即便如此,您可能不希望这样做,但是如果类需要访问它,您应该将会话作为变量传递:
class a
{
function a(){}
function b($session)
{
$session->doSomething(); // yay!
}
}
Run Code Online (Sandbox Code Playgroud)