发现了一个容易出错,但是不懂得原理却解释不明白的问题
foreach ($array as &$row) {
$row = explode(‘/’, $row);
}
foreach ($array as $row) {
//do something
}
这么写,在第二个循环会出逻辑错误,加入第二个循环中do something的地方是输出$row,循环到最后一个的时候的输出是倒数第二个元素,而不是最后一个
要这么写
foreach ($array as &$row) {
$row = explode(‘/’, $row);
}
unset($row);
foreach ($array as $row) {
//do something
}
或者第一个循环这么写
foreach ($array as $key => $row) {
$array[$key] = explode(‘/’, $row);
}
说一下原理
第一个循环使用了引用,循环结束后,$row引用的是$array数组的最后一个元素,当开始第二个循环的时候,$row变量每次循环都会被赋一个 新值,在php中,如果一个内存空间是被引用的,那么当改变它的时候是直接改变这块内存空间的值,也就是说,当第二个foreach的第一次循 环,$array的最后一个元素的值就被改变为$array的第一个元素的值,第二次循环的时候,改变为第二个元素的值,倒数第二次循环的时候,被改变为 倒数第二个元素值,而最后一次循环的时候得道的值必然是那个倒数第二个值
当然,如果php的for循环有作用域的话,也不会出现此问题
addslashes对有些特殊字符后跟上’(单引号)并不会加把这个’变成\’
如: 0xbf27 的字就不会
縗<-这个字
<?php
$a = 1;
$b=&$a;
$b=$a++;
echo $a;
echo $b;
?>
最终结果是 11
今天遇到一个问题,同样的程序代码,在两个服务器上,一个可以正常的上传图片,一个总是上传失败,权限、PHP设置全部检查,两台服务器都一样的配置…
google了一下,没找到解决办法但是发现了一个词“文件夹容量超出”
查了一下果然/tmp目录使用率 100%了
例如:array_unique(array(1, 1, 2));
他的结果是
array(2) {
[0]=>
int(1)
[2]=>
int(2)
}
这就不是numeric数组了,直接做json_encode,会输出一个json对象,而不是数组
{“0″:1,”2″:2}
如果这时候页面上js需要的是[1,2]这种数组数据格式,就有可能会产生错误
此时应该在array_unique之后,在做一个array_values
这样:array_values(array_unique(array(1, 1, 2)));
结果就是[1,2]
原文:http://www.phpchina.com/index.php?action-viewnews-itemid-35406
MVC及PHP++、PHP–胡思乱想杂记
来源: PHPchina 发布者:PHPChina
有 一定经验的开发者都了解MVC模式,特别是基于WEB而且又是可以使用嵌入HTML语言进行开发的,比如PHP。诚然PHP作为一种嵌入式的脚本语言是强 大的,这也是一直以来传统PHP给很多人的认知。以至于在PHP3甚至在PHP4时代接触过并最终放弃了PHP的人,都停留在这个认识上,认为PHP没有 什么长处,太过简陋。其实不然,从技术角度来讲,一门语言的语法不能决定一个应用的好坏,很多情况下,语言仅仅是实现工具,几乎所有大中型应该都不太会单 一的采用一门语言来开发,各种语言都有其自身的长处。
长期以来PHP被杂糅进太多的东西了,要负责Db、又要负责HTML、还要负责 Controller、还要负责Model,等等,成了PHP++了。发展到今天,PHP早就脱离了嵌入HTML脚本语言的范畴。应该有更重要的事情给 PHP做。当然嵌入HTML当脚本使唤,仍然是强项,但不应该杂糅了。在此换个角度来看PHP。把PHP按角色来理清一下,顺便来发明几个新名词。与数据 库层面打交道的叫PHP-Db,与流程控制相关的叫PHP-Controler,与HTML等终端呈现打交道的叫PHP-Client,等等。这样认识可 能会更清晰点。
这几天闲来无事,朝思暮想,对MVC的理解有了新的认识,有一点点浅见,于是折腾了一张图。
折腾半天最大 的收获是我们是否需要很肥大的View呢?在各种PHP框架中,View端的语言基本上都采用PHP-Client,比如ZendFramework、 QeePHP等,还有的采用模板标签或模板引擎。在我看来这其实是方便开发者使用的,其实对于View,可以精简至极至。图中的Input和Output 都涉及到View。精简后的View可以根本就不用去管Input和Output的设备、形式、语言,只需要Input进正确格式的数据(比如JSON、 XML),而Output出指定格式的数据(比如JSON、XML)。同样,Output的呈现形式、方法、手段等不是我们要关注的。对于WEB来说可以 Output出的数据可以交给ExtJS,可以交给PHP(此时的PHP是WEB前端脚本语言),可以交给原生Javascript处理。甚至可以以 WML语言输出到WAP。也就是说View如何呈现不是核心所要关注的。
然而我们是怎么做的呢?在Controller中很多开发者并不注重数据 的格式统一与规划,很随意的就丢给了View。更有甚者Controller和View杂糅了,权责不分,该View做的事让Controller做了, 而View又在做Controller的事。不管是从设计简单的网站应用出发还是企业行业应用出发,PHP-Controller都不应该糅进PHP- Client。View里Output出单纯的格式化的数据,有利于AJAX及WebService等。规范了输出,View的呈现就可以由其它团队单独 负责,他们爱用PHP,爱用ExtJS,爱用jQuery,爱谁用谁。
至于什么是Model我也理解一下,理解的不对的话,请各位多踹几 脚。Model在很多人心里长期以来被Db给占了。而在Controller中写了大量应该Model去完成的内容。广义上说其实Model并不仅仅是 Db。比如我们用的FCKeditor我们可以说是一个Model,它用来创建一个可视编辑器。大方面的Model估计都能重视。再说一个小的,比如一个 用户系统中的“用户新增(UserAdd)”这个功能,用户端可能是用户注册,管理端可以是直接创建一个用户。如果在控制器里直接写,用户端和管理端那就 重复写代码了。这样的功能就应该放到Model里,拿来调用。这个就叫Model,类似函数,也叫业务逻辑。控制器控制的只是业务流程。如果控制器掺和模 型的事,凡事诸葛亮,会弄得拥肿无比,非常繁琐,会被累死。
Cache又是一个什么概念呢?一个简单的例子,商品分类列表,当去存取这个列表时, 核心就应该先去Cache里找,找到了核对一下是不是要更新,如果没找到或者要更新,那么就先更新或者在Cache里建立一个副本(这显然是一个很小的循 环或者是分支判断)。然后把Cache里的列表取出来。这样做是免除大量的去存取数据库操作,或称为大量的Model运算。当然我们可以设计成,如果这个 列表有变动就主动去更新Cache。这样命中率会高很多。应该的效率就会提高很多。很多人以为生成静态HTML脚本就是Cache的全部,只是Cache 局部小应用,模板引擎里常用。想开了去,放大了说,Cache跟View没直接关系。Cache可以用在View,当然也可以用在Controller和 Model。
我之前总是使用 mysql_query(“SET NAMES ‘utf8′”); 来设置 MySQL 的默认连接字符集;但是今天发现了一个 PHP 推荐的代替这个方法的设置 MySQL 连接字符集的函数:mysql_set_charset()。
这个函数是这样用的:
mysql_set_charset(‘utf8′, $link);
成功返回 TRUE,失败返回 FALSE。
就这么简单。
下面是PHP手册原文
This is the preferred way to change the charset. Using mysql_query() to execute SET NAMES .. is not recommended.