【问题标题】:Php access a Global Classphp访问一个全局类
【发布时间】:2013-02-19 19:45:55
【问题描述】:

这让我发疯了(喝大量的咖啡和通宵工作无济于事)我想从我在应用程序中的任何位置访问课程。我在我的索引页面中实例化类(它会自动加载我的库/类)但似乎我无法获得对它的全局访问。这是我的索引页:

function __autoload($class)
{
    require LIBS . $class .'.php';
}

$Core = new Core($server, $user, $pass, $db);

这会完美地自动加载我的 Lib/类,然后我实例化我的核心(这是在我的 Lib/core.php 中自动加载的)

然后在我的核心中创建通常的数据库连接,获取并检查 URL 以及实例化几个类(自动加载的类)的位置我创建一个 __construct,这是我要实例化模板的位置班级。我希望有全局访问权限来访问我的任何控制器和模型中的类。

class Core {

    function __construct(DATABASE VARIABLES IN HERE)
    {
        $this->Template = new Template();
    }

}

好的,我想我可以通过在父模型和父控制器中执行以下操作来访问模板对象:

class Controller
{

    public $Core;

    function __construct()
    {
        global $Core;
        $this->Core = &$Core;
    }
}

控制器是我所有控制器的父级扩展,因此我假设我可以只写$this->Core->Template->get_data(); 来访问模板方法?这似乎会引发错误。

我确定这一定是我忽略的一些简单的事情,如果有人能帮我一把,那就太好了。这个问题快把我逼疯了。

在我的 __construct 中我的子控制器中还有一个旁注,我构造了父 parent::_construct();

错误似乎是Notice: Trying to get property of non-objectFatal error: Call to a member function get_data() on a non-object

【问题讨论】:

标签: php


【解决方案1】:
class Controller
{

    public $Core;

    function __construct(Core $core)
    {
        $this->Core = $core;
    }
}

class ControllerChild extends Controller {
    function __construct(Core $core, $someOtherStuff){
      parent::__construct($core) ;
      //And your $this->Core will be inherited, because it has public access
    }
}
  • 注意:处理对象时不必使用& 符号。对象通过引用自动传递。

【讨论】:

  • 嗨@Jari 我试过这个并且发生了以下错误可捕获的致命错误:传递给 Controller::__construct() 的参数 1 必须是 Core 的实例,没有给出,
  • @LeeMarshall 你必须传递一个核心实例。喜欢new ContollerChild(new Core()) ;
【解决方案2】:

您可以将Core 设为singleton 并实现一个静态函数来接收指向该对象的指针。

define ('USER', 'username');
define ('PASS', 'password');
define ('DSN', 'dsn');

class Core {

  private static $hInstance; 

  public static function getInstance() { 
    if (!(self::$hInstance instanceof Core)) {
        self::$hInstance = new Core(USER, PASS, DSN);
    } 

    return self::$hInstance; 
  }

  public function __construct($user, $pass, $dsn) {
     echo 'constructed';
  }
 }

然后在你的控制器中你可以使用:

$core = Core::getInstance();

应该输出constructed

编辑

更新以演示如何通过带输出的静态函数进行构造。

【讨论】:

  • 感谢您的评论,我将代码放在我的核心类中并放入 $core = Core::getInstance();并发生以下错误 致命错误:未捕获的异常 'Exception' with message 'Core was notConstructed yet' in
  • 我收到一个致命错误,无法重新声明类索引和两个关于 Core::construct() 缺少参数 4 和 5 的警告
  • 我又试了一次.. $core = Core::getInstance();这会进入我的父控制器 __construct 吗?
  • 我使用 __construct 来检查 url 并加载适当的控制器......所以如果它是这个 www.site.com/index 它会加载索引控制器......通过尝试你提供的代码似乎它构造但统计了无法重新定义类索引的致命错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多