• 关于

    PHP全局变量-超全局变量

    的搜索结果

回答

global关键字后面需要跟上变量名称。 $_html['user'];//这是在取出数组下标的一种表达式,也就是个地址,真正的变量名称是$ _html 扩展: global声明后,需要把变量名称存储到底层的全局变量表中,使用时根据变量名查找该表(表存储方式:变量名称->Z_VALUE据结构地址),前提需要一个变量名。知道为什么是变量名,而不是地址了吧? 回复 @yongu:测试代码:$var1=123;$arr=['var2'=>'var1'];$GLOBALS[$arr['var2']]=456;echo$var1;回复 @yongu:http://www.php.net/manual/zh/reserved.variables.globals.php变量的名字就是数组的键回复 @D哥:明白了,那我数组的地址申明个变量,变量声明为全局数组就可以了回复 @yongu:参见$GLOBALS,用法:$GLOBALS['var']=123;结果是一样的。想象下$GLOBALS[$_html['user']]=123;假设$_html['user']='var2';等价于:$GLOBALS['var2']=123;等价于:global$var2=123;变量知道,数组[0][1]些是地址。global后面不能跟着地址,手册上怎么没标注,求解。授之于鱼。所谓的单元素全局不就是一个普通的全局变量啊?定义一个类,在类里定义静态变量,数组,就可全局引用了。尽量少用这些自己都搞不懂的语法,如果打算写伪开源程序倒是可以深入研究global后只能跟变量名,php把“ $_html['user']”当成是变量名了,报错正常。 global这个函数,我在手册上怎么没找到不能跟地址只能跟函数?求解 functiontest(){$a='100';$GLOBALS['myvar']=$a;//php不管什么变量,最终都会在GLOBALS数组中.并且是超全局的.}test();echo$myvar; $GLOBALS['arr]=array('dog','cat','hongshu'); 引用来自“D哥”的评论 global关键字后面需要跟上变量名称。 $_html['user'];//这是在取出数组下标的一种表达式,也就是个地址,真正的变量名称是$ _html 扩展: global声明后,需要把变量名称存储到底层的全局变量表中,使用时根据变量名查找该表(函数表存储方式:变量名称->Z_VALUE据结构地址),前提需要一个变量名。知道为什么是变量名,而不是地址了吧?

爱吃鱼的程序员 2020-06-20 16:55:26 0 浏览量 回答数 0

回答

如果变量不存在,则不会生成警告。这意味着 empty()本质上与!isset($ var)||等效。是$ var ==假。 这意味着,你可以只使用empty()来确定变量设置,此外它检查变量针对以下,0,0.0,"","0",null,false或[]。 例: $o = []; @$var = ["",0,null,1,2,3,$foo,$o['myIndex']]; array_walk($var, function($v) { echo (!isset($v) || $v == false) ? 'true ' : 'false'; echo ' ' . (empty($v) ? 'true' : 'false'); echo "\n"; }); 在3v4l.org在线PHP编辑器中测试以上代码段 尽管PHP不需要变量声明,但它确实推荐这样做,以避免某些安全漏洞或bug,因为这些漏洞或bug可能会忘记为变量提供值,该变量将在脚本的后面使用。在未声明变量的情况下,PHP会发出一个非常低级的错误,E_NOTICE默认情况下甚至不会报告该错误,但《手册》建议在开发过程中允许这样做。 解决问题的方法: 推荐:声明变量,例如,当您尝试将字符串附加到未定义的变量时。或使用isset()/ !empty() 来检查它们是否在引用它们之前声明,如: //Initializing variable $value = ""; //Initialization value; Examples //"" When you want to append stuff later //0 When you want to add numbers later //isset() $value = isset($_POST['value']) ? $_POST['value'] : ''; //empty() $value = !empty($_POST['value']) ? $_POST['value'] : ''; 自PHP 7.0起,它变得更加干净,现在您可以使用null合并运算符: // Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? ''; 为E_NOTICE 设置自定义错误处理程序,并将消息重定向到标准输出之外(也许重定向到日志文件): set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT) 禁用E_NOTICE的报告功能。快速排除正义的方法E_NOTICE是: error_reporting( error_reporting() & ~E_NOTICE ) 使用@运算符抑制错误。 注意:强烈建议仅实施第1点。 注意:未定义索引/未定义偏移 当您(或PHP)尝试访问数组的未定义索引时,将显示此通知。 解决问题的方法: 在访问索引之前,请检查该索引是否存在。为此,您可以使用isset()或array_key_exists(): //isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : ''; list()当它尝试访问不存在的数组索引时,语言构造可能会生成以下代码: list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string'); 两个变量用于访问两个数组元素,但是只有一个数组元素index 0,因此将生成: 注意:未定义的偏移量:1 $_POST/ $_GET/ $_SESSION可变 使用或时$_POST,以上提示经常出现。对于,您只需要在使用索引之前检查索引是否存在。因为您必须确保您以会话开始,并且索引也存在。$_GET$_SESSION$_POST$_GET$_SESSIONsession_start() 另请注意,所有3个变量都是超全局变量,并且均为大写。 问题来源于stack overflow

