Re: Idea to extend language: Explicitly setting variable scope inside user defined function (longer)

From: Date: Mon, 21 Oct 2002 02:56:32 +0000
Subject: Re: Idea to extend language: Explicitly setting variable scope inside user defined function (longer)
References: 1  Groups: php.dev 
Request: Send a blank email to php-dev+get-89782@lists.php.net to get a copy of this message
Well, you have to admit that the issue of variable scope is the first thing that hits someone who approaches PHP for the first time and comes from other backgrounds, like C or ASP! Still, after one adapts to this apparent "weirdness" of scoping, it tends to grow on you. I find that no scope inheritance gives me one less thing to worry about when writing code... Marco On Sun, 2002-10-20 at 22:41, Rasmus Lerdorf wrote: > How in the world do you know that "code will run faster" ? > > Implementing your suggestion would take quite a lot of changes to the > internals of PHP. Instead of just a global and a current symbol table, we > would now need basically an unlimited number of symbol tables and every > variable lookup would become more complex. Ergo it would slow things > down. > > -Rasmus > > On Mon, 21 Oct 2002, NTPT wrote: > > > Hi. > > I have some idea and suggestion how to extend PHP language a bit in some > > way. That may probably lead to increasing of php flexibility, allow more > > modular coding to be done etc.... > > > > > > My sugestion is simple: > > Allow PHP programmer to explicitelly told , WHAT variable scope will be > > used inside user defined functions. > > > > In the traditional approach (afaik , i use php 4.2.2 ), as is described in > > the manual of php there a diferent varable scopes for each functions , only > > syntax " global $valuename" ; can lead to use variables global. This aproach > > is traditional and well known and is sufficient for most tasks.(I say > > sufficient, not effective...). My idea is going a bit behind it. > > > > I suggest to introduce new keyword(s) or function(s) into the PHP language > > definiton > > (i suggest syntax like "var_scope scope" or var_scope("scope") ) > > > > That keywords SHOULD be used in user defined functions to EXPLICITLY > > define, WHAT kind of variable scope will be used inside this function. > > > > scope can be either > > > > 'local' = it means, that all variables used in this function have a local > > scope only.(it means like traditional behavior of php and its variable > > scopes until now ) > > > > 'global' = each variable used in the function is from global scope. Similar > > to "global $variable_1,$variable_2........... $each variable used in the > > main execution line of the script" > > > > 'caller' or 'inherit' This is MOST USEFUL part of the idea . Function > > variable scope is the SAME as from where the function was called. (if > > functino bar(),with have var_scope set to 'caller', is called from function > > foo() it have the same variable scope as function foo(), almost like the > > code of function bar() was included (by include "something" ) somewhere > > inside foo() ) > > > > > > A little example code for demonstrating idea of the syntax and how it should > > work: > > */ > > <? > > > > $a=10; > > > > echo "Varaible $a".$a; > > . > > $foo_output =foo(); > > echo "<br>value returnded by foo() ".$foooutput; > > echo "<br>value $a after calling foo() but before calling bar() ".$a; > > > > $bar_output=bar(); > > echo "<br>value returnded by bar() ".$bar_output; > > . > > . > > echo "<br>value $a after calling bar() ".$a; > > > > function foo() > > { > > $a=20; > > echo "$a inside function foo() = ".$a > > /* $bar_inside foo = bar(); > > echo "Variable $a inside function foo() after calling bar()".$a; > > > > */ > > . > > . > > > > return $a; > > > > } > > > > > > function bar() > > { > > var_scope caller // we have the SAME variable scope as from where we are > > called > > $a=100; > > . > > . > > . > > return $a; > > } > > ?> > > this should return : (with comments behind // ) > > > > Varaible $a" 10 > > $a inside function foo() = 20 > > value returnded by foo() 20 > > value $a after calling foo() but before calling bar() 10 > > value returnded by bar() 100 > > value $a after calling bar() 100 // var_scope is set to 'caller', so $a > > in global scope is modified inside bar() the some way, as if global $a was > > used ) > > > > if you uncomment lines in bar().... > > > > Varaible $a" 10 > > $a inside function foo() = 20 > > Variable $a inside function foo() after calling bar() 100 // var_scope in > > function bar() is set to caller, so $a IN SCOPE of foo() ONLY is modified > > inside bar(). > > > > value returnded by foo() 100 > > value $a after calling foo() but before calling bar() 10 // var_scope in > > function bar() is set to caller, so $a IN GLOBAL SCOPE is NOT modified > > inside bar(). > > value returnded by bar() 100 > > value $a after calling bar() 100 // var_scope is set to caller, so $a in > > global scope is modified inside bar() the some waz, as if global $a was used > > > > > > For WHAT it could be useful ?? > > > > > > for example for writing a databaze extraction layer of any aplication. > > common real life situations are similar like in this example code > > (simplified and abstracted from real life code of PHP application I > > currently write ).... > > > > <? > > . > > . > > . > > . > > do something > > . > > . > > . > > // now you need a call subroutine > > > > $something=foo('cats','dogs','horses'); > > . > > $different=bar('mices','meat','gras'); > > . > > . > > . > > . > > > > function foo($data_1,$data_2,$data_3) > > { > > global $spojeni; > > . > > . > > do something here with $data_1,$data_2,$data_3......... > > . > > . > > . > > > > > > $sqlstring="select * from example_table where mouse_catching='$data1' AND > > sniffing='$data_2' AND riding='$data_3'" > > $result=pg_exec($spojeni,$sqlstring); > > > > // code, that validate if db done that we want, if select return exactly > > one line or if there is a some data inconsistrency etc etc. The following > > code (wery simplified snipplet from real life situation) is almost the same > > inside many of the functions > > if ($result) > > { > > $lines=pg_numrows($result); > > if ($lines <1) > > { > > do something if we have no records. Typicaly display error message > > ,repeat quyery with default values etc..... > > } > > if ($lines >1) > > { > > oops, database is inconsistent. exactly one line should be returned. Stop > > script > > die("database EXAMPLE TABLE have data inconsistency. contact server > > admin now") > > } > > > > if ($lines=1) > > { > > $retval= pg_fetch_array($result,0); // we have what we are looking for... > > } > > > > } > > else > > { > > die("No select from example_table") > > } > > //end of the validating code > > return $retval; > > } > > > > > > function bar($data_1,$data_2,$data_3) > > { > > global $spojeni; > > $sqlstring="select * from other_example_table where bla bla bla ....... some > > thuing'"; > > // bla bla bla and similar as in foo() > > > > > > } > > ?> > > > > > > in traditional approach, it could be done better and flexibile only by few > > and limited ways. > > One of then is to use for example include "" like this: > > > > <? > > function foo($data_1,$data_2,$data_3) > > { > > global $spojeni; > > . > > . > > do something here with $data_1,$data_2,$data_3......... > > . > > . > > . > > > > > > $sqlstring="select * from example_table where mouse_catching='$data1' AND > > sniffing='$data_2' AND riding='$data_3'" > > $result=pg_exec($spojeni,$sqlstring); > > > > // code, that validate if db done that we want, if select return exactlz > > one line or if there is a some data inconsistrency etc etc. The following > > code (wery simplified snipplet from real life situation) is almost the same > > inside many of the functions > > > > include "database_code.php" ; // all validating code is moved inside > > database_code.php3 , so it could be uset more frequently in more functions ; > > > > //end of the validating code > > > > return $retval; > > } > > ?> > > > > but it have several caveats. For example , database_code.php can be a big > > fat file with lot of lines and tests and if function foo() is called > > somewhere from loop, it will be included each itteration and it menas, > > that in each iterration will be parsed for errors (fix me if i am wrong...) > > etc etc and loop can have hunderds or thousends itteration and i iffraid, it > > could have a serious performance impact. > > > > > > The code rewriten for using my suggested "explicitly setiing of variable > > scope inside function" language extension, exactly "var_scope caller;" > > will > > look like this ( the following example uses "get_var_scope()" function, that > > is part of the sugested extensions to examine WHAT variable scope we are > > currently have and "local_vars $varname" (with list variables, that are > > intendet to be LOCAL ONLY , it act like oposite of "globals") ) : > > > > <? > > > > $database="postgres"; > > . > > . > > . > > . > > do something > > . > > . > > . > > // now zou need a call subroutine > > > > $something=foo('cats','dogs','horses'); > > . > > $different=bar('mices','meat','gras'); > > . > > . > > . > > . > > > > function foo($data_1,$data_2,$data_3) > > { > > global $spojeni,$database; > > . > > . > > do something here with $data_1,$data_2,$data_3......... > > . > > . > > . > > > > > > $sqlstring="select * from example_table where mouse_catching='$data1' AND > > sniffing='$data_2' AND riding='$data_3'" > > $retval= db_execute_query($sqlsting); > > return $retval; > > } > > > > > > function bar($data_1,$data_2,$data_3) > > { > > global $spojeni; > > $sqlstring="select * from other_example_table where > > mouse_catching='$data1' > > AND sniffing='$data_2' AND riding='$data_3'"; > > $retval= db_execute_query($sqlsting); > > return $retval; > > } > > > > > > > > function db_execute_query($sqlstring) > > { > > // executing database query, making all tests that everything went good > > etc... simple database abstraction layer included as bonus :o) ...... > > > > var_scope caller; // ve inherit variable scope from where we are called > > global $database; // we need name of the database engine > > local_vars $i,$j,$k,$partial_result,$retval,$sqlstring ; // good for loop > > counters, like for($i=0;$i<something;$i++),parameters and retvals, to do > > not harmly interfere with function from we are called .it has opposite > > meaning to "globals" > > > > $caller_name=get_var_scope(); // we need to know from where we are called > > do construct error messages > > > > if ($database=="postgres") > > { > > > > // database postgres specific code > > $result=pg_exec($spojeni,$sqlstring); > > if ($result) > > { > > $lines=pg_numrows($result); > > if ($lines <1) > > { > > do something if we have no records. Typicaly display error message > > } > > if ($lines >1) > > { > > oops, database is inconsistent. Stop script > > die("database inconsistency in function." .$caller_name." contact > > server admin now") > > } > > > > if ($lines==1) > > { > > $retval= pg_fetch_array($result,0); // we have what we are looking > > for... > > } > > > > } > > else > > { > > die("No select from example_table in ".$caller_name) > > } > > } > > > > if ($database=="mysql") > > { > > // mysql specific code > > > > } > > etc etc etc....... > > > > return $retval; > > > > > > } > > ?> > > > > > > in the following example, simple and very "good readable" code is created, > > with is smaller, flexibile and simple to underestand and i expect, it will > > run faster. > > > > I thing, that my sugested langue extension can lead to more flexibile coding > > style, allow to bulid modular programs far better, increse readibility of > > php code and may lead to smaller and faster php programs in some very > > common situations. So may be useful to add it to php language. > > > > > > Abstract: > > > > Suggestion of adding capability "Explicit setting of variable scope inside > > user defined functions". > > adding "var_scope local", "var_scope global", and most useful > > "var_scope > > caller" to explicitly set, what variable scope will be used inside user > > defined function.Some supporting keywords and functions suggested too. > > keyword "local_vars variable list" as oposite for "globals" to avoid > > harm interference of private function varibles with variables of its > > caller and function "get_var_scope()" to detect, witch variable scope is > > currently used. I hope that this extension can lead to flexibile, shorter > > and faster PHP code in common situations and is "worth of implementation" > > > > Thanx for reading my letter and i appologize for wasting your time (if > > any).And execuse my bed english; > > > > > > NTPT > > > > > > --- > > Odchozí zpráva neobsahuje viry. > > Zkontrolováno antivirovým systémem AVG (http://www.grisoft.cz). > > Verze: 6.0.401 / Virová báze: 226 - datum vydání: 9.10.2002 > > > > > > -- > > PHP Development Mailing List <http://www.php.net/> > > To unsubscribe, visit: http://www.php.net/unsub.php > > > > > -- > PHP Development Mailing List <http://www.php.net/> > To unsubscribe, visit: http://www.php.net/unsub.php >

« previous php.dev (#89782) next »