2016-07-26 2 views
2

В чем разница между объявлением переменной в функции как global или public/private VS, передающей ее функции в качестве аргумента?В PHP, в чем разница между объявлением переменной как глобальной внутренней функции или передачей переменной в качестве аргумента функции?

Другое родственное спутанность

Я недавно вызвал себе большую головную боль пытается передать аа переменную массива в функцию в качестве global и редактирования внутри и в надежде вернуть его изменился, и он взял меня часов выяснить, что мне нужно, чтобы передать его в функцию в качестве аргумента ссылки, как functionCall(&$arrayVar);

вопрос второстепенный: Но я до сих пор удивляюсь, почему он не работает, чтобы передать переменную в качестве global затем отредактировать его и выплюнуть его обратно return или просто сделать что-то вроде конкатенации в массив переменных?

Еще один пример, с которым я столкнулся, - это сделать функцию PHPMailer, где я передаю ей несколько аргументов, таких как адрес электронной почты и тело сообщения, но мне также необходимо передать строки аутентификации, такие как ключ API и т. Д. . при этом каждый раз, когда я называю это:

  1. Я не хочу, чтобы передать ему свои учетные данные каждый раз, когда я вызываю функцию PHMailer (например, по электронной почте сообщения об ошибке в одном из нескольких этапов)
  2. Но я хочу передавать ему уникальные аргументы каждый раз, когда я это называю

Поэтому я полагал, что лучший способ, как это:

function phpMailer($mail_to = "[email protected]", $mail_from = "[email protected]") { 
    global $authCredentials; 
} 

// And of course, when I call phpMailer, I call it like 
phpMailer("[email protected]", "[email protected]"); 

Третичный вопрос: ли это уместно использование global или есть какой-то другой способ, которым я должен делать это?

+0

Разница в том, что последнее является явным. Вы знаете, откуда приходит переменная, и кто имеет право изменять ее. – zerkms

+0

a. они в основном идентичны –

+0

'global' является неправильным произведением. PHP не имеет глобальных переменных (кроме $ _GET/POST/...). Они всегда связаны с областью. Если «передать его в» не сработало, то обычно из-за того, что вы начали в локальной области и не переписывали имя переменной соответственно. – mario

ответ

2

Есть много вопросов здесь, я буду стараться, чтобы пройти через них ...

В чем разница между объявлением переменной внутри функции как глобального или общественного/частного VS передачи его к как аргумент?

global - это тип variable scope. Объявление переменной как global обычно считается плохой практикой, и вы должны попытаться избежать этого. Передавая переменную функции в качестве аргумента, код более многократно используется, потому что вы знаете, что ожидает функция, и она не полагается на неизвестную глобальную переменную mystery.

public, private, protected являются типы visibility, используемые в object oriented programming. Они в основном определяют, как к свойствам и методам внутри класса могут обращаться другие классы.

меня ушел час, чтобы понять, что мне нужно, чтобы передать его в функцию в качестве аргумента по ссылке

что-то, чтобы понять, о функциях, в том, что если вы не pass arguments by reference вы работаете с копией переменная, а не оригинал.

почему она не работает, чтобы передать переменные в качестве global затем отредактировать его и выплюнул его обратно с return или просто делать что-то вроде конкатенации переменного массива?

Вам не нужно будет return в global переменной, потому что вы работаете с исходным значением. Пожалуйста, обратитесь к ссылке выше о сфере.

Другой пример, который я недавно столкнулся, сделав функцию для PHPMailer, где я передаю это несколько аргументов, как электронная почта на адрес и тело сообщения, но я также должен передать его аутентификации строки, как ключ API и т. д.

Существует несколько способов приблизиться к этому в дополнение к использованию global. Если вы собираетесь использовать этот ключ аутентификации в более чем одном месте, самое простое решение, вероятно, будет определять constant, например:

define('AUTH', 'my_key'); 
function phpMailer($mail_to = "[email protected]", $mail_from = "[email protected]com") { 
    echo AUTH; 
} 

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

class phpMailer() 
{ 
    private $auth = 'my_key'; 

    public function send($mail_to, $mail_from) 
    { 
     $this->auth; 
    } 
} 
$mail = new phpMailer(); 
$mail->send('[email protected]', '[email protected]'); 

Надеюсь, это поможет. Онлайн-документация PHP, найденная в ссылках выше, содержит множество информации.

+0

Я все еще изучаю это и документы, дни спустя. Вопрос: выполнив 'global $ someVar;' is '$ someVar' теперь доступен через' $ GLOBALS ['someVar'] '? –

+0

Кроме того, метод 'private ... $ this-> auth;' выглядит отлично, но я сохраняю все свои ключи auth в разделах 'config.ini.php' (например,' [gmail] api_key = "hello"; [api_2] ... 'тогда я получаю ключи через' $ config = file_get_contents ("config.ini.php"); 'и использовать его внутри функции как' global $ config; 'Будет ли это помогать только создавать экземпляры ключей auth для их соответствующей функции API, например 'private $ thisAPIConfigArray = $ config [" api_1 "];'? –