PHP Notes 01

■PHP的基本语法(PHP在语法上很大程度地参考了C语言)
 
PHP 脚本在服务器上执行,然后向浏览器发送回纯 HTML 结果。
 
PHP 文件的默认文件扩展名是 ".php"。
 
PHP 文件通常包含 HTML 标签以及一些 PHP 脚本代码。
 
PHP 脚本以 <?php 开头,以 ?> 结尾。
 
<?php
echo 'Hello World';
?>
 
 
<?=$变量名?> 只显示一个变量。
 
 
■PHP的注释
 
支持三种注释:
 
<?php
 
// 这是单行注释(C语言风格的单行注释)。
 
# 这也是单行注释(Linux下Shell风格的单行注释)。
 
/*
这是多行注释块
它横跨了多行
(C语言风格的多行注释)。
*/
?>
 
 
■变量
 
PHP中变量的数据类型是不固定的,PHP变量的数据类型是由运行时的上下文决定的。一个变量没有被赋值时系统不会为其分配存储空间,即 Null 。
也就是说 PHP是【弱数据类型】的编程语言。
 
★在PHP中变量会在首次为其赋值时被创建:$变量名=变量值;
 
(PHP变量的命名规范与C相同)
 
★显示变量的数据类型: Var_dump($变量名);
 
★注意:在 PHP 中 变量名 区分大小写。而 函数名、方法名、类名 不区分大小写。
(☆ 在 C语言 中 变量名 和 函数名 都严格区分大小写。)
 
 
■PHP的三种赋值
 
①传值赋值:
在 PHP 中,当一个变量被赋常量值时,就会生成一个变量容器。变量的类型和值就存放在变量容器中。
例如:
$a=5;
$s="new string";
 
 
②引用赋值:
★在 PHP 中引用意味着用不同的名字访问同一个变量内容。就像 硬链接 hardlink 。
 
例如:$a=&$b;
表示 $a 的地址(指针)与 $b 的一样。即 它们都占用内存中的同一块存储空间。
 
unset($a); //不影响$b。
 
PHP的引用 与 C的指针变量 半毛钱关系没有,它们的工作原理分别如下图:
 
【image:PHP的引用 与 C的指针变量.png】
 
 
③引用计数赋值:
★类似 C语言 中两个指针变量之间的赋值,它们传递的是某个数据的地址(指针)。
 
例如:$a=new man();
这种情况下 $a 的值是一个地址,一个对象的地址(此时$a有点想像C的指针变量,因为它们的值都是指针)。也就是说 $a 指向这个对象。
 
其实 $a 的值很丰富,不仅有这个对象的地址,还有一个“引用计数器”,这个“引用计数器”负责计算有多少个变量指向了这个对象。
假设,此时 $a 的值为 0X00FD(1) ,0X00FD 是对象的地址,(1) 是“引用计数器”。
 
若:$b=$a;
此时 $b 的值为 0X00FD(2),即 $a对$b的赋值操作 传递的就是 对象的地址(指针),这种赋值方式就是【引用计数赋值】。
 
PHP中 有两种类型的数据是 引用计数赋值 的,它们分别是 对象 和 资源类型。
 
 
★PHP垃圾回收机制:
其实在PHP中,每个变量都有一个“引用计数器”即“refcount”。“refcount”用以表示指向变量容器的变量(也称符号即symbol)个数。变量容器在“refcount”变成0时就被销毁。 当任何关联到某个变量容器的变量离开它的作用域(比如:函数执行结束),或者对变量调用了函数 unset()时,“refcount”就会减1。——引自:http://php.net/manual/zh/features.gc.refcounting-basics.php
 
 
■PHP的数据类型
 
基本类型:整型、浮点型、字符串、布尔类型(true和false)
 
构造类型:数组(array)、对象(object)
 
特殊类型:Null 空类型、资源类型 例如:$con=mysql_connect("…","…","…");
 
(★ PHP 的 资源类型 就是“通道”。沿着“通道”就能获取资源。)
 
 
在PHP中,变量的数据类型是不固定的,PHP变量的数据类型是由运行时的上下文决定的。一个变量没有被赋值时系统不会为其分配存储空间,即 Null 。
也就是说 PHP是【弱数据类型】的编程语言。
 
显示变量的数据类型: Var_dump($变量名);
 
★注意:数据在计算机中都是以二进制的形式存储,当浮点型数据从10进制转换为2进制时会有误差。如果要追求高精度,比如金额的记录,应尽量避免用浮点数进行存储。我们可以用整型存储,比如“用分当元”来存储,即 0.01元(即1分)当1 存储。最终显示时再除以100。
 
 
PHP中有字符串变量,例如:$s="Hello World!";
 
PHP中有布尔类型:true为真,false为假 (不分大小写)。
 
 
★以下的值都会被当做 false 对待:
 
①布尔类型 false 自身;
 
②整型值 0(零);
 
③浮点型值 0.0(零);
 
