php学习笔记
引用赋值
<?php
$one=10;
$two=&$one
?>
8种类型
- 整型
- 布尔型
- 浮点型
- 字符串
- 数组
- 对象
- 资源类型
- 空类型
var_dump()输出变量的值和类型
整型变量声明:
以0开头表示以八进制声明一个变量,以0x开头表示以十六进制声明一个变量。整数的最大值 4字节,2的32次方。
布尔类型声明:
整数的0和浮点数的0.000表示false. null表示false,"0" 表示false。 空数组表示false.
字符串的声明:
单引号和双引号,还有定界符 <<< 声明的字符串, 还有反引号。声明的字符串没有长度限制。双引号的字符串中,既可以直接解析变量,又可以直接使用转义字符。双引号中不能再使用双引号。使用定界符声明大量字符串。例子:
$str=<<<hello
//定界符以hello开头,就一定要以hello 结尾(中间是声明变量的位置)
hello;
单引号的字符串当中,不可以解析变量,也不可以使用转义字符(但可以转义单引号本身,也可以转义转义字符本身。)
数据类型转换
强制转换 和 自动转换
setType( 变量,类型)
整型在内存当中站四个字节,2的32次方,浮点型占8个字节。float 转 int 若是数字太大,会溢出,为0
与变量和类型有关的一些常用的函数
- isset()
- empty()
- unset()
- setType()
- getType()
变量类型测试函数
is_bool()
is_int()
is_string()
...
常量声明
- 常量是一个简单值的标识符
- 常量定义之后不能再改变他的值,也不能unset()取消
- 常量不用理会变量范围的规则而可以再任何地方都可以定义和访问
- 常量使用 define ( "常量名", 值)
- 常量声明时和使用都不使用 “$”
- 常量名称都习惯使用大写
运算符
- 算数运算符
- 字符串运算符: .
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 其它运算符: ? :
全等运算符 === ,比较时候不仅要求内容相同,也要求类型相同。先比较类型,再比较内容。
执行运算符:
会按系统命令shell执行,并将信息返回。示例如下:
$str=`ipconfig /all`;
echo $str;
错误控制符: @ 可以让错误不在页面中进行提示。
流程控制
- 顺序结构
- 分支结构--条件结构--选择结构
- 循环结构
分支结构又可分为:单路分支,双路分支,多路分支,嵌套分支。
单路分支: if(条件)
双路分支: 使用else 从句,switch case
多路分支: switch case ,或者多重if else
if() {}
else if() {}
else if() {}
嵌套分支: if 里面嵌套if ,最好不雅超过五层。
php实现简单计算器
<html>
<head>
<title>PHP实现简单计算器</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
</head>
<?php
$num1=true;
$num2=true;
$numa=true;
$numb=true;
$message="";
//单路分支
if(isset($_GET["sub"])){
if($_GET["num1"]==""){
$num1=false;
$message.="第一个数不能为空";
}
if(!is_numeric($_GET["num1"])){
$numa=false;
$message.="第一个数不是数字";
}
if($_GET["num2"]==""){
$num2=false;
$message.="第二个数不能为空";
}
if(!is_numeric($_GET["num2"])){
$numb=false;
$message.="第二个数不是数字";
}
if($num1 && $num2 && $numa && $numb) {
$sum=0;
//多路分支switch
switch($_GET["ysf"]){
case "+":
$sum=$_GET["num1"]+$_GET["num2"];
break;
case "-":
$sum=$_GET["num1"]-$_GET["num2"];
break;
case "x":
$sum=$_GET["num1"]*$_GET["num2"];
break;
case "/":
$sum=$_GET["num1"]/$_GET["num2"];
break;
case "%":
$sum=$_GET["num1"]%$_GET["num2"];
break;
}
}
}
?>
<body>
<table align="center" border="1" width="500">
<caption><h1>计算器</h1></caption>
<form action="jsq.php">
<tr>
<td>
<input type="text" size="5" name="num1" value="<?php echo $_GET["num1"] ?>" >
</td>
<td>
<select name="ysf">
<option value="+" <?php if($_GET["ysf"]=="+") echo "selected" ?>>+</option>
<option value="-" <?php if($_GET["ysf"]=="-") echo "selected" ?>>-</option>
<option value="x" <?php echo $_GET["ysf"]=="x"?"selected":"" ?>>x</option>
<option value="/" <?php echo $_GET["ysf"]=="/"?"selected":"" ?>>/</option>
<option value="%" <?php echo $_GET["ysf"]=="%"?"selected":"" ?>>%</option>
</select>
</td>
<td>
<input type="text" size="5" name="num2" value="<?php echo $_GET["num2"] ?>">
</td>
<td>
<input type="submit" name="sub" value="计算">
</td>
</tr>
<?php
if(isset($_GET["sub"])){
echo '<tr><td colspan="5">';
if($num1 && $num1 && $numa && $numb){
echo "结果:".$_GET["num1"]." ".$_GET["ysf"]." ".$_GET["num2"]." = ".$sum;
}else{
echo $message;
}
echo '</td></tr>';
}
?>
</form>
</table>
</body>
</html>
循环结构
- while 循环
- do while 循环
- for 循环
根据循环条件不同有两种类型的循环: 一种是计数循环,另一种是 条件型循环。
函数的定义
function(){
}
可以在声明前调用,也可以声明后调用
形参:在申明变量时,声明的参数,参数就是变量。实参:调用函数时传给形参数值
- 局部变量:在函数中声明的变量
- 全局变量:在函数外声明,在函数声明以后的,知道整个脚本结束前都可以使用。包括在函数中,和 {}都可以使用。
php的变量分不出是声明还是使用。
在php中使用全局变量,要通过 global关键字将这个全局变量包含到这个函数中才能使用。
$a=10
function test(){
global $a; // 意思是调用函数外面的全局变量$a
echo $a;
}
php的静态变量声明:static
静态变量声明只能在函数中声明,不能全局声明。
作用:一个变量可以在同一个函数中多次调用同用。
- 静态变量在静态代码段中保存
- 一个函数多次调用之间公用,但只在第一次调用函数声明到内存,以后再调用,就不再声明。而是直接使用。
默认函数,带有[] 的函数,表示这个函数时可选的,如果传了值就使用,没有传值则使用默认值,直接在声明函数时,就为参数传初值。
可选值和必须值,必须从后向前设置。
func_get_args() 获取函数所有的参数,返回一个数组。
回调函数,带有callback,调用这个函数时需要我们传一个函数进来 ,示例如下:
function demo ($x,$y){
return $x*$y;
}
function sum($a,$b,$func){
return $a+$b+$fun($a,$b);
}
echo sum(2,3,demo);
- 内部函数:目的是在函数内部调用,帮助外部函数完成一些子功能,一般使用面向对象的封装。
- 递归函数:
数组
概述:数组的本质是管理和操作一组变量,成批处理。数组时符合类型。数组中可以储存任意长度的数据,也可以储存任意类型的数据。数组可以完成其他语言结构的功能,如链表,队列等等。
php中的数组 ,索引数组,关联数组。索引数组用数字做索引,关联数组用字符串做索引。
数组的声明方式:
- 直接为数组元素赋值声明
- 使用array()函数 声明
- 使用其他的函数声明
$a[0]=1; $b[电话]=110;
$a=array(
"姓名"=>"高某";
"公司"=>"A公司";
)
遍历数组
- for语句遍历数组
- foreach 遍历数组
- while(),each() 等函数遍历数组
不首选for语句遍历,这种遍历方式必须是索引数组,而且下表必须连续
foreach 语句遍历: foreach (数组变量 as 变量值){},实例如下:
$user=array(1,"name"=>"zhangsan","age"=>40,100=>"nan")
foreach($user as $key=>$val){ //$var ,$key为自定义变量
echo $key."==>".$var;
}
each() 函数遍历
- 需要一个数组作为参数
- 返回来的也是一个数组
- 默认当前元素是第一个元素
- 每执行一次后就会将当前元素向后移动
- 如果到最后的元素再执行这个函数,返回false
组合使用如下:
$a[0]=1;
while(list($key,$value)=each($a)){
}
explode()函数
explode('.',$ip) //表示将$ip数组按 点 分割,并返回一个数组。
预定义数组
包含了来自web服务器,客户端,运行环境和用户输入的数据。这些数组比较特别,在全局范围内自动生效。因此通常被称作自动全局变量或者超全局变量。用户不能定义这些超全局变量,所以在定义变量时应避免和预定的全局变量重名。
- $_GET //经URL请求提交至脚本的变量
- $_SERVER //变量由服务器设定,或直接和当前脚本的执行环境相关联
- $_POST //经HTTP POST方式提交至脚本的变量
- $_REQUEST //此关联数组包含了 $_GET,$_POST,$_COOKIE中的全部内容。
- $_COOKIE
- $_SESSION //
- $GLOBALS
- $_ENV //输出当前操作系统的信息
- $_FILES //经由HTTP POST 文件上传而提交至脚本
数组处理函数
-
array_values:
返回数组中全部的值,并建立一个新的索引数组储存 -
array_keys:
返回数组中全部的键名 -
in_array():
检查数组中是否存在某个值,即在数组中搜索给定的值。这个函数有三个参数。若存在,则返回true。 -
array_key_exists() 检查给定的键名或索引是否在数组中
-
array_flip() 交换数组中的键和值
-
array_reverse() 返回一个单元顺序相反的数组
统计数组的元素个数
- count
- array_count_values() 返回一个数组,键为原来的值,值为出现的次数
- array_unique()
用于删除数组中重复的值,并返回没有重复值得新数组。
使用回调函数处理数组
- array_filter() 过滤数组中的单元
- array_walk() 数组中的每个成员应用用户函数
- array_map() 比walk处理多个数组
数组的排序函数
- sort() 按元素值从小到大
- rsort() 从大到小
- usort() 按用户的规则排序
- asort() 元素的值升序排序
- arsort() 元素的值降序排序
- uasort()
- ksort() 按键从小到大
- krsort() 从大到小
拆分,合并,分解,接合的数组函数
-
array_combine(a,b) ,将两个数组合成一个数组,一个是键,一个位值
-
array_slice()
-
array_splice()
-
array_merge() 合并多个数组
-
array_intersect() 返回数组的交集
-
array_diff() 返回数组的差集
数组实现数据结构
其他
array_rand() 随机取值,后一个参数为数量
shuffle() 随机化数组
array_sum 返回数组中所有值得总和。
面向对象的程序设计
对象的三大特性:封装,继承,多态
与面向过程的区别,面向过程的最小单位是函数,面向对象的最小单位是对象。对象中包含函数,变量。也就是成员方法,成员属性。统称为成员。
封装:private
private修饰的只能在内部使用
protected 内部,子类都能访问,外部访问不了。
子类重载父类的方法: partent::方法名()
php中常用的关键字
- final 不修饰成员属性,只能修饰类和方法。使用final修饰的类,不能被子类继承,final修饰的方法不能被子类覆盖。用来限制类不被继承,方法不被覆盖。
- static 静态关键字,能将类中的成员标识为静态。可以修饰成员属性和成员方法,不能修饰类。用static修饰的成员属性,可以被同一个类所有对象共享。静态的对象,存在内存中的数据段之中,也就是初始化静态段。静态的数据是在类第一次加载时,分配到内存当中去,以后再用到类时,就直接从数据段中获取。只要在程序中使用到这个类,类就被加载了。
注意:静态成员都要使用类名去访问,不用创建对象。
类名::成员名
- const关键字,类成员属性定义为常量。不需要加$ ,通过类名访问,或者self关键字。
clone :克隆对象。
魔术方法
-
_call() 作用:在调用不存在的方法时自动调用。调用对象不存在的方法时,系统会报错,程序退出。什么时候自动调用:就会在调用一个对象不存在的方法时自动调用。需要两个参数。第一个参数是不存在的方法名,第二个参数 args。
-
_toString() 直接输出对象引用时自动调用,用来快速获取对象的 字符串,用来快速获取对象字符串最便利的方式。
对字符串处理函数
linux/unix 下的路径分隔符 /
windows 下的为
但是不管什么系统都可以用 /,在php和 apache配置文件中也可以使用 / 做分隔符。
绝对路径:
如果在服务器中执行路径,则根指的是操作系统的根。
如果程序是下载到客户端,再访问服务器中的文件时,只有通过apache访问,“根”也就指的是文档的根目录。
basename():
返回文件名部分。
dirname:
与basename() 相反,返回路径信息。不包含文件名和文件格式。
pathinfo():
返回一个关联数组,期中包括制定路径的目录名。
touch("文件名"):
创建文件
unlink:
删除文件
copy("当前","目标")
dirname(FILE) 返回当前执行脚本的路径