PHP编程:PHP小研讨拿出来和人人分享
即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。 小小看法(参考风雪之隅及网上相干材料):援用和复制的区分:
人人都晓得援用其实就是:$a = 1;$b = $a;改动$a或$b不会影响对方。而援用是按地址传值:$a = 1;$b = &$a;改动任何一个另外一个值城市改动。
然而在末尾加个why呢,为何会是如许呢?
人人需求了解php外面的两个机制就是copy on write 和 change on write:
copy on write :写时复制;使用于变量复制。例如下面例子,$a = 1;$a变量寄存在符号内外面,而值"1"寄存在zval中。意思也就是说php外面寄存
的变量,每一个变量名都寄存在符号内外面,每一个符号对应一个zval;zval可以看作一个容器,外面寄存着变量值,变量类型,等等。
$a = 1;$b = $a;能够会有人以为内存里有两个"1",实践上并非如许的,$a与$b都指向寄存1的zval容器。可以抽象比方为,$a与$b各自有条线指向
zval,zval中有个参数是refcount来计数的,就是统计有几何线指向本人的。当有个变量停止复制时分refcount就会加1。即:$a = 1;$b = $a;此时存
放1的zval布局外面的refcount值为2。php外面有个函数可以检查,就是debug_zval_dump($v);当debug_zval_dump($a);时分计数为3,由于$a是以
传值得模式传给debug_zval_dump的所以打印出来的值是3。
接着申明一个成绩,就是unset,它的感化是使变量的refcount数减一。也就是当refcount值为0的时分才会将变量值占的内存释放失落。当unset($b)的时分
1并没有在内存中释放失落,而是指向它的援用数减。
傍边说到的内存释能够其实不会释放给体系(OS),php会为本人启示个指定巨细的内存,当有变量发生时分会去本人的内存区外面请求,当释放的时分会释放到自
己的内存区域外面。关于进步效力有很大匡助了。然而当超越这个指定值得时分会去向体系请求内存了,那时分再释放的时分就会释放给体系了
关于援用,zval外面有另外一个参数is_ref来标志(标志是不是为真实的援用),此值默许为0,例如:$a = 1;$b = &$a;此时debug_zval_dump($a);了局为1,
refcount = 2,is_ref = 3,
版本5.2.17源码中的zval结合体,可以去官网下载
typedef union _zvalue_value {
long lval; /* long value */
double dval; /* double value */
struct {
char *val;
int len;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uint refcount;
zend_uchar type; /* active type */
zend_uchar is_ref;
};
测试几个法式的履行速度
测试情况:
OS:win7
php vesion 5.2.9
apache2.0
1.判别变量值是不是为空用'!'加变量名字与empty加变量名做履行工夫对照(轮回1万万次)
if外面利用!$a履行工夫为:2.40036678314s
if外面利用empty($a)履行工夫为:2.52875089645s
测试代码:
$start = microtime(true);
$a = '';
for($i=0; $i < 10000000; $i++){
if(!$a){//可改成empty($a)
echo " ";
}
}
$end = microtime(true);
echo "履行工夫为:",($end-$start),"s";
?>
2.利用if-esle与利用三元运算符做履行工夫对照(轮回1万万次)
利用if-else 履行工夫为:2.37516283989s
利用三元运算符 履行工夫为:2.14390015602s
三元运算符运转时分,每次变量城市复制一次
if-else不会,影响甚微,只是拿出来和人人分享下
测试代码:
$start = microtime(true);
$a = range(1, 1000);
for($i=0; $i < 10000000; $i++){
if(isset($a)){
echo " ";
}else{
echo "";
}
}
$end = microtime(true);
echo "履行工夫为:",($end-$start),"s";
?>
$start = microtime(true);
$a = range(1, 1000);
for($i=0; $i < 10000000; $i++){
isset($a) ? " " : "";
}
$end = microtime(true);
echo "履行工夫为:",($end-$start),"s";
?>
PHP和HTML混合编程应该不成问题,在这期间,你完全可以让PHP给你算算 一加一等于几,然后在浏览器输出,不要觉得幼稚,这的确是跟阿波罗登月一样,你打的是一小段代码,但是对于你的编程之路,可是迈出了一大步啊!兴奋吧?但是不得不再给你泼点冷水,您还是菜鸟一个。 在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、 ,熟悉html,能用div+css,还有javascript,优先考虑linux。我在开始学习的时候,就想把这些知识一起学习,我天真的认为同时学习能够互相呼应,因为知识是相通的。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 有时候汉字的空格也能导致页面出错,所以在写代码的时候,要输入空格最好用引文模式。 写js我最烦的就是 ie 和 firefox下同样的代码 结果显示的结果千差万别,还是就是最好不要用遨游去调试,因为有时候遨游是禁用js的,有可能代码是争取结果被遨游折腾的认为是代码写错。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。 这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。 本文当是我的笔记啦,遇到的问题随时填充 微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox支持的不是很好,所以能少用还是少用的好。 小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。 最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标, 不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。 php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会) 基础有没有对学习php没有太大区别,关键是兴趣。
页:
[1]