④空字符串,以及 字符串 "0";
 
⑤不包括任何元素的数组;
 
⑥不包括任何成员变量的对象(仅PHP4.0适用);
 
⑦特殊类型 null(包括尚未被赋值的变量)。
 
口诀:
“是零、是空 就是假;”
“非零、非空 就是真。”
 
 
★强制类型转换:
与 C语言 一样,PHP也可以直接在变量前加上(类型)以对该变量进行强制类型转换,格式如:(类型)$变量名
 
其它类型转为 整型 可以通过 intval(变量) 实现。
其它类型转为 浮点型 可以通过 floatval(变量) 实现。
其它类型转为 字符串 可以通过 strval(变量) 实现。
 
★注意,PHP的数据类型转换 与 C语言 中的数据类型转换 的效果完全不同:
 
在 PHP 中 例如:(int)'a' 等于 0 【强制数据类型转换】;
在 PHP 中 例如:'a'+3 等于 3 【自动数据类型转换】;
 
在 C语言 中 例如:(int)'a' 等于 十进制 97 ;
在 C语言 中 例如:'a'+3 等于 十进制 100 ;
 
而且 在 PHP 中还可以 'abc'+3 等于 3 ;
 
 
■PHP的动态名称
 
在PHP中,关于变量名、函数名、对象名、类名 都非常灵活。
甚至可以用变量来表示以上几种名称。
 
例如,动态变量名:
 
$laoDa='刘备';
$lao2='关羽';
$lao3='张飞';
 
$who = 'laoDa';
 
echo $$who; //输出:刘备
 
$shui ='who';
 
echo $$$shui; //也输出:刘备
 
 
动态类名,如:$class = 'human' 或 'dog' 或 'cat';
则 new $class 就可以动态地得到human的对象、dog的对象 或 cat的对象。
 
 
■PHP的常量
 
常量的意义:一旦定义,无法改变(不允被许赋值、不允许被重定义、不可以清除)。
 
定义常量的一般形式:
define('常量名',常量值);
 
PHP5.3以后支持 关键字 const 来定义符号常量。
一般形式为:
const 常量名 = 常量值;
 
例如:
 
define('PIE',3.14);
$r=5;
 
echo '周长',$r * PIE * 2,'<br />'; //周长
 
echo '周长',$r * $r * PIE,'<br />'; //面积
 
echo '周长',$r * $r * $r * PIE * 4 / 3; //体积
 
注意:
①常量一旦定义,就不允被许赋值、不允许被重定义、不可以清除。
②常量是全局有效的,因此在页面内、函数内、类内部 甚至数组内部都可以直接引用,不用考虑作用域的问题。
③常量的值不能是 数组、对象、资源类型。
 
 
动态常量名:
可以用 constant 函数来读取常量的值。
一般形式为:constant(常量名) 
 
实现常量名动态的例子:
define('LAODA','刘备');
$who='LAODA';
echo constant($who);; //输出:刘备
 
 
 
■PHP运算符注意
 
☆在C语言中 3/2 会得到 1,因为整型除以整型,结果也是整型。
在PHP中 3/2 等于 1.5。
 
 
注意:PHP中取模运算符(求余运算符) % 的结果的正负,只与左边的数一样。例如:-3%/x,无论x如何,结果都是负数。
 
 
★前++ 与 后++ :
$b=$a++; //等价于 $b=$a; $a=$a+1;
 
$b=++$a; //等价于 $a=$a+1; $b=$a;
 
 
全等 === :值与类型都要相等。
 
不全等 !=== :值或类型不相等。
 
 
★PHP的逻辑运算符:
&& and 与(并且)
|| or  或
!      非
xor    异或:两者不同 即 一方为真、一方为假 时返回真。
 
★逻辑运算符的“短路特性”:(C、PHP、JAVA 都有这个特性)
逻辑运算符的【结合性】是 从左往右 。如果执行左边(前面)的内容就能判断出整个表达式的结果,那么右边(后面)的内容就不再执行。
 
例如:
$a=1;
$b=0;
 
if($a || $b++){
echo $b; // 输出:0
}
 
因为逻辑或运算符||判断$a为真以后,就已经可以得出整个表达式的结果为真 ,没有必要继续运行了,所有后续的内容没有被执行。因此$b的值依然是0。
 
又例如:
$a=0;
$b=0;
 
if($a && b++){
echo $b; // 输出:0
}
 
因为逻辑与运算符&&判断$a为假以后,就已经可以得出整个表达式的结果为假 ,没有必要继续运行了,所有后续的内容没有被执行。因此$b的值依然是0。
 
 
★字符串运算符:“.”(英文句话)。
作用:字符串的拼接。
(字符串的拼接比 C语言 方便太多了)
 
 
类型运算符:instanceof
instanceof 用于判断一个变量是否属于某一个类(class)的实例。
使用形式:$变量 instanceof 类名
 
 
☆位运算符:
 
