V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  noark9  ›  全部回复第 2 页 / 共 8 页
回复总数  154
1  2  3  4  5  6  7  8  
2017-05-26 22:04:23 +08:00
回复了 Kylinsun 创建的主题 问与答 请问这些是什么人偶?
手脚可以动得哦
2017-05-26 10:04:03 +08:00
回复了 lazzyboy 创建的主题 Vim SpaceVim 发布 v0.3.0 版本, 欢迎尝试
越来越像 spacemaces 了,哈哈哈哈
2017-05-23 11:14:14 +08:00
回复了 iNeXT 创建的主题 C C++builder 有没有好用的插件,求推荐!!!
打不开可能需要翻墙,那你试试这个 http://bbs.csdn.net/topics/30481717
2017-05-23 00:14:42 +08:00
回复了 iNeXT 创建的主题 C C++builder 有没有好用的插件,求推荐!!!
http://gcc9445.blogspot.com/2012/11/bcb-property.html

感觉应该是这个原因吧,没 win 试 bcb 了
2017-05-20 23:26:13 +08:00
回复了 xliao 创建的主题 数据库 大家怎么看子查询作为 Select column 的 SQL?
根据业务需求和性能平衡吧,一般如果需要查询的字段很少(一个,两个)并且通过是可以通过唯一索引在子查询查到的话,那么可以考虑用子查询,如果需要获取的字段很多的话,那么建议还是去 join 吧,另外这么说也并不是完全正确,具体还是是需要根据执行计划来优化,平衡内存和时间的消耗
2017-05-18 09:39:42 +08:00
回复了 notedit 创建的主题 iDev 哪里可以查看 oc 和 Swift 开发的 app 的比例?
oc 做了,丢双语言的 demo ?感觉 sdk 需要兼容性,别人要是要兼容 iOS 7 那不是不能用你们的服务了
2017-05-17 14:55:43 +08:00
回复了 w445097062 创建的主题 iDev 寻求 iOS App 测试工具推荐
不是用 Instruments ?
2017-05-17 14:02:26 +08:00
回复了 iNeXT 创建的主题 C C++builder 有没有好用的插件,求推荐!!!
@iNeXT C++ Builder 好像自带了几个主题的,不过都很丑。。。我好久没用了。。。只是插件记得用这个最好用,必备 XDDD
现在共享不都是租赁么?共享程序员不就是外包公司么😂😂😂
2017-05-14 19:01:50 +08:00
回复了 iNeXT 创建的主题 C C++builder 有没有好用的插件,求推荐!!!
以前一直用 CnPack IDE,增强挺多的
2017-05-14 19:00:15 +08:00
回复了 ResidualSoils 创建的主题 程序员 萌新提问:有前端和后端,那么有中端吗?
软件领域的终极解决方案,实在不行就加一层,于是很多个中端就诞生了
2017-05-14 17:20:23 +08:00
回复了 mikicomo 创建的主题 问与答 Git 使用的一个问题
@mikicomo 根据建分区的文件系统来的,可区分,可不区分,记忆中好像新机器都是默认不区分大小写的
2017-05-12 11:53:10 +08:00
回复了 543400 创建的主题 PHP 我又来了,关于函数数组里面怎么创建新的键值问题
@543400 再次,上面也说了大家讨论问题目的是学习知识,提高自己,做技术需要沉下来,才能更好积累
关于如何正面回答你的问题 “每次 demoArray() 实际上是创建了一个新的数组出来,也就是你 unset(demoArray()['a ‘]) 和下面 echo $aa['a'] 是两个东西” 这句话其实基本足够了,但是这句话是建立在需要有基本的开发知识来理解的,所以我发现楼主对内存,变量,函数的基础并不清楚,并且试图找到并不合理的解决方案,所以才有了昨晚两大长断的回答,当然也是因为最近在研究 php 内存管理刚好可以用这个来给楼主解答下
从你看文档来说,感觉楼主应该是用 php 的文档在入门开发,所以才建议楼主找个系统点的入门书去学习,文档在你有了一定的基础之后,是一个参考利器,就酱
2017-05-12 11:39:44 +08:00
回复了 543400 创建的主题 PHP 我又来了,关于函数数组里面怎么创建新的键值问题
@543400 并不是你爆炸我才接着回复,而是我发现你对这个问题理解上不太对,想把问题讨论清楚而已
看了文档所谓间接引用,原文用的词叫 dereferencing 意思也就说,函数返回的数组值,在 php 5.5 以前只是地址,并不能直接使用,在 php 5.5 后解释器自动的做了一次解除引用( reference 在有内存管理的语言里面一般叫引用,其实就是通过传递地址来传递变量或是对象,dereference 就是解除传递来地址的引用,变成实际可用的值或者对象)但是呢,实际上 php 5.5 以前必须这么使用,个人理解应该是解析器没办法去做这个操作(解析器开发者的锅)所以并没有什么用武之地,这只能算是一种语法糖
其次,我没有否仍你所说的东西,所谓间接引用确实没听过,这个问题本质对我来说就是函数返回了一个数组对象,这是长时间开发得到的经验
另外建议楼主找本系统点的入门书去学习,文档并不会教你怎么编程,只是告诉你有什么 API 怎么使用,就像有人给了你一堆积木,但是不告诉你怎么去建造大楼一样
活少钱多离家近,周周都有大聚餐,月月都有购物卡,年年免费出国游😆,逢年过节要发钱,上班随你来不来
嗯?这感觉公司要倒的节奏,需要找家国企做公务员?
2017-05-12 09:34:53 +08:00
回复了 543400 创建的主题 PHP 我又来了,关于函数数组里面怎么创建新的键值问题
@hzw94 😂😂😂
2017-05-11 22:29:47 +08:00
回复了 543400 创建的主题 PHP 我又来了,关于函数数组里面怎么创建新的键值问题
@543400
我所说的 “每次 demoArray() 实际上是创建了一个新的数组出来,也就是你 unset(demoArray()['a ‘]) 和下面 echo $aa['a'] 是两个东西” 这句话背后的东西,也就是上面所说的东西的结果
另外从感性上理解,如果能使用 unset(demoArray()['a']) 把 demoArray() 返回的数组都改变了,那么函数的调用就会变得不可信任 + 难以维护,所以一般情况下,我们很少使用全局变量去操控函数内的变化
2017-05-11 22:26:20 +08:00
回复了 543400 创建的主题 PHP 我又来了,关于函数数组里面怎么创建新的键值问题
@543400
最近刚好在研究 PHP 内存管理方面的问题,但是如果是 C 就好了,可以很容易把内存地址打印出来,PHP 没有这么个东西来做,但是 PHP 提供了查看变量内存引用计数的函数 debug_zval_dump,配合你的代码做下分析

// 上半部分代码不变
function demoArray(){

return array(
"a"=>"我是 a",
"b"=>"我是 b",

);

};
// 把你代码下面改一下改成这样
echo "\nS.1 -----------------------\n";
debug_zval_dump(demoArray());
unset( demoArray()["a"] );
debug_zval_dump(demoArray());

echo "\nS.2 -----------------------\n";
$aa=demoArray();
debug_zval_dump(demoArray());
debug_zval_dump($aa);

echo "\nS.3 -----------------------\n";
unset($aa['a']);
debug_zval_dump(demoArray());
debug_zval_dump($aa);

对应下面的输出,下面来细说具体,下面的 refcount 就是引用数量,代表有多少个变量引用着这个变量,但是要注意的是 debug_zval_dump 函数自身会对变量产生一个引用,也就是真实的引用数量实际上是下面的数字 -1,如果 refcount - 1 = 0 了说明上下文代码中没有引用到这个变量,在 debug_zval_dump 调用结束后,他的内存就会被回收

S.1 -----------------------
代码是这样

echo "\nS.1 -----------------------\n";
debug_zval_dump(demoArray());
unset( demoArray()["a"] );
debug_zval_dump(demoArray());

输出是这样
array(2) refcount(1){
["a"]=>
string(8) "我是 a" refcount(2)
["b"]=>
string(8) "我是 b" refcount(2)
}
array(2) refcount(1){
["a"]=>
string(8) "我是 a" refcount(2)
["b"]=>
string(8) "我是 b" refcount(2)
}
这里,是用来比较 unset 对 demoArray() 的影响
可以看到 unset(demoArray()['a']) 对 demoArray() 函数的返回值没有任何的影响
也说明了每次 demoArray() 返回的结果是相互独立的
其中对于数组的 refcount = 1 是 debug_zval_dump 函数产生的,对于数组中两个元素的 refcount = 2 是数组本身对数组中变量的引用和 debug_zval_dump 函数对数组两个元素的引用

S.2 -----------------------
代码是这样

echo "\nS.2 -----------------------\n";
$aa=demoArray();
debug_zval_dump(demoArray());
debug_zval_dump($aa);

输出是这样

array(2) refcount(1){
["a"]=>
string(8) "我是 a" refcount(3)
["b"]=>
string(8) "我是 b" refcount(3)
}
array(2) refcount(2){
["a"]=>
string(8) "我是 a" refcount(2)
["b"]=>
string(8) "我是 b" refcount(2)
}
这里是看使用 $aa = demoArray() 对引用计数的影响
第一组结果:数组的引用数量还是 1 证明只有 debug_zval_dump 函数对其引用了,但是里面的数组元素的引用数变成了 3 这是因为除了第一步中说到的 debug_zval_dump() 函数,和 demoArray() 返回的数组本身对这两个元素进行了引用,还有赋值以后 $aa 这个数组,对这两个元素进行了引用( PHP 是写时复制,也就是说,在不改变变量的情况下,PHP 并不会真实的复制变量,而是对原来变量的引用计数 +1,等到真实的发生读写的时候,才会创建新的变量)
第二组结果:对于数组本身,那就是 $aa 这个变量和 debug_zval_dump 函数对其引用,所以数组的引用数是 2,但是为什么元素的引用数是 1 呢?之前直接 debug_zval_dump 输出的为什么会更多呢?因为 debug_zval_dump 输出后,没有变量接收 debug_zval_dump(demoArray()); 这里 demoArray() 的返回值(没有变量引用 debug_zval_dump 函数里面 demoArray() 调用的结果)所以,这里引用计数变成 2,也就是数组 $aa 和 debug_zval_dump 分别对数组和数组里面的元素进行引用

S.3 -----------------------
代码是这样

echo "\nS.3 -----------------------\n";
unset($aa['a']);
debug_zval_dump(demoArray());
debug_zval_dump($aa);

输出是这样

array(2) refcount(1){
["a"]=>
string(8) "我是 a" refcount(2)
["b"]=>
string(8) "我是 b" refcount(3)
}
array(1) refcount(2){
["b"]=>
string(8) "我是 b" refcount(2)
}
这里是看 unset($aa['a']) 对引用计数的影响
在进行了 unset($aa['a']) 之后
第一组数据,直接输出 debug_zval_dump(demoArray()); 的结果,和 S2 中接近,但是数组中 a 元素的引用变成了 2,也就是说明 unset 有效果了,引用数组中的 a 元素的变量少了一个
第二组数据也就是 $aa 的引用情况,和预想的相同,a 没了,b 不变

---------------------

总结---------------------------------------

1. 上面三组输出,每一组 debug_zval_dump(demoArray()); 的输出结果都是一样的,可以侧面证明,每次 demoArray() 返回的数组,实际上都是独立的一个数组
2. 使用 $aa 变量存储了 demoArray() 返回的数组后,debug_zval_dump(demoArray()); 数组的引用计数器并未增加,证明 $aa 保存的数组和 demoArray() 返回的数组并没有关系
但是数组中元素的引用计数器变化证明,使用 $aa 存储了 demoArray() 返回的数组后,可以认为 $aa 保存数组的元素
3. 使用 unset($aa['a']) 后,数组中元素引用计数器变化,也证明了在这个时候 $aa 和 demoArray() 返回的数组是没关系的

撒花完结~~~~~~

补充下,我不是大神,大家一起交流学习才能提高,因为近期在写 php 的项目,很多经验是在使用其他语言开发的时候带过来的,但是基础概念是相通的,你说的那个参考文档没看过,因为在我用过的语言没有遇到过需要先使用临时变量获取函数结果(当然你说了我懒得去查这是个什么概念是我的锅),再使用结果的情况(我从 PHP 5.6 开始使用,去年升级公司服务器到 PHP7 就更没接触过了),这里涉及到了内存管理的一些知识,如果是 C 可以不用这么复杂的解释,直接打印内存地址就可以了
2017-05-11 21:19:36 +08:00
回复了 543400 创建的主题 PHP 我又来了,关于函数数组里面怎么创建新的键值问题
我说的是把 unset($aa['a']) 放到 $aa = demoArray() 下面
另外 demoArray() 函数每次返回确实都是一个独立的数组对象,所以你使用 unset(demoArray()['a']) 是没用的

unset(demoArray()['a']); 这行代码,本质上你可以认为解释器做了下面的操作

$tmp = demoArray();
unset($tmp);

---------------分割线,也就是说你的程序本质上变成下面的样子
function demoArray(){

return array(
"a"=>"我是 a",
"b"=>"我是 b",

);

};


$tmp = demoArray(); // 这里原来是这样的 unset( demoArray()["a"] );
unset($tmp);

$aa=demoArray();
echo $aa["a"];
---------------分割线

所以我说你 unset(demoArray()['a']) 和下面 $aa = demoArray(); 所操作的是两个独立的数组

你所说的间接引用数组,看了你发的文档才知道-,-原来以前的 php 这么二,函数返回值必须要用临时变量保存,不能直接使用,你那中文文档我没见过,这么翻译也很诡异

其次,不用说打脸不打脸,台阶不台阶,大家讨论问题,淡定点
1  2  3  4  5  6  7  8  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2402 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 738ms · UTC 07:32 · PVG 15:32 · LAX 00:32 · JFK 03:32
Developed with CodeLauncher
♥ Do have faith in what you're doing.