2010-05-25 2 views
0

$GLOBALS['current_view'] и global $current_view, которые вы предпочитаете и почему?Методы доступа к глобальным переменным PHP

+0

Я думаю, вы должны спросить * что лучше практика * в отличие от того, что люди относятся (несмотря на то, что они могли бы быть то же самое). – alex

+0

@alex Есть небольшие отличия. – Artefacto

+0

@Artefacto Да, но я бы предпочел использовать код для лучшей практики, чем то, что кто-то в Интернете * предпочитает *. – alex

ответ

10

Не передавайте параметры в методы. Каждый раз, когда вы используете глобалы, Бог убивает котенка.

3

Если я должен использовать глобальные переменные, и я избегаю их, как чуму, я использую глобальный $ current_view. Я просто предпочитаю всегда иметь локальную переменную, а не полагаться на супер-глобальные. Но я думаю, что это вопрос предпочтения.

3

Лично я предпочитаю синтаксис $GLOBALS['glob'], потому что я могу просто скопировать вставку кода, не беспокоясь о объявлении переменных как глобальных. Имейте в виду, что вы должны попытаться свести глобальные значения к минимуму (возможно, только глобальные директивы конфигурации и даже там ...).

Однако эти два метода не являются однозначными; есть небольшая разница:

function func() { 
    var_dump($GLOBALS['glob']); 
} 

function func2() { 
    global $glob; 
    var_dump($glob); 
} 

Первый будет выдавать уведомление, если глобальные «Глобо» не существует. Второй - нет.

В первом случае, отправка $GLOBALS['glob'] в качестве аргумента компилирует:

 3  FETCH_R      global    $0  'GLOBALS' 
    4  FETCH_DIM_R          $1  $0, 'glob' 

Вы выборки GLOBALS и его индекс glob в контексте чтения; переменная не создается.

Второй компилирует

 compiled vars: !0 = $glob 
    ... 
    2  FETCH_W      global lock   $0  'glob' 
    3  ASSIGN_REF            !0, $0 

Вы создаете ссылку на глобальный glob, поэтому он неявно создается, если она не существует.

также:

function func_unset() { 
    unset($GLOBALS['glob']); 
} 

function func2_unset() { 
    global $glob; 
    unset($glob); 
} 

Функция func() фактически снята с охраны глобального, func2_unset будет просто уничтожить ссылку, которая была создана.

Обратите внимание, что func2 очень похож:

function func3() { 
    $glob =& $GLOBALS['glob']; 
} 

Это один, однако потенциально менее эффективным. Он компилирует

 2  FETCH_W      global    $0  'GLOBALS' 
    3  FETCH_DIM_W          $1  $0, 'glob' 
    4  ASSIGN_REF            !0, $1 
0

статических классов FTW

class View { 
    private static $current = null; 
    public static function get_current() { 
     return self::$current; 
    } 
}