$.getJSON()函数内的数据不能传到在函数中定义全局变量量是怎么回事?

您所在的位置: &
教你在PHP中使用全局变量
教你在PHP中使用全局变量
即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有:程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据,其中最常用的就是使用“global”关键字申明,稍后在文章中我们会具体的讲解到
即使开发一个新的大型PHP程序,你也不可避免的要使用到全局数据,因为有些数据是需要用到你的代码的不同部分的。一些常见的全局数据有:程序设定类、数据库连接类、用户资料等等。有很多方法能够使这些数据成为全局数据,其中最常用的就是使用“global”关键字申明,稍后在文章中我们会具体的讲解到。
使用“global”关键字来申明全局数据的唯一缺点就是它事实上是一种非常差的编程方式,而且经常在其后导致程序中出现更大的问题,因为全局数据把你代码中原本单独的代码段都联系在一起了,这样的后果就是如果你改变其中的某一部分代码,可能就会导致其他部分出错。所以如果你的代码中有很多全局的变量,那么你的整个程序必然是难以维护的。
本文将展示如何通过不同的技术或者设计模式来防止这种全局变量问题。当然,首先让我们看看如何使用“global”关键字来进行全局数据以及它是如何工作的。使用全局变量和“global”关键字
PHP默认定义了一些“超级全局(Superglobals)”变量,这些变量自动全局化,而且能够在程序的任何地方中调用,比如$_GET和$_REQUEST等等。它们通常都来自数据或者其他外部数据,使用这些变量通常是不会产生问题的,因为他们基本上是不可写的。
但是你可以使用你自己的全局变量。使用关键字“global”你就可以把全局数据导入到一个函数的局部范围内。如果你不明白“变量使用范围”,请你自己参考PHP手册上的相关说明。
下面是一个使用“global”关键字的演示例子:
以下为引用的内容:
$my_var = 'Hello World';
test_global();
function test_global() {
// Now in local scope
// the $my_var variable doesn't exist
// Produces error: "Undefined variable: my_var"
// Now let's important the variable
global $my_
正如你在上面的例子中看到的一样,“global”关键字是用来导入全局变量的。看起来它工作的很好,而且很简单,那么为什么我们还要担心使用“global”关键字来定义全局数据呢?
下面是三个很好的理由:
1、& 代码重用几乎是不可能的
如果一个函数依赖于全局变量,那么想在不同的环境中使用这个函数几乎是不可能的。另外一个问题就是你不能提取出这个函数,然后在其他的代码中使用。
2、& 调试并解决问题是非常困难的
跟踪一个全局变量比跟踪一个非全局变量困难的多。一个全局变量可能会在一些不明显的包含文件中被重新定义,即使你有一个非常好的程序编辑器(或者IDE)来帮助你,你也得花了几个小时才能发现这个问题所在。
3、& 理解这些代码将是非常难的事情
你很难弄清楚一个全局变量是从哪里来得,它是用来做什么的。在开发的过程中,你可能会知道知道每一个全局变量,但大概一年之后,你可能会忘记其中至少一般的全局变量,这个时候你会为自己使用那么多全局变量而懊悔不已。那么如果我们不使用全局变量,我们该使用什么呢?下面让我们看看一些解决方案。
使用函数参数
停止使用全局变量的一种方法就是简单的把变量作为函数的参数传递过去,如同下面所示:
以下为引用的内容:
$var = 'Hello World';
test ($var);
function test($var) {
如果你仅仅只需要传递一个全局变量,那么这是一种非常优秀甚至可以说是杰出的解决方案,但是如果你要传递很多个值,那该怎么办呢?
比如说,假如我们要使用一个数据库类,一个程序设置类和一个用户类。在我们代码中,这三个类在所有组件中都要用到,所以必须传递给每一个组件。如果我们使用函数参数的方法,我们不得不这样:以下为引用的内容:
$db = new DBC
$settings = new Settings_XML;
$user = new U
test($db, $settings, $user);
function test(&$db, &$settings, &$user) {
// Do something
显然,这是不值得的,而且一旦我们有新的对象需要加入,我们不得不为每一个函数增加多一个函数参数。因此我们需要用采用另外一种方式来解决。
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&&&的更多文章
草根出身的PHP如今变得愈加的坚挺。俗话说,士别三日,当刮目相
本次的专刊为大家提供了Oracle最新推出的Java SE 8详细的开发教程,从解读到探究Java 8最新
掌握一门技术,首要的是掌握其基础。笔者从事.NET相关
再过十几天很多同学又要爬楼梯睡觉,早上七点起床,晚
8月第二周,开发者们每月必看的编程语言排行榜如期而
JBuilder 2006是一款强大的Java企业级开发平台,其集成了几乎所有的Java技术,涵盖了软件开发生命周期的各个过程。本书深入浅出
51CTO旗下网站前端 ,后端 关于数据交互的问题?
今天,我和我同事在讨论php 与js交互的时候,他认为:&script type="text/javascript"&
var type = &?php echo $user_intern_?&;
....&/script&我认为这样比较乱,如果交互数据多了的话,所有,我改成这样&div id="hide_value"&&input type="hidden" id="user_intern_status" value="&?php echo $user_intern_?&"&...&/div&&script&
var type = $("#hide_value #user_intern_status").val();
...&/script&他说我这样写很麻烦,没必要。我想知道大家是咋想的,又如何处理前端(js)与后端(jsp,php等)的数据交互的。
按投票排序
重新修改答案后整理了一份《前后端数据交互方法》在此介绍几种常用的前后端数据交互方法,并给出使用建议。以提高前后端协同开发的效率。
目录:1. HTML赋值2. JS赋值3. script填充JSON4. AJAX获取JSON5. WebSocket实时传输数据6. 总结1. HTML赋值输出到 Element 的 value 或 data-name &input type="hidden" value="&?php echo $user_?&" /&
&div data-value="&?php echo $user_?&"&&/div&
渲染结果&input type="hidden" value="/u/3949015?v=3&s=40" /&
&div data-avatar="/u/3949015?v=3&s=40"&&/div&
使用 JS 获取$('input').val();
// /jQuery.data/
$('div').data('avatar');
优点:不占用全局变量,由 JS 自由获取。使用建议:适合传递简单数据,也非常适合多个简单数据与 Element 绑定关系。&ul&
&li&nimojs &span data-userid="1" &删除&/span&&/li&
&li&nimo22 &span data-userid="2" &删除&/span&&/li&
&li&nimo33 &span data-userid="3" &删除&/span&&/li&
&li&nimo44 &span data-userid="4" &删除&/span&&/li&
&li&nimo55 &span data-userid="5" &删除&/span&&/li&
$('span').on('click',function(){
$.post('/ajax/remove/',$(this).data('userid'),function(data){
2. JS赋值将数据填充到 `&script&` 的 JavaScript 变量声明中。&script&
var user_avatar = "&?php echo $user_?&";
// 渲染结果
// var user_avatar = "/u/3949015?v=3&s=40";
或使用 Smarty 后端模板引擎:&script&
var user_avatar = "{$user_avatar}";
优点:传递数据非常方便。前端直接调用 user_avatar 变量使用数据。缺点:1. 为了传递一个字符串数据占用了全局变量 `user_avatar`,当有很多数据需要传输时则会占用很多全局变量。2. 如果返回数据存在换行将会导致JS报错// 渲染结果有换行符
var user_id = "
/u/3949015?v=3&s=40";
// Uncaught SyntaxError: Unexpected token ILLEGAL
优化:可以通过指向的某一个变量存放所有后端返回的内容,最小程度占用全局变量。例:// PHP 代码
var SERVER_DATA = {
username: {$username},
userid: {$userid},
title: {$title}
// 渲染结果
var SERVER_DATA = {
username: "NimoChu",
userid: 1,
title: 'F2E'
使用建议:需要最快速度传递数据给 JS 并十分确定此数据稳定时,使用此方式。数据格式复杂的建议使用script填充JSON 或AJAX获取JSON 方法。3. script填充JSON填充 JSON 数据到 `&script&` 标签中,前端通过 DOM 获取 JSON字符串并解析成对象。&script type="text/template" id="data"&{"username":"nimojs","userid":1}&/script&
var data = JSON.parse($('#data').html());
//{username:"nimojs",userid:1}
优点:页面加载完成后就可以获取到数据。不占用全局变量,可传递大量数据集合。缺点:数据量特别大时会导致页面初次加载变慢。变慢并不只是文件大小导致的,也因为服务器查询数据并返回合集是需要时间,可使用AJAX获取JSON完成按需加载和加载等待。使用建议:适合传递在DOM加载完成时就需要用到的大量数据集合。例如:前端控制页面渲染,后端将JSON数据源填充到 `&script&` 由前端使用 JavaScript模板引擎 进行页面渲染。4.
AJAX获取JSON使用 AJAX 获取JSON数据&span id="showdata"&查看资料&/span&
&div style="display:" id="box"&
&h2&用户信息&/h2&
&p id="info"&&img src="loading.gif" /&&/p&
$('#showdata').on('click',function(){
$('#box').show();
$.getJSON('/ajax/userdata/',function(oData){
// oData = {"username":"nimojs","userid":1}
$('#info').html('用户名:' + oData.username + '&br&用户ID:' + oData.userid);
这是一个通过AJAX 获取用户资料的示例。流程如下:1. 页面上只显示查看资料2. 用户点击查看资料3. 显示用户信息和 loading 图片4. 向服务器发送获取用户信息的AJAX请求5. 服务器返回JSON字符串,$.getJSON
自动将返回的 JSON字符串转换为对象6. 填充内容到 `&p id="info"&`优点:不占用全局变量和 DOM 节点,可以自由控制获取数据的触发条件(页面加载完成时、用户点击查看资料时或用户点击某个按钮时)。当开始获取数据时可使用 loading 图片占位提示用户数据正在读取。防止页面加载所有数据导致的页面加载缓慢。缺点:会产生额外的HTTP请求。不能在DOM加载完成以后立即获取,需要发送请求-接收响应。使用建议:适合加载非主要信息、设定触发条件(用户点击查看资料时),并提供友好的数据读取等待提示。5. WebSocket实时传输数据如果将 AJAX请求和响应比喻成给服务器发短信和等待服务器回复短信,而 WebSocket 就如同和服务器打电话。此处不对WebSocket做过多介绍,附上参考资料:1. 2. 3. 6. 总结每种情况都有每种情况的用处,没有绝对正确的方法。根据实际情况灵活的选择获取数据方式。若作者显示不是Nimo(被转载了),请访问Github原文进行讨论:
卧槽。。你和你的同事从来没听过PHP框架这种概念?
任何时候两种不同的技术发生硬耦合都是非常糟糕的软件设计,因为会带来不可调试、不可追踪等问题,每一种技术都有自己从开发到调试、测试甚至是构建的一套完整技术栈和工作流,当两种技术耦合在一起就会让这个工作流部分或完全失效。所以从这个角度看,虽然问题里面提出的第二种优于第一种,但是两种方式本质上都是一个问题:硬耦合。第一种方案 JavaScript 和 PHP 耦合在一起了,第二种 HTML 和 PHP 耦合在一起了。所以还有更合理的解决办法,那就是前后端完全 decouple,通过 API 通信获取数据,用 JavaScript 动态渲染页面。
写页面的几个人呢?如果前端只有一个,那两种方案都可以。前端再拆分,写html和写js的分工的话,第二种更好。还有拆得更合理的方案,就是自定义属性,毕竟第二个方案添加了无意义的元素,不如直接&div id="hide_value" data-val="{user_intern_status:'&?php echo $user_intern_?&'}"&,甚至hide_value这个元素都可以用不着,直接在其父元素上定义就可以了。获取就是 var data= xx.getJson($("#hide_value").attr('data-val')), jQuery本身没有json处理函数,自己随便搜个下来用吧。不过这些东西不是都是前端来写吗?后端只负责给出 $user_intern_status,怎么调用是前端自己定的。
第二种啊js肯定要分离出来的,到时候还要改成第二种php 和html分离 到是大可不必,php本身就是个语言+模板引擎啊目前排名最高的那个答案给的SEO解决方案操作起来太复杂,工作量翻好几倍,尤其是页面改动后的测试
为啥不用 php+smarty的框架呢
你同事的意思是 要把所有的js代码写到php文件里面?
不然真不明白第一种写法怎么跑的通想前后端通讯数据 就用ajax啊。
写法都没有错,得看实际情况再挑选最实惠的做法。
你不会用smarty动静分离么。或者写jquery
用框架就有框架自带的方法,但还是觉得js和php要分开来,因为js的变化实在太平凡了。
其实个人觉得你这样更乱,除非数据是需要通过表单提交的,不然直接赋值给变量不是更好么?明明一行代码操作就OK的事情,你要用两行代码。$.getJSON()函数内的数据不能传到全局变量是怎么回事?_百度知道
$.getJSON()函数内的数据不能传到全局变量是怎么回事?
js&#47.getJSON(&quotvar json_obj2;.json&invite_$,function(data){
json_obj2=data})console.log(json_obj2)
提问者采纳
所以全局变量并没有赋值就输出了解决办法.ajaxSettings因为getJson是异步执行的,即console.log.log和getJson是一块执行的,并没有getJson执行完再执行console:在getJson前面加一句$.async = false
提问者评价
来自团队:
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁收藏,6.2k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我在做课设啦。要做一个GPS监控平台
因为我在数据库存了一系列坐标点
想网页加载后把分析 历史路径、当前车速 这类信息的任务交给浏览器
所以第一步就是获取并存储json描述的坐标信息,接下来对这些大量坐标数据进行计算、分析,得到车辆里程、当前方向这类信息,再把分析后得到的结果再添加到DOM中。
$(document).ready(function(){
type:'POST',
url:'/json',
dataType:'json',
data:{cmd:'coordinates'},
async:false,
success:function(coordinates){
result =//////有问题。。。。
if(coordinates.length) {//这里我暂先省略数据处理,直接显示所有坐标
$.each(coordinates, function(index,term) {
var $item = $('&li class="item"&&/li&').text('坐标:'+term[0] + ',' + term[1]).appendTo('#list');
我试了很多方法,
都不能把success:function(coordinates)的参数coordinates传给全局变量result
是因为这样就只是coordinates的引用传递给了result,函数执行完后数据就销毁了?
我是初学,希望指教~
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
未看清题主设了async:false参数了,下面答案是异步下的情况,同步的话就要分析其它方面的问题了,信息不足~~
Ajax是异步的,所以赋值是成功完成了的,但是大部分情况下是在你尝试去使用result全局变量之后才发生赋值操作,因此是没有保证的。(验证很简单:在result =之后加个console.log('aaa');, 在使用result之前加个console.log('bbb');, 看看aaa与bbb的输出顺序就知道了)。
所以,针对Ajax请求返回的数据,你不能这样使用,建议还是在回调函数中直接操作吧。如果你一定要这样用,可以使用一个递归的setTimeout不断去check Ajax请求是否已经完成(result是否已经被赋值),如果已经完成就使用result的值,退出递归,否则继续~~
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这里传递的会不会是引用呀?转成字符串可行么?
result = coordinates.toString();
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这个文章有帮助。Jquery+asp.net 后台数据传到前台js进行解析的办法说明
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
3月11日 回答
我表示,是可以的,一点问题都没有。
console.log(1);
$(document).ready(function(){
type:'POST',
url:'&{spUrl c=member a=music home=random}&',
dataType:'json',
async:false,
complete:function(coordinates){
console.log(2);
console.log(result);
输出截图:
我猜,你不成功的原因是,你在document未加载完成的时候就读取了result的值,这时候都还没执行ajax,是取不到值的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
灵感来了。。
var coordinates = (function() {
type:'POST',
url:'/json',
dataType:'json',
data:{cmd:'coordinates'},
async:false,
success:function(data){
$(document).ready(function(){
if(coordinates.length) {//初始化页面,把所有坐标列一个列表
$.each(coordinates, function(index,term) {
var $item = $('&li class="item"&&/li&').text('坐标:'+term[0] + ',' + term[1]).appendTo('#list');
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
异步操作只能在回调中进行了。
同步到新浪微博
不要错过该问题的后续解决方案
如果你没找到答案,记得登录关注哦,大家会尽全力帮你解决的 ^___^
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
举报理由:
推广(招聘、广告、SEO 等)方面的内容
带有人身攻击、辱骂、仇恨等违反条款的内容
与已有问题重复(请编辑该提问指向已有相同问题)
内容质量差,或不适合在本网站出现
答非所问,不符合答题要求
其他原因(请补充说明)
补充说明:}

我要回帖

更多关于 在函数中定义全局变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信