Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Extensions > Как в теле класса объявить глобалную переменную?


Автор: мухр 18.10.2006, 06:18
Необходимо использовать в классе перепенные, объявленные вне этого класса. Переменные в классе объявляются с помощью "public". Как бы в эту область можно выцепить внешнюю переменную?

Автор: Mal Hack 18.10.2006, 08:11
Сам понял что сказал?

Цитата(мухр @  18.10.2006,  07:18 Найти цитируемый пост)
Необходимо использовать в классе перепенные, объявленные вне этого класса.

global.

Автор: мухр 18.10.2006, 08:14
global - это внутри функции. Как сделать это внутри класса, чтобы они потом вызывались, как $this->var ? Где, собственно, var - изначально внешняя переменная.
По-сути, мне нужно на основе внешних переменных сформировать конфигурационный массив внутри класса.

Добавлено @ 08:20 
Ну вот пример из мануала:
Код

class SimpleClass
{
    // member declaration
    public $var = 'a default value';

    // method declaration
    public function displayVar() {
        echo $this->var;
    }
}

Но в переменную $var необходимо подставить значение внешней переменной.

Автор: -=Ustas=- 18.10.2006, 09:50
Код

class SimpleClass
{
    // member declaration
    public $var = 'a default value';
    // method declaration
    public function displayVar() {
        echo $this->var;
    }
    
    public function SimpleClass()
    {
        GLOBAL $simpleVar;
        $this->var =& $simpleVar;
    }
}

Тольк к чему такой изврат... это не правильно.

Автор: мухр 18.10.2006, 10:14
Можно это объявить как-нить не в теле функции, а в теле класса? Предполагается, что класс содержит несколько функций и пользуется неким общим массивом данных, объявленных внутри класса, среди которых могут быть заимствованные данные из внешних переменных.
Код

$cfg = Array();
$cfg['shablon_folder'] = 'shablon/';
// ... и многое другое
class SimpleClass    
{    
    public $var = $cfg['shablon_folder'].'form/';    
}

Вот такая запись почему-то не срабатывает. Выдаётся какая-то синтаксическая ошибка. Никаких слияний строк и арифметических действий.

Автор: smartov 18.10.2006, 11:07
мухр, перечитал доку, похоже что нельзя провозгласить глобальную переменную в теле класса - только в функциях класса.

Автор: -=Ustas=- 18.10.2006, 12:50
мухр, зачем делать привязку на глобальную видимость?! Сама реализация класса не должна зависеть от внешних переменных, это плохой подход. Лучше уж так:
Код

$cfg = Array();
$cfg['shablon_folder'] = 'shablon/';
// ... и многое другое
class SimpleClass    
{    
    public $var = $cfg['shablon_folder'].'form/';    
}

$Obj = new ....
$Obj->var =& $cfg;

Автор: Mal Hack 18.10.2006, 16:05
Через конструктор. Зачем люди придумали...

Автор: -=Ustas=- 19.10.2006, 09:20
Цитата(Mal Hack @  18.10.2006,  16:05 Найти цитируемый пост)
Через конструктор. Зачем люди придумали... 

Ну тогда в конструкторе все равно придется глобал делать.

Автор: <Spawn> 23.10.2006, 13:44
-=Ustas=-, Зачем это?

Код

class SomeClass
{
  private $someVariable;

  public function __construct($someVariable)
  {
    $this->someVariable = $someVariable;
  }
}

$externalVariable = 'Сейчас меня передадут в экземпляр класса...';

$someClassInstance = new SomeClass($externalVariable);

Автор: Mal Hack 23.10.2006, 18:46
Цитата(-=Ustas=- @  19.10.2006,  10:20 Найти цитируемый пост)
Ну тогда в конструкторе все равно придется глобал делать. 

Еще вариант, это ссылку на объект передать, в качестве параметрп. Сам так поступаю.

Автор: Eugene_Bond 24.10.2006, 17:31
Если речь идет о кофигурационных переменных -- для этого существет http://php.net/define

Автор: -=Ustas=- 24.10.2006, 20:01
<Spawn>, да, не подумал сразу.

Автор: мухр 25.10.2006, 08:07
Странная тут фигня происходит. На локалке-Денвере вроде нормально всё, а на сервере такая ерунда выдаётся, когда использую "public" для переменной:
Цитата

Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /usr/home/smolosid/domains/bakanov.info/public_html/ivep/classes/form.php on line 74

Фрагмент на 74 строке следующий:
Код

public $cfg = Array(
'shablon_prefix' => 'form/',
'form_name' => 'form',
'full_block_types' => Array('title', 'comment')
);

Что бы это могло быть, и как лучше исправить? smile 

Автор: мухр 25.10.2006, 08:40
Буду пользоваться следующим изворотом: smile 
Код

// Конфигурации
function cfg($key = '') {
global $cfg;
$cfg_this = Array(
'shablon_prefix' => 'form/',
'form_name' => 'form',
'full_block_types' => Array('title', 'comment')
);
if (isset($cfg_this[$key])) return $cfg_this[$key]; else return false;
}

Вызывается следующим образом:
Код

// Заголовок
function title ($params = Array()) {
// ...
$return_str = get_shablon($this->cfg('shablon_prefix').'simple_block_title', $search, $replace);
// ...
return $return_str;
}

В том числе и наследование внешних данных здесь также допустимо.

Автор: BobiKK 25.10.2006, 13:59
Вопрос: а не лучше ли это всё дело привести к паттерну регистра?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)