2015-11-04 3 views
-1

У меня установлен форум SMF, который является не-OO-приложением. Я надеюсь создать дополнительное приложение в директории в форуме, которая включает в себя файл SSI из SMF, а затем использует функции из SMF, но в объектно-ориентированной настройке.Получение глобальной переменной с помощью приложения OO

Если это невозможно, то прекратите читать здесь и, пожалуйста, объясните, почему, потому что я изо всех сил, чтобы выяснить, что случилось здесь (может быть тот факт, что я не спал в течение почти 24 часов)

Так это то, что у меня есть:

SMF имеет файл, SSI.php - Когда включен, это устанавливает нагрузку глобальных переменных, а также устанавливает определение

define('SMF', 'SSI'); 

у меня есть папка с названием консоли , который имеет ряд файлов. С index.php, я называю Servlet файл, который имеет

require_once '../SSI.php'; 

class Servlet 
{ 

    public function __construct(){ 

    } 

    public function processRequest(){ 
     echo SMF; 
     var_dump($context) //This is the global variable that should be set 
    } 
} 

Это выводит SSI, а затем неопределенная переменная ошибки.

Это, вероятно, действительно очевидно, но почему задано определение, а не контекст глобальный? Если я делаю это за пределами класса, он работает.

Спасибо!

-Edit-

Просто, чтобы объяснить, почему это не дубликат связанного вопроса ... Я не думаю, что нужно много объяснений, кроме этого есть конкретный вопрос, касающийся конкретной проблемы области видимости и конкретная ошибка, адаптированная к моему приложению, которая представляет собой смесь ОО и процедурного программирования, что приводит к некоторой путанице.

Мой вопрос не был «Что такое переменная область действия?»

Спасибо.

+1

Попробуйте положить 'global $ context;' перед вашим 'var_dump ($ context);'. Это очень плохой способ сделать это, но он выполнит эту работу, если глобальные переменные не находятся в более низкой области. лучший вариант - передать переменные, необходимые при вызове метода. –

+0

О, человеку, которому я должен спать, это было так очевидно, и теперь я так сильно пинаю. Спасибо, ха-ха. –

ответ

2

как указано в моем комментарии, вы можете поставить global $context; до его вызова, однако это ДЕЙСТВИТЕЛЬНО плохая практика и может привести к огромным проблемам в крупных проектах. Лучшим вариантом является передача в необходимых переменных к вызываемому методу, например:

<?php 
require_once '../SSI.php'; 

class Servlet 
{ 

    public function __construct(){ 

    } 

    public function processRequest($context){ 
     echo SMF; 
     var_dump($context); 
    } 
} 
$servlet = new Servlet(); 
$servlet->processRequest($context); 

Причина, по которой не работает в вашем примере кода происходит потому, что при создании экземпляра класса, он создает параллельный объем в глобальную область действия, поэтому переменная $context не существует внутри класса, если вы не поместили ее там через параметр или не указали php, какую область действия для этой переменной следует использовать с помощью модификатора global.

+0

Очень хорошо, большое вам спасибо. Я довольно новичок в ООП, и поэтому я понял, когда дело дошло до масштаба и не подумало просто передать его в качестве параметра. –

0

У вас отсутствует «между вашим определенным содержимым переменной и скобкой. Возможно, это копия &, вставьте ошибку, но, чтобы быть уверенным.