保持可爱mmm 2020-01-13 11:56:59 0 浏览量 回答数 0

回答

浏览器端提交数据的时候一般都是通过GET或者POST方式来传输,比如/post.php?action=edit&id=1024,拿PHP来说,就是直接用$_GET和$_POST等超全局变量在任何地方访问这些用户输出的参数,比如取参数action的值,$_GET['action'].如果你是用PHP写CGI程序,那么你就需要自己获取这些参数,大概就是先URL解码,然后按&分割,再按=分割,获取参数的名和值. <?php $tmp = explode('&', urldecode('action=edit&id=1024')); $get = array(); foreach($tmp as $v) { $tmp2 = explode('=', $v); foreach($tmp2 as $v2) { $get[$tmp2[0]] = $tmp2[1]; } } print_r($get); <form accept-charset="utf-8" action="info.php" method="GET"> <input type="checkbox" name="os[]" value="Windows" />Windows <input type="checkbox" name="os[]" value="Ubuntu" />Ubuntu <input type="checkbox" name="os[]" value="Mac" />Mac <input type="submit" name="submit" value="提交" /> </form> 上面的表单,如果勾选了3个复选框,那么提交后就对应这样的GET请求(一个数组): info.php?os[]=Windows&os[]=Ubuntu&os[]=Mac&submit=提交 $_GET['os']: Array ( [0] => Windows [1] => Ubuntu [2] => Mac ) 如果你用POST方式的话可以在Firebug之类的工具的网络里看到这个信息,而不像GET显示在URL,并记录到Web服务器的日志里. 一般是浏览器端通过AJAX访问服务器端获取数据时,服务器端才返回JSON数据,而不是浏览器端向服务器端提交JSON数据.JSON是JS里的一种数据结构,就像数组至于PHP,而PHP可以通过json_encode/json_decode在数组和JSON之间转换,PHP里的数组不区分数字数组和字典(键值对/哈希表),PHP可以用数组保存从数据库中查出的结果集,经过数组处理后json_encode成JSON串,然后返回给浏览器.浏览器端可以用jQuery.parseJSON(data)或JSON.parse(data)或eval('(' + data + ')')把返回的JSON串转成JS对象进行操作.

爵霸 2019-12-02 01:57:50 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

