2010-03-22 14 views
1

Мы используем экземпляр и кладем системные критические объекты в $GLOBALS для удобного доступа из любого места (например, DB, Cache, User и т. Д.).Нажать переменную в глобальную область?

Мы используем $GLOBALS так, чтобы он (да, действительно) немного снизил количество кода, если бы я мог ссылаться на него как $G = &$GLOBALS для сокращенного вызова.

Проблема заключается в том, что по моему опыту и нескольким часам Googling я не нашел никакой конструкции в PHP, которая позволяет вам «флаг» как глобальный, делая $GLOBALS первый класс, а все остальное - второму классу.

Я что-то упустил? Это возможно?

ответ

1
global $variable; //? 
+1

Это только открывает отверстие в установленном объеме, оно не является проактивным при прорыве дочерних областей. – Spot

2

Вместо того, чтобы все в $GLOBALS вы можете захотеть взглянуть на registry concept, которая широко распространена в мире PHP.

Однако наличие множества глобальных переменных/объектов является признаком плохой конструкции и высокой сцепки. Используя что-то вроде $G, он гарантирует код спагетти и скороходный кошмар. Кого волнует, если вы можете отбросить количество кода несколькими символами?

+0

Мы не ставим все в '$ GLOBALS'. В '$ GLOBALS' может быть восемь (8) объектов. Если что-то критично для системы, потому что это необходимо для каждой pageload & доступно очень часто, мы помещаем его в '$ GLOBALS'. – Spot

+0

Почему бы не загрузить реестр до любой другой операции? – Benoit

+0

Если вы используете downvote, пожалуйста, дайте мне знать, почему я могу учиться на своих ошибках. – middus

1

В дополнение к концепции реестра Middus указывает, существует несколько подходов и концепций вокруг этого, некоторые из которых вы можете найти в ответах на этот вопрос:

In a PHP project, how do you organize and access your helper objects?

+0

Это отличная ссылка! Большое спасибо! – Spot

+1

@Pekka, неработающая ссылка, попробуйте обновить этот ответ с помощью другой ссылки! – Zuul

2

Нет, но вы можете используйте небольшой трюк. Создайте глобальную функцию с тем же именем, что и ваш глобальный var, и верните глобальный экземпляр. Например .:

function db() { 
    return $GLOBALS['db']; 
} 

Теперь вы можете написать код, как:

... 
$stuffs = db()->query("select * from stuff"); 
... 

Вы можете признать это как вариант по образцу одиночки, но синтаксически гораздо более приятным.

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

+0

Идея глобальной функции интересна. Он добавляет другой вызов функции для большинства системных вызовов, но это может стоить того. Чтобы быть ясным, мы буквально имеем 8 объектов в GLOBALS, и они являются экземплярами объектов, которые используются _constantly_. Наша система полностью автономна. Мы вообще не используем сторонний код. У нас на самом деле были проблемы с ней, через пять лет. Я понимаю озабоченность глобальными данными, но на самом деле это не так. Мы очень внимательно относимся к глобальным данным. Мы даже поставили все наши контроллеры в закрытие, чтобы быть в безопасности. :) Спасибо за ответ – Spot

4
<?php 

function &G($name) { 
    if(func_num_args() > 1) { 
     $GLOBALS[$name] = func_get_arg(1); 
    } 
    return $GLOBALS[$name]; 
} 


G('test', 'hey'); 

echo G('test'); // outputs hey 
echo $test; // outputs hey 

$b =& G('test'); 
$b = 'hello'; 

echo G('test'); // outputs hello 
echo $test; // outputs hello 
Смежные вопросы