16进制的整型数据,编辑时 以 0x 开头,输出时将自动转换为10进制。
例如:echo 0x123; //输出:291
 
8进制的整型数据,编辑时 以 0 开头,输出时将自动转换为10进制。
例如:echo 0123; //输出:83
 
●按位与 &
作用:把参与运算的两个数 按每个二进制位 进行“与”计算。
例如:
$a = 12 & 5;
 
12 :1100
 5 :0101
&-----------
 0100 即 4
 
echo $a; //输出:4
 
●按位或 |
作用:把参与运算的两个数 按每个二进制位 进行“或”计算。
例如:
$a = 12 | 5;
 
12 :1100
 5 :0101
|-----------
 1101 即 13
 
echo $a; //输出:13
 
●按位异或 ^
作用:把参与运算的两个数 按每个二进制位 进行“异或”计算。
例如:
$a = 12 ^ 5;
 
12 :1100
 5 :0101
^-----------
 1001 即 9
 
echo $a; //输出:9
 
●按位非 ~
作用:把这个数 按每个二进制位 进行“取反”计算。
例如:
$a = ~12;
 
12 :[0000 0000][0000 0000][0000 0000][0000 1100]
~-------------------------------------------------
 [1111 1111][1111 1111][1111 1111][1111 0011]
 
 【注意:是补码】即 -13
 
echo $a; //输出:-13
 
 
■表达式的返回值
 
1+2  这条表达式的值是 3
 
2 * 3 这条表达式的值是 6
 
那么 a = 5 这条表达式的值是什么呢?
 
赋值表达式 也有值吗?
 
★只要是表达式,就必然会返回一个计算结果(即 返回值)。
 
★赋值表达式的计算结果(返回值)为:赋值运算符(即 “=”)左侧的变量的值。
例如:echo ($a=5); //输出:5
 
 
关系表达式(即 通过 关系运算符 计算的表达式)的返回值为:布尔值(true 、false)。
例如:var_dump(5>2); //输出:bool(true)
 
 
逻辑表达式的返回值为:布尔值(true 、false)。
例如:var_dump(99&&0); //输出:bool(false)
 
 
☆在PHP中,两个整数相除,可能得到浮点数。
这一点与 C、java 等“强数据类型语言”不一样,请注意。
例如:echo 3/2; //输出:1.5
 
 
★echo 不是一个函数(它是一个语言结构)。
 
面试题-问以下哪条语句速度最快:
echo "Hello"." "."world"."!";
echo 'Hello'.' '.'world'.'!';
echo 'Hello',' ','world','!';
 
答案:第三条语句最快。
因为 单引号 比 双引号 快,所有 第二条语句 比 第一条语句 快;
又因为 “.” 是字符串运算符,需要进行运算。而 第三条语句 中的“,”只表示连续输出3个字符串,不用运算。所有 第三条语句 比 第二条语句 快。
 
 
■控制结构
 
顺序结构
选择结构:if、else if、switch
循环结构:for、while、do-while、foreach
 
 
switch($today){
case 'Mon':
echo '今天星期一,猴子穿新衣';
break;
case 'Tue':
echo '今天星期二,猴子当小二';
break;
case 'Wed':
echo '今天星期三,猴子去爬山';
break;
case 'Thu':
echo '今天星期四,猴子做好事';
break;
case 'Fri':
echo '今天星期五,猴子打老虎';
break;
case 'Sat':
echo '今天星期六,猴子不见了';
break;
case 'Sun':
echo '今天星期天,猴子放假';
break;
default: //default语言 放置的位置 不会影响结果。
echo '猴子不明白你说什么';
break;
}
 
 
★if语句 和 switch语句 的区别 及 应用场景:
if语句 是针对某个范围作判断的,而 switch语句 是针对某几个特定的值作判断的。
 
 
☆计算机的价值 真正体验在它有循环。
 
 
★while 与 do-while 的分别:
举个形象的例子:有位大哥去跟你讨债。
while 就是先问你还不还钱。还,他就放过你。不还,他就打你。
do-while 就是一见到你先打一顿,再问你还不还钱。还,他就放过你。不还,他就继续打你。(就是说,do-while 无论你还不还钱都至少要挨一顿)
 
 
break 语句:用于结束当前的 for、while、do-while、switch 语句。可以在其后跟一个数字表示退出到第几层。
例如:break 2; //表示退出到第2层。默认为 break 1;
 
continue 语句:用于跳过本次循环中剩余的代码,并开始执行下一次的循环。可以在后面跟一个数字,表示跳过几重循环。
例如:continue 2; //表示一次就跳过2重循环。默认为 continue 1;
 
goto语句:常用于跳出 循环结构 或 switch语句 ,可以代替多层的 break语句。
例如:
goto a;
 
a:
echo 'a';
 
 
 

 

posted @ 2017-11-10 20:11  Uncle_Jay  阅读(170)  评论(0编辑  收藏  举报