阅读<php程序设计>笔记

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

/**/是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推出的元素总会是最后进的数组元素)

时间: 2024-09-20 00:09:50

阅读<php程序设计>笔记的相关文章

《Spring Boot Cookbook》阅读笔记

声明1:该系列教程已经在极客学院上线:spring-boot cookbook 声明2:本博客文章需征得作者同意后方可转载 作为后端开发,Spring Boot值得拥有 从技术雷达 : 关于技术趋势的分析报告和Profile of successful Java developer in 2016这两篇文章中都可以看出,作为Java开发人员,Spring Boot已经成为你不得不尽快补充的一项技能. 最近一个月一直在学习Spring Boot框架,在阅读<Spring Boot Cookbook

Spring Boot的自动配置、Command-line Runner

接下来关于SpringBoot的一系列文章和例子,都来自<Spring Boot Cookbook>这本书,本文的主要内容是start.spring.io的使用.Spring Boot的自动配置以及CommandRunner的角色和应用场景. 1. start.spring.io的使用 首先带你浏览http://start.spring.io/,在这个网址中有一些Spring Boot提供的组件,然后会给你展示如何让你的Spring工程变得"Bootiful",我称之为&q

Spring Boot 探索系列 - 自动化配置篇

26. Logging Prev  Part IV. Spring Boot features  Next 26. Logging Spring Boot uses Commons Logging for all internal logging, but leaves the underlying log implementation open. Default configurations are provided for Java Util Logging,Log4J, Log4J2 an

Spring Boot特性

1. SpringApplication SpringApplication 类是启动 Spring Boot 应用的入口类,你可以创建一个包含 main() 方法的类,来运行 SpringApplication.run 这个静态方法: public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); } 运行该类会有如下输出: . ____ _ __ _ _ /\

Spring Boot 整合 Thymeleaf 完整 Web 案例

摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! Thymeleaf 是一种模板语言.那模板语言或模板引擎是什么?常见的模板语言都包含以下几个概念:数据(Data).模板(Template).模板引擎(Template Engine)和结果文档(Result Documents). 数据 数据是信息的表现形式和载体,可以是符号.文字.数字.语音.图像.视频等.数据和信息是不可分离的,数据是信息的表达,信息是数据的内涵.数据本身没有意义,数据只

《Spring Boot官方指南》(二)入门(二)

3.2.5 命令行补全工具 Spring Boot CLI附带了一些脚本,这些脚本为BASH 和zsh提供了命令行补全功能.在任何shell里面都可以source到这些脚本(也叫spring),也可以初始化到个人或者系统级别的命令行工具里面.在Debian系统里面,系统级别的脚本在这个路径:/shell-completion/bash,shell程序启动以后,这里面的所有脚本都可以执行.例如,您已经使用SDKMAN!安装了这些脚本,为了手动执行他们,可以这样操作: $ . ~/.sdkman/c

深入学习微框架:Spring Boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以 及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者. 多年以来,Spring IO平台饱受非议的一点就是大量的XML配置以及复杂的依赖管理.在去年的SpringOne 2GX会议上,Pivotal的CTO Adrian Co

Spring Boot中集成Spring Security 专题

if语句中条件判断就是检查当前的url请求是否是logout-url的配置值,接下来,获取用户的authentication,并循环调用处理器链中各个处理器的logout()函数,前面在parse阶段说过,处理器链中有两个实例,处理会话的SecurityContextLogoutHandler及remember-me服务,我们来一一看看它们的logout函数实现: 2.1.0 SecurityContextLogoutHandler public void logout(HttpServletR

Spring boot 通用配置文件模板

Spring boot 通用配置文件模板   001 # ===================================================================002 # COMMON SPRING BOOT PROPERTIES003 #004 # This sample file is provided as a guideline. Do NOT copy it in its005 # entirety to your own application.  

Spring Boot with Redis

Spring Boot简介 Spring Boot是为了简化Spring开发而生,从Spring 3.x开始,Spring社区的发展方向就是弱化xml配置文件而加大注解的戏份.最近召开的SpringOne2GX2015大会上显示:Spring Boot已经是Spring社区中增长最迅速的框架,前三名是:Spring Framework,Spring Boot和Spring Security,这个应该是未来的趋势. 我学习Spring Boot,是因为通过cli工具,spring boot开始往f