【问题标题】:How can I initiate a PHP class and use it in several files?如何启动 PHP 类并在多个文件中使用它?
【发布时间】:2009-09-23 01:09:53
【问题描述】:

我现在很困惑。在我关于这个问题的上一篇文章中,答案是使用单例来确保一个对象只启动一次,但我遇到了相反的问题。

如果我有一个名为 index.php 的文件,然后我将这些文件包含在其中,class1.phpclass2.phpclass3.phpclass4.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 个文件中启动一个类,然后将类文件包含到该页面中,要注意的是大多数类都使用其他类的方法,所以如果我不这样做会很好必须启动每个文件中的每个类

【问题讨论】:

  • 在这里也可以使用单例而不是全局。
  • @Frank Farmer 从我的测试中它实际上没有帮助,在我的情况下,类/对象总是在索引文件中启动 1 次,但尝试在另一个类中使用 1 个类,即使它是已经开始了,除非我使用全局,否则存在范围问题,也许我遗漏了一些东西,但我无法获得单身人士来帮助解决该范围问题

标签: php oop class


【解决方案1】:

没有看到代码很难说,但我想我可以做出一些假设。如果我错了,请纠正我:

编辑:所以请发布您的来源,以便我们停止猜测

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!
    }
}

【讨论】:

  • 您正确理解了我的问题,谢谢,这些文件都是编造的,所以这里没有什么要发布的,但是您正确地理解了我正在尝试做的事情。基本上我有一个会话类来设置和获取会话变量,然后我有一个用户类,我在用户类中有一个方法,我想从会话变量中设置 10-15 个变量,这就是我想要的地方在我的用户类中使用我的会话类
  • 另外,全局的东西似乎可以解决问题,因为我没有意识到变量区分大小写
【解决方案2】:

你可以有一个它们都继承自的基类

例子

class test1 extends Base {

    public function doSomething() {
        $this->session->get('something'); 
    }    

}

class Base {

    protected session;

    public function __construct() {
        $this->session = new Session();
    }

}

【讨论】:

    【解决方案3】:

    你有点倒退了。任何将使用会话对象的文件都需要包含包含该类定义的文件。另一种方法是使用 __autoload 将类拉入:

    function __autoload($classname)
    {
      if ($classname == 'Session')
      {
        include_once 'Session.php';
      }
    }
    

    编辑:您需要将包含该自动加载的文件放入将使用它的每个文件中。

    【讨论】:

    • 我想你误解了我的问题,自动加载已经到位并且已经包含了类,但是这里存在某种范围问题
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多