php语法基础(相比C语言)

前言

php的语法跟C语言很类似,相信有一定C的基础的人学起来会非常快。

本篇主要介绍php相比C语言有差异的地方

php代码标记

ASP标记:<% 代码 %>

短标记:<? 代码 ?> 前两种基本弃用

脚本标记:<script language="php"> 代码 </script>

标准标记:<?php 代码 ?> <常用>

很多php代码不是嵌入到html中的,?>建议不使用,会自动认为后面都是php代码。不用传递多余的空格

变量

删除变量

unset($var); //用于释放内存

预定义变量:都是数组

$_GET: 获取所有表单以get方式提交的数据

$_POST: 获取所有表单以post方式提交的数据

$_REQUEST: GET和POST提交都会保存

$GLOBALS: PHP中所有全局变量

$_SERVER: 服务器信息

$_SESSION: session会话数据

$_COOKIE: cookie会话数据

$_ENV: 环境变量

$_FILES: 用户上传的文件信息

可变变量

变量保存的值正好是另外一个变量的名字,可以通过访问一个变量得到另一个变量的值,类似指针的功能。

变量前面两个$$

$a='b';

$b='bb';

$$a-->'bb'

变量存储

代码装载:从脚本中读取代码,编译,编译的结果放到代码段

代码执行:从代码段中一行行执行

在栈区开辟内存储存变量$a,数据段中开辟一块内存保存值,将数据所在的位置赋值给变量

引用传值 : $b=&$a

常量:通常大写,不需要$

两种定义方法:

  define('PI', 3.14);

  const PI = 3;

用define定义可以使用一些特殊字符,“-_-”

两种定义方法,访问权限有区别

define第3个参数,可以控制大小写不敏感

访问echo constant(''-_-'');

系统常量

PHP_VERSION

PHP_INT_SIZE

PHP_INT_MAX

魔术变量

__DIR__
__FILE__
__LINE__
__NAMESPACE__
__CLASS__
__METHOD__

数据类型

PHP是弱类型语言,变量本身没有数据类型

3个大类8个小类

  • 简单数据类型:

整型:int/integer,4个字节,
浮点型:float/double,8字节,表示小数或者整型存不下的整数
字符串类型:string,系统根据实际长度分配
布尔类型:bool/boolean,

  • 复合数据类型

对象类型:object
数组类型:array
特殊数据类型

  • 资源类型:resource,存放资源数据(PHP外部数据,如数据库,文件)

空类型:NULL

类型转换

转布尔

除了本身为0,变量未定义或者为空,其他都为TRUE

转数值

字符串转数值:
以字母开头的永远为0,
以数字开头的,取到碰到字母为止(不会同时两个小数点)

强制转换

括号里加类型,转NULL用unset()

类型判断

is_XXX, boolean类型不能echo,用var_dump(is_int($a));

gettype(变量名)

settype(变量名,类型)

强制类型转换,对数据值复制的内容进行处理(不会处理实际存储的内容)

settype会直接改变数据本身

进制转换

0b开头2进制,0开头8进制,0x开头16进制

decbin, decoct, dechex, bindec, binoct, binhex

判断

empty(): 0, false, 空, null, 未定义

is_null: null,未定义

isset(): 跟is_null相反

== 值相同即可

=== 类型和值都要相等

其他语法

字符串连接:. .=

错误抑制符:在可能出错的表达式前加@,通常在生产环境会用到

php嵌套在html中使用时,替代语法

<table border=1>
<?php for($i = 1; $i<10; $i++){ ?>
<tr>
<?php for($j=1;$j<10;$j++) {?>
<td>
<?php echo $i . '*' . $j . '=' . $i * $j; ?>
</td>
<?php }?>
</tr>
<?php }?>
</table>

php书写到html中非常不美观,php提供了一种替代机制,可以不用大括号

<?php for(;;): ?>
<?php endfor; ?>
条件和循环操作都有替代语法
左大括号用:替代
右大括号用end+对应操作;替代

系统常用函数

输出

print(): 本质是一种结构,不是函数,返回1,可以不需要括号
print_r(): 比var_dump简单,只会输出值(一般用于打印数组)。

时间

date(): 按照指定的格式输出时间,默认当前时间(1970开始的秒数)
time(): 获取当前时间对应的时间戳
mircotime(): 获取微秒级别的时间,+时间戳
strtotime(): 指定格式的时间字符串转成时间戳

数学

max(), min(), rand(), mt_rand()效率更高, round(), cell(), floor(), pow(), abs(), sqrt()

有关函数的函数

function_exsits();//函数是否在内存中存在
func_get_arg(); //获取指定的参数
func_get_args(); //获取所有的参数,数组
func_num_args(); //获取参数的个数

文件包含

include或require直接将代码在当前位置嵌入,被包含的文件是单独进行编译的。

php文件在编译的过程出现语法错误,会失败,不会执行。但是被包含的文件有错误时,在执行到包含include这条语句时才报错。

include和require的区别

include_once系统只会执行一次

包含不到文件时,报错的形式不一样。require如果包含出错,代码不再执行

文件查找,相对路径,效率较高,可能出错

return除了从函数中返回,还可以直接从文件中返回

$res = include_once 'aa.php';

全局跟局部

全局变量:只能在全局空间使用,理论上在函数内部不能使用

局部变量:在函数内部定义的变量,只允许在当前函数内使用

超全局变量:系统定义的变量,没有访问限制

global关键字:在函数内部定义的变量的一种方式,内部和外部都能访问

如果global定义的变量名在外部已经存在,那么内部定义的该变量直接指向外部变量的内存空间

可变函数

变量的值刚好是一个函数的名字,类似C中函数指针, 使函数可以通过参数传递,实现回调函数的功能。

