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