2013-02-19 3 views
0

это заводило меня орехами (выпивка Нецензурные количества кофе и работа на всю ночь не помогает) Я хочу получить доступ к классу, где бы я ни находился в приложении. Я создаю экземпляр класса на моей индексной странице (который автоматически загружает мои библиотеки lib/classes). Но, похоже, я не могу получить глобальный доступ к нему. Это мой индекс страницы:Php доступ к глобальному классу

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

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

Автомобиль загрузить мои Lib/классы отлично, а затем я создаю экземпляр моего ядра (Это автоматически загружается в моем Lib/core.php)

Тогда в моей основной, где Я создаю обычное соединение с базой данных, получаю и проверяю URL-адрес и где я создаю несколько классов (которые загружаются автоматически). Я создаю __construct, и именно здесь я хочу создать экземпляр класса Template. Я хочу иметь глобальный доступ для доступа к классу в любом из моих контроллеров и моделей.

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-object и Fatal error: Call to a member function get_data() on a non-object.

+0

Почему бы просто не передать '$ Core' в качестве параметра конструктору? –

+0

Связано прочитано: http://stackoverflow.com/questions/11923272/use-global-variables-in-a-class/11923384#11923384 – PeeHaa

ответ

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 
    } 
} 
  • Примечание: Вы не должны использовать & знак при работе с объектами. Объекты автоматически передаются по ссылке.
+0

Привет @Jari Я пробовал это, и возникла следующая ошибка. Допустимая фатальная ошибка: Аргумент 1 прошел to Controller :: __ construct() должен быть экземпляром Core, none given, – HireLee

+0

@LeeMarshall, вы должны передать экземпляр ядра.Как и новый ContollerChild (новый Core()), ' – vikingmaster

0

Вы можете сделать Core a 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.

Редактировать

Обновлено продемонстрировать, как построить с помощью статической функции ш/вывода.

+0

Спасибо за комментарий, я поместил код в свой класс Core и поставил $ core = Core :: getInstance(); и произошла следующая ошибка. Неустранимая ошибка: исключить исключение «Исключение» с сообщением «Ядро еще не сконструировано» в – HireLee

+0

Да, сначала его нужно построить. См. Мое обновление – Martin

+0

Я получаю Неустранимая ошибка не может переопределить класс Индекс и два предупреждения о пропавших аргументах 4 и 5 для Core :: construct() – HireLee

Смежные вопросы