阅读<php程序设计>笔记

  1. 云栖社区>
  2. 博客>
  3. 正文

阅读<php程序设计>笔记

wangtaotao 2011-01-21 14:02:00 浏览1182
展开阅读全文

今天知道了哪些注释风格是从哪些语言演变过来的了。

/**/是c语言的注释风格。

//是c++的语言注释风格

原来php还有种类似shell的注释风格:#



原来php是作为一shell程序进行解析的。这种情况发生在:编译php的时候,没有指定任何服务器类型。那么就表示不作为服务器的一个模块了。这个时候就是以命令行的方式调用了。

难怪:大公司为什么要求要熟悉shell编程。难道,他们是将php作为一个命令行程序执行吗?


现在发现连php圣经中的作者估计也没有完全理解 $a = $b;。在其书中,提到。许多程序员都在这里编写了不高效的代码。因为其实已经拷贝了一份。

从《php程序设计》中提到的意思分析,$b赋值给$a应该只是更新了符号表。并没有得到更多的内存。不过,我也迷糊了:$b假如看做是一个指针。那么,这里也就是复制了一份指针给了$a。也就是最终产生了两份指针,指向了同一个内存地址空间。

或许我的理解不准确,那么 $a= $b 与$a =& $b;的不同是什么?


从本书中,学到了一个新的概念:符号表(symobl table)。书中没有专门说明。按我理解:符号表就是记录符号与内存地址空间的对应关系。换一种理解,里面保存了变量名(这可看成一个符号)指向哪个内存地址。
查资料,得到网友解释:符号表是编译原理的概念、用于编译器区分变量,常量,关键字(if,else等),数字,字符串等东西的一个链表


看了书籍解释,才明白php资源自动回收系统是怎么做到自动回收不被引用的资源了:

每个资源都有一个资源引用数的统计情况(记住英文术语:refrence count)。假如引用数是0的时候。就会自动释放内存。

要学习到的本书提到的专业术语:

copy-on-write 写时复制。就是对两个拷贝中任意一个进行修改值(写操作)时,那么就会复制一块内存区域。
copy-on-write另外一种说法是swallow-copy:吞咽式复制。在值被淹没(覆盖、修改)时,就会产生复制机制
引用计算:对一个资源引用情况进行统计。用一个数字表示,该资源有多少个引用。这样确定是否要释放内存空间。



从书中第一次看到该函数:get_included_files()。获取当前脚本文件有哪些用到include或require的地方。






本书中也提到了函数的复制方面知识:
默认情况下代码:
function get()
{
$m = 5
return $m;
}

$a = get();//这里就会将函数返回的值复制一份。结果产生两份

引用代码:

function & get()
{
$m = 5
return $m;
}
$a = & get();//由于使用了& ,那么不会复制一份。$a还是指向原来$m所在的内存地址。


书中讨论了函数引用的性能方面知识,值得记要:

$a = & get();类似的引用不是必要的。为什么,因为,php中有一个写时复制机制。我的理解是,即使你这样引用了。但是,假如更改了$a的值(进行了写入操作)后,php自动会创建一份新的拷贝。那么你使用&就没有达到预期的效果了。
我在想,什么时候会有写入$a的情况发生?假如$a得到的是一个对象的实例。在后面的代码中使用$a->price =25;更改了对象的属性值。那么也就会触发写时复制机制。


速度方面:返回引用比返回一个值的拷贝要慢。




本书中提到了可变函数。在thinkphp中就用到了:
传入模块和操作名。那么这个操作名就是要执行的方法。所以,就会出现这样的的代码:$naem = $action();传入的参数是哪个。就执行对应的函数。



本书中提到,大括号"()"的经典作用:从周围分离出变量名。
区分:
$a = "abc$defj";//如果没有括号。可能会将$defj当成变量处理。所以最好使用如下方式:
$a = "abc($d)efj";


实现的原来与性能方面:

原来,双引号中的变量替换是使用查找的方式进行的。这样需要消耗cpu资源。难怪,php圣经中提到。尽量少将变量名放到双引号中。这样增加了不必要的查找替换时间。


2011.1.18阅读位置:第四章 引用字符串看完。here文档是未接触的知识。等待看


今天接着看。笔记如下:
一、学习了echo、print、prinf之间的区别。
主要掌握echo与print之间区别。printf用得比较少。跟c语言的同名函数类似的用法。
1.本质不同。echo是一个语言结果。print是一个函数。有一点注意,echo()带有括号也不会出现错误。这也并不能说明它是一个函数。

2.效果或者使用区别,echo能输出多个值。print只能输出一个值。echo '值一','值二';//多个值之间用逗号隔开。

3.printf也是输出。只是他可以对输出的值按一个模板进行格式化。就是这点好。



二、符号比较的新理解

原来一直以为“===”是表示严格相等,就是类型和值同是相等。今天才理解其机制。理解上的差异,虽然没有在实际编程中遇到障碍。但判断会出现无法预料的偏差。按照过去的理解,那么 字符串"5"与整型5使用"==="比较的时候。因为会判断两者数据类型是否相等。"5"===5得到的结果是false。

看了本书,明白它的机制是:如果比较的类型是从int和string中选择。将所有值统一转化成整型进行比较。那么,"5"===5得到的结果是false。这里"5"转化成整型还是5


这里讲到了我过去一直没有注意到的一点:字符串"1kkm"转化成整型结果是"1"。过去我以为:只要是字符串转化成整型结果都会是0。除了该字符串全部是以数字形式比如"5623"转化成整型的结果是5623。之前的以为是错了。从本书中注释中一句话:因为字符串不以为数字开头(所以"php rocks"转化的结果是0)。



为了加深理解,我编写了如下代码进行测试:



$a = "5263";

$b =intval($a);
var_dump($b);得到结果是5263。
将$a = "5ggg263";结果是5。结论:string转化成整型是根据首个字符中的内容而定的。首个字符不是数字形式。那么就无法转化。转化成0。

注:这样的转化规则只是对表现出来的结果进行总结。具体实现原理,就是手册上提到的按十进制进行转化。

2011.1.20 看到字符串比较部分


接着看:


从本书中,提到有个函数可以体现出php中堆栈的应用效果。array_push()和array_pop()体现了堆栈的后进先出的特性(array_pop推出的元素总会是最后进的数组元素)

网友评论

登录后评论
0/500
评论
wangtaotao
+ 关注