function display()

$func = 'display';

$func();

匿名函数

变量保存匿名函数,本质是一个对象(closure)

closure提供一种环境,可以在一些特定的环境下去使用内部函数

函数内部有一些局部变量,在函数执行之后没有被释放,因为在函数内部还有对应的函数在引用。

$func = function() user($name) {} //use将外部变量保留给内部使用,类似lambda函数

function display() {
$name = __FUNCTION__;
$innerfunc = function() user($name) {
echo $name;
};
return $innerfunc;
} $closure = display(); //$name并没有被释放
$closure(); //打印display

错误处理

错误分类

语法错误,运行错误,逻辑错误

错误代号(系统常量)

系统错误:E_PARSE, E_ERROR, E_WARNING, E_NOTICE

用户错误:E_USER_ERROR, E_USER_WARNING, E_USER_NOTICE

其他:E_ALL 代表所有的错误,在进行错误控制的时候用的比较多

trigger_error('xx', [error_type]); //默认notice

//让浏览器按指定字符集解析

header('Content-type:text/html; charset=utf-8');

错误显示配置

  • php配置文件,php.ini,全局

display_errors:是否显示错误
error_reporting:显示什么级别的错误

  • 在运行的php脚本中设置,优先级高于配置文件

error_reporting();//设置错误显示级别
ini_set('配置项', 配置值);

实际不会将错误展示给用户,不友好,不安全

自定义错误处理

用户自定义错误处理函数,然后将该函数增加到系统错误处理的句柄中,然后系统会在碰到错误是时调用用户定义的错误处理函数。

set_error_handler

字符串类型

多行字符串定义

//nowdoc结构,强引用,上边界符END后面不允许有任何内容,下边界符必须顶格,且后面除了分好不能跟任何内容

$str = <<<'END'

END;

//heredoc结构,弱引用

$str = <<<END

END;

单引号,强引用,只能识别\'

双引号,弱引用,不能识别\'

变量加大括号便于识别,aa{$a}aa

字符串长度

strlen()

mb_strlen() //extension=php_mbstring,可以指定字符集

字符串相关函数

  • 转换:implode, explode, str_split

implode: 将数组中元素按指定规则连接
explode: 将字符串按某种格式分隔,变成数组
str_split: 按照指定长度拆分字符串,得到数组

  • 截取:trim, ltrim, rtrim

trim: 默认去除两边的空格,也可以指定其他要去除的字符,碰到一个不是的就停止

  • 子串: substr, strstr, stristr

substr: 返回指定位置开始指定长度的子串
strstr: 返回匹配字符串首次出现的位置到结尾的子串

  • 大小写: strtolower, strtolower, ucfirst

ucfirst: 首字母大写

  • 查找: strpos, strrpos

strpos: 查找子串首次出现的位置,返回数字或者FALSE
strrpos: 查找子串最后一次出现的位置

  • 替换: str_replace
  • 格式化: printf, sprintf
  • 其他: str_repeat, str_shuffle

str_repeat: 重复N次
str_shuffle:随机打乱

数组

定义方式

  • $a = array(1, 2, 3); //常用
  • $a = [1, 2, 3];
  • $a[] = 1; $a[1] = 2;

特点

  • 不指定下标,系统默认指定比目前已存在的数字下标中最大的数字大1的值(如不存在则为0)
  • 元素顺序以放入顺序为准,跟下标无关
  • 特殊下标:false变0,true变1,NULL变空字符串
  • 数组元素没有类型和长度限制
  • php数组储存在堆区,连续内存

多维数组

$info = array(
array('name' => 'Jim', 'age' => 22),
array('name' => 'Tom', 'age' => 28)
);

异形数组:数组元素中有基本类型也有数组

遍历

  • foreach

foreach($info as [$下标 =>] $值){
//通过$下标访问下标,通过$值访问元素值
}

  • for

for() //count(array)获取长度,下标必须是规律的数字

  • while配合each和list

each函数获取当前元素的下标和值,同时指向下一个元素,返回4个元素的数组
0下标 => 元素下标值
1下标 => 元素的值
key下标 => 元素下标值
value下标 => 元素的值

如果取不到,返回false

//list,是结构不是函数。从数组从取值,赋值给一组变量。数组必须是从0开始的依次递增的数字下标
list($first, $second)=$arr;
//list于each配合很好
while(list($key, $value) = each($arr))

数组相关函数

  • 排序函数

sort(); //顺序
rsort; //逆序
asort(); //顺序,数组索引保持和单元的关联
arsort(); //逆序,保持索引关系
ksort(); //顺序,按照键名排序
krsort(); //逆序,按照键名排序
shuffle(); //打乱,索引和单元关系不保持

  • 指针函数

reset(); //将数组内部指针指向第一个元素,并返回其值
end(); //将数组内部指针指向最后一个元素,并返回其值
next(); //下一个,当没有更多元素时返回FALSE
prev(); //前一个,
current(); //获取当前元素值
key(); //当前指针对应的下标
//next和prev一旦超出范围之后,就回不去了。只能通过reset或者end进行指针重置

  • 其他函数

count(); //元素个数
array_push(); //往数组后面中加入一个元素
array_pop(); //从数组后面弹出一个元素并返回
array_shift(); //从数组前面弹出一个元素并返回
array_unshift(); //从数组前面压入一个元素并返回
array_reverse(); //数组元素反转
in_array(); //判断元素是否在数组中
array_keys(); //返回一个数组的所有下标,返回一个索引数组
array_values(); //返回一个数组的所有值,返回一个索引数组
//可以模拟数据结构,栈和队列

上一篇:ML - 特征选择


下一篇:Java学习笔记(二):String