Vanilla 1 is no longer supported or maintained. If you need a copy, you can get it here.
HackerOne users: Testing against this community violates our program's Terms of Service and will result in your bounty being denied.
Polaroid Scope
x00
MVP
Just a blue sky idea, that may or may not be useful to prevent variable name collisions between extensions as well as enforcing a naming convention for functions/callbacks.
Some global declarations:
Special include function
Extension to include:
Include MyExtension:
Ouputs:
Explanation: If you include something within a function it is in the variable scope of that function. You can then explicitly add global variables to that scope as per your wishes. Then you can ensure that local variables are safely tucked away in a special global array. At the same time you can ensure that functions declared in extensions are prefixed. It may seem a bit messy but it works fine.
Some global declarations:
session_start();
$globvar = 'this has not changed...';
$globvar1 = 'this has not changed...';
function AnyFunction(){
echo "\n\nFunction declared outside of extension";
}
//safe place
$extension_vars=array();
Special include function
function includeInPolaroidScope($extension){// scope
// get global vars
foreach ($GLOBALS As $name => $value){
eval('global $'.$name.';');
}
unset($name,$value); //important
$funcs_glob= get_defined_functions();//outside functions
include($extension.'/default.php'); // inlcude the extension
$vars_in_scope = get_defined_vars();// (in scope)
foreach($vars_in_scope As $name => $value){
if(!in_array($name, array('extension','funcs_glob')) && !array_key_exists($name,$GLOBALS)){ // not global
$extension_vars[$extension][$name] = $value;
}
// no need to unset local variables
}
$funcs_curr= get_defined_functions();// current functions
foreach($funcs_curr['user'] As $name){
if(!in_array($name,$funcs_glob["user"])){ //inside functions
if(($pos = strpos($name,'_')) ===false && substr($name,0,$pos)!=strtolower($extension)){
die("Invalid function name '$name'. Extension functions/callbacks must be prefixed by name e.g. 'ExtensionName_FunctionName'");
}
}
}
}// end scope
Extension to include:
<?php
$localvar = 'this is local...';
$globvar = 'this has changed...';
$_SESSION['hi'] = 'hi'; //super global
function MyExtension_AnyFunction(){
echo "\n\nFunction declared inside of extension (must have prefix)";
}
echo 'global $globvar='.$globvar.' global $globvar1='.$globvar1.' local $localvar='.$localvar;
?>
Include MyExtension:
//include extension
includeInPolaroidScope('MyExtension');
echo "\n\n*Outside scope*";
echo "\n\n\$extension_vars=";
var_export($extension_vars);//only relevant
echo "\n\n\$localvar=";
var_export(@$localvar);//not set
MyExtension_AnyFunction();
AnyFunction();
Ouputs:
global $globvar=this has changed... global $globvar1=this has not changed... local $localvar=this is local...
*Outside scope*
$extension_vars=array (
'MyExtension' =>
array (
'localvar' => 'this is local...',
),
)
$localvar=NULL
Function declared inside of extension (must have prefix)
Function declared outside of extension
Explanation: If you include something within a function it is in the variable scope of that function. You can then explicitly add global variables to that scope as per your wishes. Then you can ensure that local variables are safely tucked away in a special global array. At the same time you can ensure that functions declared in extensions are prefixed. It may seem a bit messy but it works fine.
grep is your friend.
0
Comments
grep is your friend.
grep is your friend.