Web lists-archives.com

Re: [PHP] How Do I make Global Scope Variables Available to Functions




> On May 28, 2018, at 5:58 PM, John <john.iliffe@xxxxxxxxx> wrote:
> 
> On Sun, 2018-05-27 at 19:23 -0700, Jeffry Killen wrote:
>> On May 27, 2018, at 5:46 PM, John wrote:
>> 
>>> I am writing a PHP script that has a number of variables that (I  
>>> think) are in
>>> Global scope; that is, they are defined inline before the first  
>>> command of the
>>> script.  Note that these are not necessarily constants as shown in  
>>> the example I
>>> included; most of them can be changed by the script.
>>> 
>>> I have functions defined following these variables and before the  
>>> commands in
>>> the script appear, but when they are called, the functions report  
>>> the variables
>>> as undefined.  This means I have to pass all the Globals to each  
>>> function as a
>>> call argument.
>>> 
>>> A trivial script illustrating the problem is below.
>>> 
>>> This seems odd but I don't see what I am doing wrong.  Any  
>>> suggestions?
>>> 
>>> PHP 5.6.30 called through php-fpm on Apache.
>>> 
>>> Thanks in advance.
>>> 
>>> John
>>> ------------------------------------
>>> test.php - working version
>>> 
>>> This variant passes a variable in global scope explicitly as a  
>>> parameter.  It
>>> displays correctly on the browser screen.
>>> 
>>> 
>>> <?php
>>> 
>>> $bad_line = "This line should display on screen.";
>>> 
>>> // sample function that works
>>> function sample1($bad_line)
>>> {
>>> return "\n" . $bad_line . "\n";
>>> }
>>> 
>> 
>> This function could also be written
>> function sample1($a)
>>   {
>>  return "\n" . $a . "\n";
>> }
>>> echo sample1($bad_line);
>> 
>> But it looks like you've answered your own question.
>> If you wanted to have the function, or another function
>> alter $bad_line, it would need to be passed by reference
>> 
>> echo sample1(&$bad_line) ....  as I understand it.
>> 
>>> // this call does work
>>> echo sample1($bad_line);
>>> 
>>> exit;
>>> ?>
>>> 
>>> 
>>> 
>>> test.php - doesn't work
>>> 
>>> This variant does not work; it throws error:
>>> 
>>> [Sun May 27 20:17:46.779348 2018] [proxy_fcgi:error] [pid 893:tid
>>> 139838497978112] [client 192.168.1.104:37732] AH01071: Got error  
>>> 'PHP message:
>>> PHP Notice:  Undefined variable: bad_line in /httpd/iliffe/yrarc/ 
>>> test.php on
>>> line 8\n'
>>> 
>>> <?php
>>> 
>>> $bad_line = "This line should display on screen.";
>>> 
>>> // sample function that doesn't work
>>> function sample1()
>>> {
>>> return "\n" . $bad_line . "\n";
>>> }
>>> 
>>> //  this call doesn't work
>>> echo sample1();
>>> 
>>> exit;
>>> 
>>> ?>
>>> 
>>> 
> Thanks Jeffry.  Yes, I do have a workaround as you suggested but given the
> number of variables being passed it is unworkable to have to pass them all as
> arguments to the function.  I have been passing them as an array as I noted in
> an earlier reply but that is getting unwieldy and will be a maintenance
> nightmare.
> 
> The original variables, so far anyway, are not changed within any function but
> can vary between calls to the various functions.  Basically it is running in a
> loop that sets up the various required variables and then passes everything to
> one or another function for database processing and/or printing.
> 
> Thanks for the suggestion though.  I'm getting an education here!
> 
> John
> 
>> 

When I have multiple  arguments to pass to a function I prefer using an associative array.

So, 

$arraysamp = [‘fruit’=>’apples’, ‘clothing’=>’socks’];

function handleArray($a)
            {
              switch($a[‘fruit’])
                   {
                    case ‘apples’:
                    // process apples;
                    return “apple pie”;
                    break;
                    default:
                    return “input argument error”;
                    break;
                   }
               // other code for processing $a[‘clothing']
             }
echo handleArray($arraysamp);

Also, You have declared the global variable in the global script file scope.
As I understand it global is for use inside of a function that elevates the declared
variable to the global scope. Your error may be due to declaring a variable that is
already in the global scope by default, as global.

I understand your concern because I also do a significant amount of javascript programming
and in that language the scope of a function can see a variable in the global scope by default:

var cat = ’siamese’;

function getCat()
            {
              alert(cat)
            }
getCat() // dialog in browser produces “siamese”

My experience and knowledge of php informs me that this is not possible as such.

I hope this can be helpful.
Jeff K


--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php