我现在很难过。在我关于这个问题的上一篇文章中,答案是使用单例来确保一个对象只启动一次,但我遇到了相反的问题。
如果我有一个名为 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';
?>
然后在所有4个测试文件中,我将尝试从会话类访问名为 get()的方法,假设会话类文件已包含在index.php页面也是如此。
现在,如果我尝试使用......
$testvar = $session->get($var1);
在任何测试类文件中我都会收到此错误
Fatal error: Call to a member function get() on a non-object
代码在没有错误的情况下工作的唯一方法是使用
$session = new Session();
在每个文件中。
如果已经在index.php文件中初始化了每个文件,我该如何修复/避免必须初始化该类?
目标是让我在index.php这样的1个文件中启动一个类,然后将类文件包含到该页面中,catch是大多数类使用其他类的方法所以如果我不这样做会很好必须启动每个文件中的每个类
答案 0 :(得分:5)
没有看到代码就很难说,但我想我可以做一些假设。如果我错了,请纠正我:
编辑:所以发布您的来源,以便我们可以停止推测
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!
}
}
答案 1 :(得分:1)
你可以拥有一个基类,它们都来自
实施例
class test1 extends Base {
public function doSomething() {
$this->session->get('something');
}
}
class Base {
protected session;
public function __construct() {
$this->session = new Session();
}
}
答案 2 :(得分:-1)
你有点向后看。将使用会话对象的任何文件都需要包含包含该类定义的文件。另一种方法是使用__autoload将类拉入:
function __autoload($classname)
{
if ($classname == 'Session')
{
include_once 'Session.php';
}
}
编辑:您需要将包含该自动加载的文件放入每个将使用它的文件中。