0

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

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 中,我的子控制器中还有一个旁注,我构造了 Parentparent::_construct();

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

4

2 回答 2

0
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
    }
}
  • &注意:处理对象时不必使用符号。对象通过引用自动传递。
于 2013-02-19T19:49:02.467 回答
0

您可以创建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

编辑

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

于 2013-02-19T19:51:15.430 回答