On Mon, 2018-05-28 at 22:18 -0700, Jeff wrote: > > 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 > > Thanks Jeff. Very helpful, including your comment about "not possible as such". That was what I was afraid would be the result of this inquiry but I was hoping I had missed something! Regards, John -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php