有点明白了,哈哈,异步的话,还是用回调函数吧   getData(function(data){ xxx; }); function getData(callback){ ...; callback(data); ...; } ######ajax可以设置同步!######可以试试用 $.Deferred###### 引用来自“con”的评论 可以试试用 $.Deferred 谢谢,刚才看dom数发现trigger和triggerHandler函数,一查也是看到了deffered,正在试,不过没有试验成功,希望能指导下 使用的jquery1.10.2和easyui1.4 简单地就是一个二级联动菜单,一个事件是一级菜单联动二级菜单,另外一个事件是载入数据的时候将数据写入(不过因为二级菜单跟着一级菜单走,所以得等到二级菜单载入完毕才能写入数据) 下面的代码都是放在$()里面的 //设置一级菜单的二级菜单联动 $('#topic1').combobox({ onChange:function(n,o){ topic2Loaded=false;//因为没有搞懂deferred用法,这个是加的全局变量准备用全局变量来判断 var f_s; //alert(1); f_s=getTopic2(n);    //这个是我现在的简单的存储处理方法 if(f_s==false){ $.post('../server/t_getsubtopic.php',{father:n},function(data,sta,xhr){ jQuery('#topic2').combobox('clear').combobox('loadData',data.topic); eval('db_topic2.'+'f'+n+'=data.topic;'); topic2Loaded=true; },'json'); }else{ jQuery('#topic2').combobox('clear').combobox('loadData',f_s); topic2Loaded=true; } } });        //初始化编辑器的显示内容 jQuery.post('../server/t_editorinit.php',function(data,sta,xhr){ var jjj; jQuery('#topic1').combobox('clear').combobox('loadData',data.topic); jQuery('#saved').attr('value',1); jQuery('#subject').combobox('clear').combobox('loadData',data.subject); if(data.topic.length==0){ jQuery.messager.alert('提示','当前无权限进行操作,请登陆后刷新本页面。','info'); //jQuery('#saved').window('close'); }else{ //是否读取数据,如果是的话读取数据 var id=getURLRequest('id'); if(id){ jQuery.post('../server/getcontent.php',{id:id},function(data,sta,xhr){ var topic=data.path[0]; //jQuery.when(jQuery('#topic1').combobox('select',topic.father.index);); jQuery('#topic1').combobox('select',topic.father.index);                                         //这里就没有看懂,包括看的jquery的api里面then貌似已经废弃了的,这里执行不下去 // jQuery.when(jQuery('#topic1').triggerHandler( // 'onChange',jQuery('#topic1').combobox('getValue') // )).done(jQuery('#topic2').combobox('select',topic.son.topicid)); jQuery('#topic2').combobox('select',topic.son.topicid); //jQuery('#saved').attr('saved')=1; },'json'); } } },'json'); ###### 试了半天没有试出来,现在这样做的,但是看着好丑…… 最主要是如果超500ms没有完成载入就丑了…… jQuery.post('../server/getcontent.php',{id:id},function(data,sta,xhr){ var topic=data.path[0];         jQuery('#topic1').combobox('select',topic.father.index).delay(500).queue(function(){             jQuery('#topic2').combobox('select',topic.son.topicid);         }); jQuery('#saved').attr('saved')=1; },'json'); ###### 1、首先是通过Deferred实现的数据存储 // 存储函数 function getData(dfd, name) { var sdata = []; // 缓存所有ajax请求过的数据 if ( sdata[name] ){ dfd.resolve( sdata[name] ); } else { $.ajax({ url: xxx, }).done( function (data) { sdata[name] = data; dfd.resolve( data ); }) } } // 调用方式 var dfd = $.Deferred(); dfd.done( function (data) { // 拿到数据后要执行的操作 }); getData(dfd, "name1"); Deferred对象的使用方式大抵如上。 2、combobox二级菜单 简单看了下easyui combobox的api,一级菜单被选择时,更新二级菜单内容,可以用类似下面的写法: $("#level_1").combobox({ onSelect: function (record) { // 获取二级菜单内容并缓存,调用上面的getData var dfd = $.Deferred(); dfd.done(function (data) { $("#level_2").combobox( 'loadData', data); }); //这里的record不知道是个啥东西,可能需要加工一下再传入getData getData(dfd, record); } }); 不知道这种方式是不是能满足你说的菜单联动和缓存数据的需求 ###### 引用来自“con”的评论 1、首先是通过Deferred实现的数据存储 // 存储函数 function getData(dfd, name) { var sdata = []; // 缓存所有ajax请求过的数据 if ( sdata[name] ){ dfd.resolve( sdata[name] ); } else { $.ajax({ url: xxx, }).done( function (data) { sdata[name] = data; dfd.resolve( data ); }) } } // 调用方式 var dfd = $.Deferred(); dfd.done( function (data) { // 拿到数据后要执行的操作 }); getData(dfd, "name1"); Deferred对象的使用方式大抵如上。 2、combobox二级菜单 简单看了下easyui combobox的api,一级菜单被选择时,更新二级菜单内容,可以用类似下面的写法: $("#level_1").combobox({ onSelect: function (record) { // 获取二级菜单内容并缓存,调用上面的getData var dfd = $.Deferred(); dfd.done(function (data) { $("#level_2").combobox( 'loadData', data); }); //这里的record不知道是个啥东西,可能需要加工一下再传入getData getData(dfd, record); } }); 不知道这种方式是不是能满足你说的菜单联动和缓存数据的需求 谢谢,因为没用过所以还不太清楚,不过我就当是回调函数理解的话貌似这样的确可以解决问题,有时间的时候我会试着用这个代码并学习一下deferred这个有用的东西的。 至于之前我的解决方式整体就是这样的,不过有eval在里面真的好丑…… var db_topic2={};//用于存储topic2的本地数据,以免频繁进行查询 function getTopic2(father){ //通过查询本地dbTopic2来获取topic2的数据,如果没有的话才进行远程查询 // father='f'+father;//转换为字符 var flag; eval('flag=db_topic2.'+father+';'); if(flag){ return flag; }else{ //通过数据进行查询 return false; } } //设置一级菜单的二级菜单联动 $('#topic1').combobox({ onChange:function(n,o){ $('#saved').prop('value','0');//设置未保存 var f_s; f_s=getTopic2(n); if(f_s==false){ $.post('../server/t_getsubtopic.php',{father:n},function(data,sta,xhr){ jQuery('#topic2').combobox('clear').combobox('loadData',data.topic); eval('db_topic2.'+'f'+n+'=data.topic;'); },'json'); }else{ jQuery('#topic2').combobox('clear').combobox('loadData',f_s); } } }); //载入数据时候的设置 jQuery('#topic1').combobox('select',n.father.index).delay(500).queue(function(){ jQuery('#topic2').combobox('select',n.son.topicid); $(this).dequeue(); }).delay(500).queue(function(){ //因为存在延时,所以得在这里再延时设置已保存状态 $('#saved').prop('value','1');//设置已保存 $(this).dequeue(); }); 看着很丑吧…… ###### /* * 获取数据方法 * name: 数据key * fn: 回调函数 */ function getData(name, fn) { if(typeof getData.cache[name] != "undefined") { fn(getData.cache[name]); return; } $.post("index.php", { name: name }, function (data) { getData.cache[name] = data; fn(data); }, "json"); } getData.cache = {}; //使用实例 getData("user", function (user) { alert(user.name); }); ###### 引用来自“mr-zhuo”的评论 /* * 获取数据方法 * name: 数据key * fn: 回调函数 */ function getData(name, fn) { if(typeof getData.cache[name] != "undefined") { fn(getData.cache[name]); return; } $.post("index.php", { name: name }, function (data) { getData.cache[name] = data; fn(data); }, "json"); } getData.cache = {}; //使用实例 getData("user", function (user) { alert(user.name); }); 谢谢,用回调函数适用范围应该更广一些。###### 这里有篇关于deferred的,不错。 http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html

kun坤 2020-06-07 00:35:34 0 浏览量 回答数 0

问题

【javascript学习全家桶】934道javascript热门问题,阿里百位技术专家答疑解惑

管理贝贝 2019-12-01 20:07:22 6202 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站