PHP学习(2)
一,php 写法
PHP 除了变量不区分大小写 但是建议区分
注: 代码后面没有 html 代码的时候 结束标签可以省略
php 最后一条语句 分号 " ; " 可以省略 但是 省略了 结束标签 之后不能省略
例: <? echo 11 // 不可行
<? echo 11; // 可行
<? echo 11 ?> // 可行
二,注释
// 双斜杠注释 一行
# 注释一行
/* 代码 */ 多行注释
小技巧
/* 前面加斜杠之后多行注释失效 //*
代码
//* 注释代码
也可以用if 语句注释 if(1 == 0) 执行 if(1 == 1)
三,变量
1.变量名和值 是 引用关系/指代关系
2.没有声明操作 变量赋值 等于声明
3. 操作 4个
赋值
取值
判断(isset($变量)返回布尔值 null 也是 false)
删除(unset($变量)) 其实是断开和值之间的联系 值还在内存中 但是会被回收
4.命名
(1)驼峰命名法 首单词小写 后面每个单词首字母大写
(2)帕斯卡命名法 每个单词首字母大写
(3)下划线分割法 都是小写 单词之间用下划线 _ 分开
5. 传值方式
(1) 值传递 复制值再赋值 互不影响
$v1 = 1;
$v2 = $v1;
(2)引用传递 & 符 复制引用关系直接让$v2 指向 $v1 的值
$v1 = 1;
$v2 = & $v1;
修改一个的值 另一个也会变 注 unset 只能切断连接 不能删除值
6.可变变量
$a = 'abc';
$abc = 10;
echo $$a; // 10
用法
$v1 = 1; $v2 = 2; $v3 = 3; $v4 = 4; $v5 = 5; $sum = 0; for($i=1;$i<=5;$i++){ $v = "v" . $i; $sum += $$v; } echo $sum;
四,预定义变量
$_GET $_POST $_REQUEST $_SERVER $GLOBALS $_SESSION $_COOKIE $_FILES 都是数组
request 在 get 和 post 同时存在时 默认post为主(同样的变量名post会覆盖get)// 编程不建议用 因为提交模式不清晰
修改:php.ini request_order = "GP" // G 是get P是post 后面的会覆盖前面的 可以改成 PG以get为主
$GOLBALS 主要用于在局部范围不可以使用全局变量的时候,又需要该全局变量的值,此时就可以用它取得该全局变量的值
$v = 1;
echo $v; // 1
echo $GLOBALS['v']; // 1
isset 判断变量是否存在或者变量是否为空(null)
impty 判断变量的内容是否为空 不是null 的空 二十 没有内容 比如 0, "", "0", false, null, array()空也是空
五,常量 定义以后不会变 也不应该变
1. define("STR", '13131'); // 声明方法1
echo STR; // 13131
echo constant("STR"); // 13131
2. const STR = 123; // 方法2 // 只能用在顶层代码 而不能在大括号中
3. 也能用可变变量 // 灵活运用
$v = "STR";
const STR = 123;
echo constant($v); // 123
4.defined("STR"); 返回布尔值
注:使用未定义常量报错但是 还是会被使用 并且 其值是常量本身
5.预定义常量 // 系统自带的常量 有几百个 详情看手册
M_PI 圆周率
PHP_OS 当前操作系统
6.魔术常量 其值会变化 只有几个
__FILE__ 当前网页文件
__DIR__ 当前网页文件所在目录
__LINE__ 当前所在行
与变量的区别
1.定义形式不同
2.使用形式不同: 常量无需$符
3.可变程度不同: 常量的额值不可以改变,也不可以销毁
4.作用范围不同: 常量具有超全局作用(函数内外都能直接使用)
5.作用类型不同: 常量只能存储标量类型(整形,浮点型,字符串,布尔值)
六,数据类型 8种
1.基本类型
整数 int,integer
123 // 10进制 dec
0123 // 8进制 oct
0x123 // 16进制 hex
0b11010 // 2进制 bin
转换 10 进制转其他三种 // decoct dechex decbin
转换 其他三种转 10 进制 // octdec hexdec bindec
没有其它转换
转换原理
10 转其它 // 10进制数除以 进制数 记录 余 数 一直除 直到不能除 再把所有余倒着写
其它转10 // 每个位置 数乘以 进制数的 位置-1 次方 将所有结果相加 // 1*8^2 + 2*8^1+ 3*8^0
浮点 float,double,real
$v = 123.456;
$v = 123.456E3; 123.456*10^3;
$v = 123E3; 123*10^3; 虽然没有“.” 但还是浮点数
因为计算机存储的关系 用浮点数 计算比较是不准确的
应该转化为整数之后再比较
比如:要求精度为3的小数 应该除以1000 然后取整 round()之后比较
字符串 string
(1)单引号字符串 中 只有最后一个 反斜杠 \ 才需要转义
(2)双引号字符串 中 可以识别变量 和 \n \r 等符号
(3)单引号界定字符串 注意 最后的一行 除了自身的名字 “ABC” 和一个分号 其他什么都不能出现 ABC是类似常量的名字 随便取
$str = <<<‘ABC’
abcdefg ,fafafw 内容
ABC;
(4)双引号界定字符串
$str = <<<"ABC"
abcdefg ,fafafw 内容
ABC;
布尔 bool,boolen
false, 0, 0.0, "", "0", array(), null, 未定义变量 // 都是 false
2.复合类型
数组 array
对象 object
3.特殊类型
空 null (值只有一个 null)
资源类型 resource
七,类型转换
转数字类型的时候只需要用 计算符 +-*/% 就可以把字符串转化为 数字类型
“1abc” // 1
"abc1" // 0
true // 1
false // 0
强制转换 (int),(float),(string),(bool),(array),(object)
$v = "123";
$v2 = (float) $v;
$v3 = (string) $v;
setType($v,'string'); // 将 $v 转换为 string
八,类型相关函数
var_dump(); // 输出完整信息
getType($v); // 获取类型
setType($v); // 设置类型
isset(), empty(),unset();
is_xx类型(); 判断类型
is_int();
is_float();
is_string();
is_bool();
is_array();
is_object();
is_null();
is_numeric(); // 判断数字
is_scalar(); // 判断是否是一个 “标量类型”
九,运算
1. +-*/%运算符
% 对浮点数只针对整数部分运算
字符串自增 只能是下一个字符 a=> b A=>B abc9=>abd0
for循环中推荐用 前++ ++$i; 效率会更好一点
2.比较运算
'>' '>=' '<' '<=' '==' '!=' '===' '!=='
== 模糊相等比较 === 精确相等比较(数据类型和内容相等)
3. 不同类型比较
比较数据中有布尔值转为 布尔值比较 true>false
否则 如有数字值 转为数字值比较
否则 都是 纯数字字符串 转为数字比较
否则 按字符串比较
4.字符串运算 '.' '.='
链接字符串 1 . 2 => 12; 1 .= 3 => 13;
5.赋值运算符 '=' '+=' '-=' '*=' '/=' '%=' '.='
$v= 1; $v+= 1; => $v = $v + 1; => 2;
6. 三元(三目,条件)运算符
形式 : $v = 数值1 ? 数值2 : 数值3; // 对数值1取布尔值 => true 数值1 false 数值2
等同
if(数值1){ $v = 数值2; }else{ $v = 数值2; }
7.位运算 '&' '|' '~' '^'(按位非) '<<' '>>'
(1) & 按位与运算
1 & 0 => 0; 1 & 1 => 1; 0 & 0 => 0;
$n1 & $n2; /// n1 n2 是任意整数
将两个整数的二进制数字形式(都是32位) 的每一个对应位上的数字进行基本按位与运算之后的结果
例 10的二进制 0 0 0 0 1 0 1 0
20的二进制 0 0 0 1 0 1 0 0
与运算的结果 0 0 0 0 0 0 0 0
(2)| 按位或运算
1 | 0 => 1; 1 | 1 => 1; 0 & 0 => 0;
$n1 & $n2; /// n1 n2 是任意整数
将两个整数的二进制数字形式(都是32位) 的每一个对应位上的数字进行基本按位或运算之后的结果
例 10的二进制 0 0 0 0 1 0 1 0
20的二进制 0 0 0 1 0 1 0 0
与运算的结果 0 0 0 1 1 1 1 0
(3) << 按位左移(同右移>>)
$n1 << $m;
$n1 的二进制数(32位)往左移动m位;
例 $n1 = 10;$m =2;
10的二进制 0 0 0 0 1 0 1 0
与运算的结果 0 0 1 0 1 0 0 0
(4)^按位异或运算符
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1001 (9 在内存中的存储)
^ 0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 0101 (5 在内存中的存储)
-----------------------------------------------------------------------------------
0000 0000 -- 0000 0000 -- 0000 0000 -- 0000 1100 (12 在内存中的存储)
(5)~按位取反
补充知识 => 源码 , 反码 ,补码
5的
原码 .......000000101
反码 .......000000101
补码 .......000000101
-3的
原码 10.....00000011
反码 111...111111100
补码 111...111111101 (反码 +1)
注:原码第一位0是正数1是负数 计算机内部运算都用的补码
7.2 位运算符的应用:管理一组事务的开关状态
// 一个变量管理5个灯的开关状态
define("D1",1); // 00000001
define("D2",2); // 00000010
define("D3",4); // 00000100
define("D4",8); // 00001000
define("D5",16); // 00010000
$s = 10;// 00001010 // 2 和 4 灯亮
// 输出灯1的状态
if(($s & D1) > 0){
echo '灯1是亮的'
}else{echo '灯1是灭的';}
// 输出灯2的状态
if(($s & D2) > 0){
echo '灯2是亮的'
}else{echo '灯2是灭的';}
// 打开灯3
$s = $s | D3;
// 关闭灯2
$s = $s & (~D2);
8.数组运算符 '+' '==' '!=' '===' '!=='
(1) + 数组联合 将右面的数组合并到左边的数组 有重复 已左边的为准
print_r(array(1=>132,2=>465) + array(4=>'fasrf',1=>'fafa')); // Array ( [1] => 132 [2] => 465 [4] => fasrf );
(2) == 比较两个数组相同的键名和键值 不管顺序和类型 返回 true
(3) === 两个数组完全相同 返回true (包括顺序和类型)
注 @ 符号屏蔽当前函数错误
优先级
括号最优先 先乘除后加减
运算符优先级 单目运算符>算数运算符>比较运算符>逻辑运算符(除了 “非” 运算符)

浙公网安备 33010602011771号