[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Классы и глобальные переменные
Страницы: 1, 2, 3
MonaRx
Здравствуйте!
А суть сводится вот к чему:
есть класс, в нем методы; есть ассоциативный массив сообщений (находится в другом файле); через include подключаю файл с массивом к файлу с классом. Нужно, чтобы массив был доступен из класса. Как сделать, подскажите, если кто знает? Всю голову уже сломал...

_____________
disc
Код
public function getArray() {
    return include_once('array.php');
}

при этом arraу.php выглядет примерно так:

Цитата
return array('key'=>'value','key2'=>'value','key3'=>'value');


_____________
emp
Может просто
Код
require_once ("file.php");
class SomeClass
{
   ...
   global $array;
}

http://php.net/manual/ru/language.variables.scope.php
MonaRx
emp - увы, в классе почему-то не работает...
disc - гм, стоит php4... дело в том что файл содержит 3 массива ($err_msg=array(...);$struct_news=array(...);$struct_cat=array(...)wink.gif

_____________
MonaRx
цель - в результате вернуть значение элемента одного из массивов

_____________
MonaRx
Код
function OpenNew($id){
  ...
  if($id<=0)
    return $err_msg['NO_ID'];
  ...
}


_____________
disc
Цитата(MonaRx @ 21.1.2008, 21:54) [snapback]32335[/snapback]
emp - увы, в классе почему-то не работает...
disc - гм, стоит php4... дело в том что файл содержит 3 массива ($err_msg=array(...);$struct_news=array(...);$struct_cat=array(...) wink.gif

3 массива - сделай 3 вложенных массива, и в каждом из них своя инфа, а на счет пхп4, это очень плохо, пора для ООП уже на 5ке работать

_____________
emp
Цитата
emp - увы, в классе почему-то не работает...

И не будет. Нужно в каждом методе объявлять.
MonaRx
emp - имеется ввиду, что в методы не передаются глобальные переменные вааще,
то есть
Код
global $err_msg;
echo $err_msg['NO_ID'];
выводит пустую строку...

disc - спасибо. не фонтан, но работает...

_____________
emp
Код
$a = "test";

class example
{
   public function print_test ()
   {
      global $a;
      echo $a;
   }
}

$b = new example;
$b->print_test ();

Только что специально проверил. Выводит строку "test". Не передаются, говорите?
mechanic
а почему бы не:
Код
class test {
    private $err_msg;
    private $struct_news;
    private $struct_cat;

    function test() {
        include_once 'arrayfile.php';
        $this->err_msg     = $err_msg;
        $this->struct_news = $struct_news;
        $this->struct_cat  = $struct_cat;
    }
    function use() {
        //а тут юзается
    }
}



_____________
Dune
В топку глобальные переменные - используйте синглетоны.

Код

class Dune_Class
{
static private $instance = NULL;

static function getInstance()
{
if (self::$instance == NULL)
{
self::$instance = new Dune_Class();
}
return self::$instance;
}
private function __construct()
{
// Тело конструктора
}

// Методы класса
}


Смысл:
Сам объект создать нельзя. Такое: $a = new Dune_Class - приведёт к ошибке.
Объект создаётся как: $a = Dune_Class::getInstance()

Здесь при повторном вызове стат. метода возвращается указатель на объект, созданный ранее.

Т.е. если данные и методы обернуть в класс, то они будут доступны из любого места в коде. Достаточно создать объект.


И ещё советую почитать что-нибудь о типовых проектах.

_____________
emp
Цитата
В топку глобальные переменные - используйте синглетоны.

В некоторых случаях (в этом в том числе) - это неоправданно и не нужно.
Dune
Естественно применяется только для повышения удобства и абстракции.
Т.е. есть возможность строить блоки данных к которым можно в любой момент сослаться.

_____________
Ranerg
Вообще, глобализировать переменные лучше в конструкторе класса:) Это поможет использовать переменную не только в одном методе, как это предложил нам emp, а во всем классе:) Приведу пример:) Например у нас есть класс для работы с MySQL и его нужно использовать внутри других классов так, чтобы мы его не размоножили:)


$database = new DB();

class Example {
public $database;

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

public function print_test(){
echo $this->database->query('SELECT * FROM tbl');
}
}



Вероятно, что мой пример даст ответы на некоторые вопросы:)
Вообще то, что я пишу не соответствует полностью темы. Но я сюда попал именно по проблеме глобальных переменных, чтобы обойти паттерн проектирования Singleton:)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.