[PHP]PHP基础
内容包括:文件引用、输出、常量、系统常量、变量、单双引号的区别、数据类型、数据类型转换、运算符、流程控制、循环语句、函数、常用函数、日期函数、数组和错误处理。
<?php
// “<?php” 表示php的开始,“? >”表示php的结束,若开始标识后全是php代码可以不使用结束标识
/**
* 文件引用
* include ('need.php');
* 报错后弹出警告后,仍会继续执行后续代码。
* include包含一个文件多次会报错,使用include_once('need.php')多次引用就不会报错。
* require ('need.php');
* 报错后后续代码不会继续执行。
* require包含一个文件多次会报错,使用require_once('need.php')多次引用就不会报错。
*/
/**
* 输出: echo
* 换行:<br/>
*/
echo "hello world ! <br/>";
echo 'hello world !!<br/>';
/**
* 常量
* define($name, $value)
* $name一般用大小字母,能一眼辨别出它是常量;$value必须是标量
* 不能重新定义相同的name
* defined() 判断常量是否被定义
*/
define("PNUM", "64");
echo PNUM; // 输出:64
/**
* 系统常量
*/
// __FILE__ 获取出当前文件名
echo __FILE__; // 输出:/Applications/XAMPP/xamppfiles/htdocs/MyService/newfile.php
// __LINE__ 代码在第几行
echo __LINE__; // 输出:24
// M_PI 获取圆周率
echo M_PI; // 输出:3.1415926535898
// PHP_OS 获取系统信息
echo PHP_OS; // 输出:Darwin
// PHP_VERSION 获取PHP的版本
echo PHP_VERSION; // 输出:7.2.2
// __DIR__ 获取当前文件所在文件件的路径
echo __DIR__; // 输出:/Applications/XAMPP/xamppfiles/htdocs/MyService
// __FUNCTION__ 获取函数名
function demoAciton () {
echo __FUNCTION__; // 输出:demoAciton
}
demoAciton();
// __MHTHOD__ 获取当前成员方法名
// __NAMESPACE__获取当前命名空间名字
// __TRAIT__ 获取当前TRAIT名字(多继承)
// __CLASS__ 获取当前类名
/**
* 变量
* 命名规范:
* 必须以$开始,后面以下划线和英文字母开始;
* 严格区分变量名的大小写;
* 变量名要创建得有意义;
* 遵循驼峰命名法,例如:myCreateObject;
*/
$i = 0;
for ( ; $i < 10 ; $i++) {
echo "$i";
echo "<br/>";
}
// unset() 销毁变量
unset($i);
// 或者赋null
$i = null;
// isset() 判断一个变量是否有内容
if (isset($i)) {
echo "\$i有内容"; // 输出:$i有内容
} else {
echo "\$i没有内容"; // 输出:$i没有内容
}
/**
* 单引号与双引号的区别
* 单引号不能解析变量,双引号能解析变量;
* 双引号中的变量明后紧跟其它字符时,需要将之用{}包起来;
* 连接字符串用点号"."
* 转义字符:\" \' \$
*/
$name = "小姐姐";
echo '<br/>'.'这里有$name'; // 输出:这里有$name
echo "<br/>"."这里有$name"; // 输出:这里有小姐姐
echo "<br/>$name真漂亮"; // 输出警告:Undefined variable: name真漂亮
echo "<br/>{$name}真漂亮"; // 输出:小姐姐真漂亮
echo "<br/>'$name'真漂亮"; // 输出:'小姐姐'真漂亮
echo "\"\$".'\''; // 输出:" $ '
/**
* 数据类型
* [标量]
* 整型 10
* 浮点型 10.5
* 布尔型 true false
* 字符串 用单双引号包起来的都是字符串
* [混合类型]
* 数组 array
* 对象 object
* [特殊类型]
* 空 null
* 资源 resource
*/
$x = 10;
$y = 10.5;
$z = ture;
$str = "x10y";
// echo无法打印数组,智能输出输出其中某个元素
// print_r能打印数组,输出索引及元素
// var_dump能打印数组,输出索引、元素和各元素的类型
$tempArr = [1,2,"a",'b'];
echo "$tempArr[2]"; // 输出:a
print_r($tempArr); // 输出:Array ( [0] => 1 [1] => 2 [2] => a [3] => b )
var_dump($tempArr); // 输出:array(4) { [0]=> int(1) [1]=> int(2) [2]=> string(1) "a" [3]=> string(1) "b" }
/**
* 数据类型转换
* gettype() 获取变量数据类型
* intval() 转换为整型
* floatval()转换为浮动型
* strval() 转换为字符串
* boolval() 转换为布尔类型
*
* is_int() 判断整型
* is_float() 判断浮点型
* is_string() 判断字符串
* is_bool() 判断布尔类型
* is_array() 判断数组
* is_object() 判断对象
* is_resource()判断资源
* is_null() 判断空
* is_numeric() 判断是否为数字或数字字符串
*/
echo gettype($str); // 输出:string
echo gettype(intval($str)); // 输出:integer
echo gettype(floatval($str)); // 输出:double
echo gettype(strval($y)); // 输出:string
echo gettype(boolval($str)); // 输出:boolean
echo "<br/>";
$null = null;
echo intval($null); // 输出:0
echo floatval($null); // 输出:0
echo strval($null); // 输出:空的字符串
/**
* 运算符
* 算数运算符:
* + 加
* - 减
* * 乘
* / 除
* % 求余
* 一元运算符:
* ++ 自增
* -- 自减
* 三元运算符:
* ?: 条件?真:假
* 比较运算符:
* > 大于
* >= 大于等于
* < 小于
* <= 小于等于
* == 等于 '10' == 10 为真
* === 绝对相等 '10' === 10 为假
* != 不等于
* !== 不绝对等于
* 赋值运算符:
* =
* += x+=y相当于x=x+y
* -= x-=y相当于x=x-y
* *= x*=y相当于x=x*y
* /= x/=y相当于x=x/y
* %= x%=y相当于x=x%y
* .= x.=y相当于x=x.y 字符串拼接
* 逻辑运算符:
* && 与
* || 或
* ! 非
*/
/**
* 流程控制
* 单分支结构
* if (条件) {
* }
* 多分支结构
* if (条件) {
* } else if (条件1) {
* } else {
* }
*/
echo "<br/>";
// 单分支结构
$judge = 0;
$judge1 = 0.00;
$judge2 = "";
$judge3 = "0";
$judge4 = "0.00"; // 为真
$judgeArr = [];
$judgeNull = null;
if ($judge || $judge1 || $judge2 || $judge3 || $judgeArr || $judgeNull) {
echo "条件成立";
}
// 多分支结构
$tempCondition = 2;
if ($tempCondition == 1) {
echo "\$tempCondition == 1";
} else if ($tempCondition == 2) {
echo "\$tempCondition == 2";
} else {
echo "\$tempCondition == 其它";
}
// 多分支
$tempCase = 1;
switch ($tempCase) { // 输出:情况一
case 1:
echo "情况一";
break;
case 2:
echo "情况二";
break;
default:
echo "没满足的情况";
break;
}
switch ($tempCase) { // 输出:情况三
case 1:
case 2:
case 3:
echo "情况三";
break;
default:
echo "没满足的情况";
break;
}
/**
* 循环语句
* for循环:知道循环多少次时使用
* for ($i = 0 ; $i < 10 ; $i ++) {
* }
* while循环:不知道循环多少次时使用
* $i = 0;
* while ($i < 10) {
* $i ++;
* }
* do...while循环:
* $i = 0;
* do {
* $i ++;
* } while ($i < 10);
* break:
* 终止循环
* continue:
* 中断当次循环,继续进行下一次循环,直到循环结束。
*/
for ($i = 0 ; $i < 10 ; $i ++) {
echo $i; // 输出:0123456789
}
$wi = 0;
while ($wi < 10) {
echo $wi; // 输出:0123456789
$wi ++;
}
do {
echo $wi; // 输出:10987654321
$wi --;
} while ($wi > 0);
/**
* 九九乘法表
*/
echo '<table width="800" height="200" border="1"';
for ($i = 0 ; $i <= 9 ; $i ++) {
echo '<tr>';
for ($j = 1 ; $j <= $i ; $j ++) {
echo '<td>';
$num = $i * $j;
echo "$i*$j=$num";
echo '</td>';
}
echo '</tr>';
}
echo '</table>';
/**
* 函数
* 函数定义:
* function testAction ($sender) {
* // 函数体
* $content = $sender + 1;
* return $content;
* }
* 命名规范:
* 函数名不区分大小写;
* 命名需要有意义;
* 函数名必须以字母或下划线开头;
* 遵循驼峰命名法;
* 不能使用系统定义过的函数名;
* 超全局变量:
* 在函数内外都能使用
* $_GET
* $_POST
* $_COOKIE
* $_FILE
* $_SESSION
* $_GLOBALS
* 外部变量:
* 在函数外声明的变量,只能在函数外部使用。
* $i = "外部变量";
* function demoAction () {
* }
* 局部变量:
* 在函数内声明的变量,只能在函数内部使用。
* function demoAction () {
* $tempStr = "局部变量";
* }
* 静态变量:
* function demoAction () {
* static $num = 0; // 会保留上一次调用函数时初始化的值
* $num += 1;
* }
* demoAction();
* demoAciton();
* 限制形参数据类型/限制返回值数据类型
* function demoAction(int $x, int $y):string {
* $num = $x + $y;
* return $num;
* }
* demoAction("1", "5")
* 匿名函数:
* $test = function () {
* }
* $test();
*/
// 无参数无返回值
function fTestAction () {
}
fTestAction();
// 有参数无返回值
function fTestAction1 ($name) {
}
fTestAction1("张三");
// 有参数有返回值
$tempName = "张三"; // 全局变量
function fTestAction2 ($name) {
return $name."是单身狗";
}
$tempResult = fTestAction2($tempName);
echo $tempResult; // 输出:张三是单身狗
// 形参限制类型/限制返回值类型
function fTestAction3(int $x, int $y):string {
$num = $x + $y;
return $num;
}
var_dump (fTestAction3("1", "5")); // 输出:string(1) "6"
// PHP7新特性,语法规定
function fTestAction4(...$Array) {
return $Array;
}
var_dump(fTestAction4(1,2,'a',3,"A",4)); // 输出:array(6) { [0]=> int(1) [1]=> int(2) [2]=> string(1) "a" [3]=> int(3) [4]=> string(1) "A" [5]=> int(4) }
$testArr = [1,"a",2];
echo "<br/>";
var_dump(fTestAction4($testArr)); // 输出:array(1) { [0]=> array(3) { [0]=> int(1) [1]=> string(1) "a" [2]=> int(2) } }
/**
* 常用函数
* 字符串函数:
strlen: 获取字符串长度,字节长度
substr_count: 某字符串出现的次数
substr: 字符串截取,获取字符串(按照字节进行截取)
mb_strlen: 获取字符串的长度
mb_substr: 获取部分字符串
strchr: 与substr相似,从指定位置截取一直到最后
strrchr: 获取文件后缀名,与strchr一样,只是从右边开始查找字符
strtolower: 所有的字符都小写(针对英文字母)
strtoupper: 所有的字符都大写
strrev: 字符串反转(只能反转英文:英文存储只有一个字节),按照字节进行反转
strpos: 从字符串中找对应字符出现的位置(数字下标),从最左边开始找
strrpos: 与strpos一样,只是从字符串的右边开始找
trim: 去掉函数两边的字符,默认是空格
str_split: 函数把字符串分割到数组中。
chunk_split: 函数把字符串分割为一连串更小的部分
str_repeat: 把字符串"string"重复多次
str_replace: 替换
ucfirst: 首字母大写
* 时间日期函数:
time: 得到当前时间的时间戳(整型:从格林威治时间1970年1月1日0时0分0秒开始)秒数
date: 时间序列化函数,将指定的时间戳转换成规定时间日期的显示格式(随意的字符串:有专业的格式符规定),如果没有指定时间戳,系统默认使用当前时间的时间戳
strtotime: 时间日期格式的字符串转换成对应的时间戳(只要是正确的英语时间表达方式,都可以进行转换)
microtime: 微秒时间戳,根据不同的要求返回不同的结果 混合 microtime (布尔类型 ),可以返回一个浮点数的时间,也可以返回一个数组(时间戳和微秒数)
* 数学相关函数:
abs: 绝对值
floor: 向下取整 floor(3.2) 结果等于3
ceil: 向上取整
round: 四舍五入
rand: 取得一个指定范围内的随机整数
mt_rand: 取得一个指定范围内的随机整数(效率更高)
min: 会将非数值的 string 当成 0,但如果这个正是最小的数值则仍然会返回一个字符串。如果多个参数都求值为 0 且是最小值,min() 会返回按字母表顺序最小的字符串,如果其中没有字符串的话,则返回数值的 0;
max: 会将非数值的字符串当成 0,但如果这个正是最大的数值则仍然会返回一个字符串。如果多个参数都求值为 0 且是最大值,max() 会返回其中数值的 0,如果参数中没有数值的 0,则返回按字母表顺序最大的字符串。对于多个数组,max从左到右比较;如果同时出现数组和非数组参数总把数组作为最大值返回;
* 数组相关函数:
count: 非数组返回1
key: 获取当前数组当前指针所指向的元素的下标
current: 获取的当前指针指向元素的数值
next: 获取下一个元素的值,并且将指针下移
prev: 获取上一个元素的值,并且将指针上移
end : 将指针移到数组的最后一个元素,并返回最终指针位置的值
reset: 将指针移到数组的第一个元素,返回最终指针位置的值
array_keys: 获取一个数组的所有键名,返回一个索引数组
array_values: 获取一个数组的所有值,返回一个索引数组
explode: 爆炸,将一个字符串按照某个指定的规则(通常是特殊字符),将数组分成多个段,每一段都当做一个数组的元素,返回一个索引数组
split: 类似 explode explode('.', 'abc.txt')等于split('\.','abc.txt')
implode: 粘合,将一个数组内部的所有元素按照某个指定的规则(特殊字符),将所有的元素拼接成一个字符串
join: 把数组元素组合为一个字符串
array_merge: 合并,指的是将两个数组中的元素进行累计。如果后面的数组与前面的数组有下标(键名:关联)相同的,那么后面的元素的值会覆盖前面的;如果是索引的相同下标,会自动的修改下标叠加到前面的数组里。
array_reverse: 返回反转后的数组
array_flip: 交换数组中的键和值
* 数据结构模拟函数:
array_shift: 从数组的前面弹出元素,得到元素的值
array_pop: 从数组的后面弹出元素,获得元素的值
array_unshift: 从数组的前面压入元素,得到当前数组元素的个数
array_push: 从数组的后面压入元素,得到当前数组元素的个数
* 判断变量:
is_bool: 判断是否是布尔类型
is_float: 判断浮点型
is_integer: 判断整型
is_object: 判断对象
is_array: 判断数组
is_string: 判断字符串
is_resource: 判断资源
is_scalar: scalar是标量的,判断是基本数据类型:整型,浮点型,布尔型和字符串型
is_null: 检测变量是否为NULL 是返回TRUE 否则返回false。1.被赋值为NULL;2.变量没被赋值;3.被unset()
is_numeric: 判断数字或者纯数字组成的字符串
gettype: 获得数据类型
settype: 改变数据类型
isset: 检测变量是否已设置并且非 NULL
unset: 如果在函数中 unset() 一个全局变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值,如果在函数中 unset() 一个通过引用传递的变量,则只是局部变量被销毁,而在调用环境中的变量将保持调用 unset() 之前一样的值。
empty: 检查一个变量是否为空 array(),"",0,"0",NULL,FALSE 都返回true
* 文件操作函数:
opendir(路径): 打开一个路径资源(将路径内部的所有数据读入到内存)
readdir(路径资源): 从文件夹资源中读取当前资源指针所指向的文件的名字,指针会向下移动一位
closedir(资源): 释放对应的文件资源
scandir(路径): 读取一个路径内部的所有文件名,返回一个数组,数组的每一个元素都是文件名。
file_exists: 判断一个文件是否存在(文件是广义:路径和文件)
is_dir: 判断一个指定路径是否存在(文件夹)
is_file: 判断一个指定路径是否是文件(文件)
mkdir: 创建一个路径,如果路径存在就会报错
rmdir: 移除文件夹
file_get_contents: 从一个指定的文件内读取数据内容。
file_put_contents: 将指定的字符串写入到对应的文件
fopen: 打开一个文件资源
fgetc: c代表character,一次读取一个字符,两个函数都是对当前资源指针进行操作,读取之后都会将指针下移
fgets: s代表string,代表可以读取多个字符,取决于指定的读取长度或者是否碰到换行(最多只能读取一行数据),两个函数都是对当前资源指针进行操作,读取之后都会将指针下移
fread: 获取指定长度的数据直到文件结束
fwrite: 向文件资源指针所在的位置写入数据,写东西不会将当前位置已有的东西往后移,而是会覆盖
fseek: 将指针指定到对应的位置
fclose: 使用对应的文件资源
copy: 复制
unlink: 删除文件
rename: 重命名文件
filemtime: m代表modify,文件最后被修改的时间
filesize: 文件大小(字节)
fileperms: 文件权限(Linux下的八进制)
* 排序:
rsort: 函数用于对数组单元从高到低进行排序。
asort: 函数用于对数组单元从低到高进行排序并保持索引关系。
arsort: 函数用于对数组单元从高到低进行排序并保持索引关系。
ksort: 函数用于对数组单元按照键名从低到高进行排序。
krsort: 函数用于对数组单元按照键名从高到低进行排序。
* 报错:
error_reporting:设置应该报告何种 PHP 错误
ini_set: 为一个配置选项设置值
* 常量:
define: 定义常量
defined: 检测常量是否定义
* 序列化:
serialize: 产生一个可存储的值的表示
unserialize: 从已存储的表示中创建 PHP 的值
json_encode: 对变量进行 JSON 编码
json_decode: 对JSON 格式的字符串进行编码
* 编码:
base64_encode: 使用 MIME base64 对数据进行编码。在 BASE64 编码后的字符串只包含英文字母大小写、阿拉伯数字、加号与反斜线,共 64 个基本字符,不包含其它特殊的字符,因而才取名 BASE64。
base64_decode: 对使用 MIME base64 编码的数据进行解码
*/
$ttString = "only is boy !";
echo strlen($ttString); // 输出:13
/**
* 日期函数
* 设置时区:
* 可以在需要的页面添加代码 date_default_timezone_set('PRC');
* 也可以去配置文件php.ini中设置:
* 进入PHP的配置文件php.ini;
* 搜索"date.timezone";
* 可以修改date.timezone = "UTC"; // 北京时间这里传"PRC"
* 重启服务;
*/
echo '<br/>';
date_default_timezone_set('PRC'); // 设置时区
$tempTime = time(); // time() 得到当前时间的时间戳,单位(秒),与北京时间相差8小时
echo $tempTime; // 输出:1522315231
echo date('Y-m-d H:i:s', $tempTime); // 输出:2018-03-29 11:22:46
echo date('Y-m-d',$tempTime); // 输出:2018-03-29
echo date('H:i:s',$tempTime); // 输出:11:23:52
/**
* 数组
* $arr = [1,3,'a'];
* $arr = array(1,2,'b');
* 超全局数组 $_GET $_POST $_REQUEST $_SERVER $_SESSION $_COOKIE
*/
/// 创建数组
// 索引数组
$newArray = [1,'a',2,'B'];
var_dump($newArray); // 输出:array(4) { [0]=> int(1) [1]=> string(1) "a" [2]=> int(2) [3]=> string(1) "B" }
$newArray1 = array(1,2,'a');
var_dump($newArray1); // 输出:array(3) { [0]=> int(1) [1]=> int(2) [2]=> string(1) "a" }
$newArray2 = ['3' => 1,'a',2,'B'];
var_dump($newArray2); // 输出:array(4) { [3]=> int(1) [4]=> string(1) "a" [5]=> int(2) [6]=> string(1) "B" }
// 关联数组
$newArray3 = ['one' => 1,'two' => 'a','three' => 2, 'four' => 'B'];
var_dump($newArray3); // 输出:array(4) { ["one"]=> int(1) ["two"]=> string(1) "a" ["three"]=> int(2) ["four"]=> string(1) "B" }
// 二维数组
$newArray4 = [
'one' => [1,2,3],
'two' => ['a','b','c'],
];
var_dump($newArray4); // 输出:array(2) { ["one"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["two"]=> array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" } }
/// 操作数组
echo "<br/>";
// 查找元素
echo $newArray[1]; // 输出:a
echo $newArray3['three']; // 输出:2
echo $newArray4['two'][1]; // 输出:b
// 添加元素
$newArray[4] = "new";
var_dump($newArray); // 输出:array(5) { [0]=> int(1) [1]=> string(1) "a" [2]=> int(2) [3]=> string(1) "B" [4]=> string(3) "new" }
// 删除元素
unset($newArray[0]);
var_dump($newArray); // 输出:array(4) { [1]=> string(1) "a" [2]=> int(2) [3]=> string(1) "B" [4]=> string(3) "new" }
// 修改元素
$newArray[1] = "A";
echo $newArray[1]; // 输出:A
// for循环遍历索引数组,只在联系的索引数组下好使
for ($i = 0 ; $i < count($newArray1) ; $i ++) {
echo '<br/>'.$newArray1[$i]; // 输出:1 2 a
}
// list遍历数组,只对索引数组有效
list($v,$n,$m) = $newArray1;
echo '<br/>'.$v,$n,$m; // 输出:12a
// each遍历数组,每次遍历索引往下递增
var_dump(each($newArray)); // 输出:array(4) { [1]=> int(1) ["value"]=> int(1) [0]=> int(0) ["key"]=> int(0) }
var_dump(each($newArray)); // 输出:array(4) { [1]=> string(1) "a" ["value"]=> string(1) "a" [0]=> int(1) ["key"]=> int(1) }
var_dump(each($newArray)); // 输出:array(4) { [1]=> int(2) ["value"]=> int(2) [0]=> int(2) ["key"]=> int(2) }
echo '<br/>';
// while循环用list和each遍历数组
while (list($key, $value) = each($newArray3)) {
echo $key.'+++'.$value; // 输出:one+++1two+++athree+++2four+++B
}
// foreach遍历关联数组,
foreach ($newArray3 as $key => $value) {
echo '<br/>'.$key; // 输出:one two three four
echo '<br/>'.$value; // 输出:1 a 2 B
}
foreach ($newArray3 as $value) {
echo '<br/>'.$value; // 输出:1 a 2 B
}
/**
* 错误处理
* notice
* warning 前面两种后续代码还好执行,可以在代码前加@符号屏蔽错误。
* Fatal error 致命错误后面代码不会执行,无法屏蔽致命错误。
* 屏蔽所有错误提示,不让用户看见。
* 进入PHP的配置文件php.ini;
* 搜索"display_errors";
* 将display_errors = On的On改为Off;
* 最后再重启服务;
* 将错误写入错误日志中:
* 进入PHP的配置文件php.ini;
* 搜索"error_log";
* 可以修改路径;
* 重启服务;
*/
?>