PHP基础

PHP

  • 需要了解的一些概念
  • PHP基础知识点
  • 函数基本知识
  • 默认值:define value
  • 引用传递(与C语言中指针类比)
  • 函数返回值return
  • 常用系统函数
  • 可变函数
  • 匿名函数
  • 字符串相关函数
  • 数组的相关函数
  • 文件
  • 作用域
  • 静态变量static
  • 伪类型
  • 错误处理
  • 字符串语法
  • 字符串转义
  • 字符串长度
  • 数组定义语法
  • PHP数组特点
  • 多维数组
  • 遍历数组

需要了解的一些概念

  • PHP定义:服务器端的脚本编程语言,书写动态生成的网页。
  • 服务器:提供服务的机器,取决于机器上所安装的软件。
  • IP:网络之间的互联协议。
  • 域名:由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称。目的是便于记忆和沟通的一组服务器的地址。
  • DNS:将域名和IP地址相互映射的一个分布式数据库。
  • web程序的基本访问流程:浏览器发起访问——DNS解析域名找到IP地址——服务器电脑——通过端口找到服务软件。
    静态网站访问:
    PHP基础_第1张图片
    动态网站访问比静态网站访问多:服务器端解析、数据库。
    PHP基础_第2张图片
  • 内存中的几个分区:
    栈区:程序中可以操作的内存部分(不存数据,只运行程序代码);少但快。
    代码段:存储程序的内存部分(不执行)
    数据段:存储普通数据(全局区与静态区)
    堆区:存储复杂数据,大但效率低。
  • 函数执行的内存分析
    ①读取代码进入到代码段(编译:将代码编程字节码存储到内存)
    ②根据代码逐步执行
    ③编译和执行是分开的

PHP基础知识点

  • PHP代码标记:在标记里写PHP代码
    ASP标记:<&php代码&>
    短标记:
    脚本标记:< script language=“php”>php代码< /script>
    标准代码(常用):
  • PHP注释
    行注释://、#
    块注释:/* */
  • 语句分隔符为分号“;”
    PHP中标记结束符?>有自带语句结束符的效果,最后一行可没有分号
    通常代码最后不建议写?>,而是直接分号结束就可
  • 变量
    ·命名规则:定义变量时不需要任何关键字,但需要在前面添加 $;可用中文命名;其他规则与C类似。
    ·删除变量:使用unset(变量名字)。为了把它所占用的内存释放掉。
    ·变量分类:
    ①预定义变量:即系统定义的变量;此变量都是数组。
    $_ GET:获取所有表单以get方式提交的数据;
    $_ POST:以POST方式提交的数据都会保存在此;
    $_ REQUEST:GET和POST提交的数据都会保存;
    $_ SERVER:服务器信息;
    $_ SESSION:session会话数据;
    $_ COOKIE:cookie会话数据;
    $GLOBALS:PHP中所有的全局变量;
    $_ FILES:用户上传的文件信息;
    $_ ENV:环境信息;
    ②可变变量(类似C里的指针):如果一个变量保存的值刚好是另外一个变量的名字,可直接通过访问一个变量得到另一个变量的值:在变量前面再多加一个 $符号。C语言是指向地址,PHP是指向变量名。
    eg:

	//定义两个变量
	$a='b';
	$b='bb';
	echo $$a;//最后会输出bb
	/*
	找到$a,解析结果为b;
	将前面的$符号与结果b绑定,即为$b
	最后输出b的结果
	*/

③变量传值:即将一个变量赋值给另一个变量。包括值传递与引用传递(指针)。

  • 常量
    ·命名规则:前面不要加$符号;通常以大写字母为主;可以使用一些特殊字符,但只能使用define定义。
    ·定义常量:define(‘常量名’,常量值); 或者 **const 常量名=值;**这两定义的区别是访问权限。
    针对以特殊字符定义的常量,需要使用访问常量的函数:constant(‘变量名’);
    ·常量分类:
    ①系统常量:
    PHP_VERSION:PHP版本号
    PHP_INT_SIZE:整型所占用的字节数
    PHP_INT_MAX整型能表示的最大值
    ②魔术常量:一些特殊的常量,由 双下划线+常量名+双下划线 组成。值会跟着环境变化,用户改变不了。
    _ _ DIR_ _ :当前被执行的脚本所在电脑的绝对路径
    _ _ FILE_ _ :当前被执行的脚本锁在电脑的绝对路径(带自己文件的名字)
    _ _ LINE_ _ :当前所属的行数
    _ _ NAMESPACE_ _ :当前所属的命名空间
    _ _ CLASS_ _ :当前所属的类
    _ _ METHOD_ _ :当前所属的方法
  • 数据类型
    指存储的数据本身的类型,不是变量的类型,PHP是一种弱类型语言,变量本身没有数据类型。
    分类
    ①整型:int/integer,占四个字节,表示整数类型
    ②浮点型:float/double,八个字节,表示小数或整型存不下的整数
    ③字符串型:string,根据实际长度分配,表示字符串,注意引号
    ④布尔类型:bool/boolean,只有两个值:ture和false
    ⑤对象类型:object,存放对象(面向对象)
    ⑥数组类型:一次性储存多个数据
    ⑦资源类型:resourse,储存资源数据(PHP外部数据,eg数据库,文件)
    ⑧空类型:只有一个值NULL,不能运算
    类型转换
    ·转换方式:自动转换和强制(手动)转换
    ·在转换过程中,用的比较多的是转布尔类型(判断)和转数值类型(算术运算)
    ·其他类型转数值说明:
    ①布尔ture为1,false为0;
    ②以字母开头的字符串永远为0;
    ③以数字开头的字符串,取到碰见字符串为止,且不会同时包含两个小数点
    PHP类型比较表
    PHP基础_第3张图片
    类型判断
    ·通过 类型判断函数,如is_开头后面跟类型名字的函数:is_变量类型A(变量名B);若B为A型变量,返回为ture;否则,返回为false;
    ·bool类型不能用echo来查看,可以使用**var_dump(变量1,变量2,…)**查看。最后会返回bool(ture)或boor(false)
    ·gettype(变量名):获取数据,得到的是该类型对应的字符串。
    ·settype(变量名A,数据类型B):设定数据类型,将A数据本身,转换为B类型变量;而强制转换处理完后,不改变原来的类型。
    ·empty():判断数据的值是否为空,如果为空返回true,否则返回false
    ·isset():判断数据存储的变量本身是否存在,存在变量返回true,不存在返回false
  • 运算符
    • 赋值运算符:=
    • 算术运算符:+、-、* 、/、%
    • 比较运算符:>、>=、<、<=、= =(大小相同)、!=、= = =(全等于,大小类型都要相同)、!= =
    • 逻辑运算符:&&、||、!
    • 连接运算符:将多个字符串拼接的一种符号
      • . 点:将两个字符串连接到一起
      • . =:复合运算,将左边的内容与右边的内容连接起来,然后重新赋值给左边
    • 错误抑制符:@:在可能出错的表达式前面使用(通常在生产环境会用到)
    • 三目运算符:(A= B ?C:)
    • 自操作运算符:++、- -、+=、-=、*=、/=、%=
    • 位运算符:&、|、~、^、<<、>>
  • 分支结构
    • if分支:同C语言
    • swich分支:同C语言
  • 循环结构
    • for循环:同C语言
    • while循环:同C语言
    • do-while循环:同C语言
    • 循环控制:continue,break
  • 流程控制替代语法
    分支和循环结构的替代语法。PHP应该在HTML中只做数据输出,输出通常伴有条件判断和循环操作,因此PHP提供了对应的分支结构和循环结构的替代语法。
    左大括号{ →:冒号替代
    右大括号} →end+对应的起始标记替代;

函数基本知识

  • 基本语法:function函数名(参数){ 函数体/返回值 }
  • 函数是在代码执行阶段碰到函数名字的时候才会调用,不是在编译阶段
  • 函数调用的特点:只要在系统内能找到对应的函数就可执行;函数的调用可在函数定义执行之前。
    详细原因参考PHP基础(一)中的函数执行的内存分析。

	//定义函数
	function display()
	{
		echo 'hello world';
	}#这步之后执行的话不会输出
	//调用函数
	display();#在调用之后才会执行此函数
  • 函数命名规则:同C语言
    ①驼峰法:除了左边第一个单词外,后面单词首字母都大写
    ②下划线法:单词之间通过下划线连接,单词都是小写

默认值:define value

  • 指的是形参的默认值;在函数定义的时候,就给形参进行一个初始赋值,如果实际调用传入的参数没有提供,那么形参就会使用定义时的值来进入函数内部参与运算。
  • 只要有一个形参赋默认值,后面跟着的形参都得赋默认值,否则会报错。

引用传递(与C语言中指针类比)

  • 有时要在函数内部拿到外部的数据,能够在函数内部改变,那么就需要在函数定义时明确告知函数,函数才会在调用时主动获取外部数据的内存地址。这种定义形式参数的方式叫引用传值。
  • 基本定义语法:function函数名(形参){函数体}
  • 在调用的时候必须引用传值的参数位置传入实际参数,而且参数本身必须是变量,不可以直接传入数值

	//引用传值
	function display($a,&$b){
	//修改形参的值
	$a = $a * $a;
	$b = $b * $b;
	echo $a,'
'
,$b,'
'
; } //定义变量 $a = 10; $b = 5; //调用函数 display($a,$b);//输出100 25 echo '
'
,$a,'
'
,$b;//输出10 25 #对用的b形参采用的是去地址,所以在实参传入之后,系统b取到了外部变量b的内存地址,而a取的是值 #因此改变之后,a只改变了函数内部自己,b改变了自己的同时也改变了外部

函数返回值return

  • 在PHP中所有的函数都有返回值,如后没有明确return使用,系统默认返回NULL。
  • return可在文件中直接使用:代表文件将结果(return后面跟的内容)转交给包含当前文件的位置。(在系统配置文件中使用较多);
  • return之后的内容不会执行
  • 若要查看return的结果可使用var_dump函数

常用系统函数

  • 有关输出函数
    print():类似于echo输出提供内容,本质是一种结构,返回1,可以不需要使用括号。
    print_r():类似于var_dump,但是比var_dump简单,不会输出数据类型,只会输出值(经常用于数组打印)

	echo print('hello world
'
);/*输出为hello world(print) 1 (echo 输出print的值)*/ print 'hello world'; $a='hello world'; print_r($a);
  • 有关时间的函数
    date():按照指定格式对对应的时间戳
    time(void):获取当前时间对对应的时间戳
    microtime():获取为面积比别的时间
    strtotime():可把所有英文格式的字符串转换成时间戳

	echo date('a年b月c日 A:B:C',12345678),'
'
;//输出12345678对应的时间 echo time(),'
'
; echo microtime(),'
'
; echo strtotime('tomorrow 10 hours');
  • 有关数学的函数
    max():最大值
    min():最小值
    rand():得到指定区间的随机整数
    mt_rand:与rand一样,只是底层结构不一样,效率比rand高
    round():四舍五入
    ceil():向上取整
    floor():向下取整
    pow():求指定数字的指定指数次的结果。eg:pow(2,8)= = 2^8 = =256
    abs():绝对值
    sqrt():平方根
  • 有关函数的函数
    function_exists():判断指定的函数名字是否在内存中存在
    func_get_arg():在自定义函数中去获取指定数值对应的参数
    func_get_args():在自定义函数中获取所有的参数(数组)
    func_num_args():获取当前自定义函数的参数数量

可变函数

  • 当前有一个变量所保存的值 刚好是一个函数名,则使用 变量() 来充当函数名使用。

	function display(){
		echo __FUNCTION__;
	}
	$func = 'display';
	$func();//充当display()函数
  • 若需要用户在外部定义一个自定义函数,然后传入到系统函数内部使用,即可使用可变函数
  • 将一个用户定义的函数传入给另一个函数(函数名)去使用的过程叫回调过程;被传入的函数叫回调函数

	//定义一个系统函数
	function sys_function($arg1,$arg2){
		//$arg1 = 'user_function';
		return $arg1($arg2);
	}
	function user_function($num){
		return $num * $num * $num * $num;
	}
	echo sys_function('user_function',10);//10的4次方

匿名函数

  • 匿名函数即没有名字的函数。本质得到的是一个对象(closure)。
  • 基本语法:变量名=function(){函数体};
  • 闭包(closure):use(变量名)
    use是将外部变量保留给内部使用

	function display(){
		//定义局部变量
		$name = __FUNCTION__;
		//定义匿名函数
		$innerfunction = function() use($name){
			echo $name;
		}
		$innerfunction();
	}
	display();

字符串相关函数

  • 转换函数
    • implode(连接方式,数组):将数组中的元素按照某个规则连接成一个字符串
    • explode(分割字符,目标字符串):将字符串按照某个格式进行分割,变成数组
    • str_split(字符串,字符串长度):按照指定长度拆分字符串得到数组
  • 截取函数
    • trim(字符串[,指定字符]):本身默认是用来去除字符串两边的空格(中间不行),但是也可以指定要去除的内容,是按照指定的内容循环去除两边有的内容:直到碰到一个不是目标字符为止
    • ltrim():去除左边的
    • rtrim():去除右边的
  • 截取函数
    • substr(字符串,起始位置从0开始[,长度]):指定位置开始截取字符串,可以截取指定长度(不指定到最后)
    • strstr(字符串,匹配字符):从指定位置开始,截取到最后(可以用来取文件后缀名)
  • 大小转换函数
    • strtolower:全部小写
    • strtoupper:全部大写
    • ucfirst:首字母大写
  • 查找函数
    • strpos(字符串,匹配字符):判断字符在目标字符串中出现的位置(首次)
    • strrpos(字符串,匹配字符):判断字符在目标字符串中最后出现的位置
  • 格式化函数
    • srintf/sprintf(输出字符串有占位符,顺序占位内容…):格式化输出数据
  • 其他
    • str_repeat():重复某个字符串N次
    • str_shuffle():随机打乱字符串

数组的相关函数

  • 排序函数:对数组元素进行排序,都是按ascll码进行排序,可以进行英文比较
    • sort():顺序排序(下标重排):$变量 = sort( $变量)
    • rsort():逆序排序(下标重排)
    • asort():顺序排序(下标保持不变)
    • arsort():逆序排序(下标保持不变)
    • ksort():顺序排序(按照键名下标)
    • krsort():逆序排序(按照键名下标)
    • shuffle():随机打乱数组元素
  • 指针函数
    • reset():重置指针,将数组指针回到首位
    • end():重置指针,将数组指针指到最后一个元素
    • next():指针下移,取得下一个元素的值
    • prev():指针上移,取得上一个元素的值
    • current():获取当前指针对应的元素值
    • key():获取当前指针对应的下标值
  • 其他函数
    • count():统计数组中元素的数量
    • array_push():往数组中加入一个元素(数组后面)
    • array_pop():从数组中取出一个元素(数组后面)
    • array_shift():从数组中取出一个元素(数组前面)
    • array_unshift():从数组中加入一个元素(数组前面)
    • array_reverse():数组元素反过来
    • in_array():判断一个元素在数组中是否存在
    • array_keys():获取一个数组的所有下标,返回一个索引数组
    • array_values():获取一个数组的所有值,返回一个索引数组

文件

  • 文件加载原理
    • 在文件加载(include或require)的时候,系统会自动将包含文件中的代码嵌入到当前文件中。
    • 加载位置:对应的文件中的代码嵌入位置就是对应的include位置。
    • 被包含的文件是单独进行编译的。
  • include和include_once的区别
    include:系统碰到一次执行一次;如果对同一个文件进行多次加载,那么系统会执行多次。
    include_once:系统碰到多次时,只会执行一次。
  • include和require的区别:报错形式不同
    include错误时,不会影响之后的代码执行
    require错误时,之后代码不再执行
  • 文件加载路径:文件在加载时需要指定文件路径才能保证正确找到对应的文件
    • 绝对路径:
      • 从磁盘的根目录开始(本地绝对路径):
        Windows:盘符C:/路径/PHP文件
        Linux:/路径/PHP文件
      • 从网站的根目录开始(网络绝对路径):
        /:相对于网站主机名字对应的路径
    • 相对路径:
      ./:表示当前文件夹
      . ./:上级目录(当前文件夹上一层的文件夹)
    • 绝对路径和相对路径的加载区别
      绝对路径相对效率偏低,但是相对安全,路径不会出问题
      相对路径相对效率高一些,但是容易出错,相对路径会发生改变
  • 文件嵌套包含 文件与文件之间的包含
    很容易出现相对路径出错的问题,因为相对路径会因为文件的包含而改变(./和. ./)

作用域

  • 变量(常量)能够被访问的区域
  • 分类:
    ①全局变量:用户普通定义的变量(函数外部定义)。理论上 函数内部不可访问
    ②局部变量:函数内部定义的变量。在当前函数内部使用。
    ③超全局变量:系统定义的变量(预定义变量详细请看PHP基础(一)中的变量分类)没有访问限制。
  • 实现全局及局部互相访问的方法:
    ①函数内部使用外部变量:使用$GLOBALS或通过参数传值
    使用global关键字
    • (在函数里定义变量的一种方式)若使用global在外部存在,则内部与外部相当于指向同一变量;若外部不存在,系统会自动在全局外部定义一个与局部变量同名的全局变量。
    • 本质形式:在函数的内部和外部对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现相互访问
    • 基本语法:global 变量名;(不能赋值) 变量名 = 值;(修改

	$global = 'global area';//超全局变量
	function display(){
		//所有的形参都可以理解为局部变量
		$inner = __FUNCTION__;//局部变量
		/*
			访问全局变量
			echo $global;     不能访问。
		*/

		//定义变量:使用全局变量
		global $global;
		echo $golbal;
		//定义变量:全局不存在
		global $local;
		$local = 'inner';
	}
	display();
	//全局空间访问“局部”变量
	echo $local;       

静态变量static

  • 在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据(同一个函数被多次调用)的变量。
  • 函数在多次调用的时候,会跳过static这一行。
  • 函数运行结束后,所有局部变量都会清空,若重新运行一下函数,所有的局部变量又会重新初始化。
  • 基本语法:function函数名(){ static $变量名 = 值;}

	function display(){
		//定义变量
		$local = 1;
		//定义静态变量
		static $count = 1;
		echo $local++,$count++,'
'
; } display();//输出11 display();//输出12 display();//输出13 //local是局部变量,每次调用时都重新赋值; //在调用函数时会自动跳跃static这一行,故count在每次调用时不会重新赋值
  • 静态变量的使用:
    ①为了统计当前函数被调用的次数
    ②为了统筹函数多次调用得到的不同结果(递归思想)

伪类型

  • 假类型;实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册
  • 分类:
    • mixed:混合的,可以是多种PHP中的数据类型。
    • number:数值的,可以是任意数值类型。

错误处理

  • 定义:指系统在对某些代码进行执行的时候,发现有错误就会通过错误处理的形式告知程序员
  • 错误分类:语法错误(parse error)、运行时错误(running error)、逻辑错误
  • 错误代号:由一个字节存储,每一种错误占据一个对应的位,可是用位运算进行错误控制
    • 系统错误
      E_PARSE:编译错误,代码不会执行
      E_ERROR:fatal error,致命错误,会导致代码不能正常继续执行,在出错位置断掉
      E_WARNING:警告错误,不会影响代码执行,但是可能得到错误结果
      E_NOTICE:通知错误,不会影响代码执行
    • 用户错误:用户在使用自定义错误触发的时候,会使用到的错误代号。
      E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE
    • 其他:E_ALL,代表所有错误,在进行错误控制的时候使用比较多
  • 错误触发:程序运行时触发、人为触发 使用trigger_errors(错误提示)函数

字符串语法

  • 单引号双引号:比较适合定义没有结构要求的字符串
  • nowdoc字符串:没有单引号的单引号字符串
    $str = <<<‘边界符’(后面不允许出现任何内容,包括空格和注释)
    字符串内容(边界符里的所有内容都会当做字符串全部输出)
    边界符;(必须顶格,后面不允许出现任何内容)
  • heredoc字符串:没有双引号的双引号字符串
    $str = <<<边界符(后面不允许出现任何内容,包括空格和注释)
    字符串内容(不需要分号)
    边界符;(必须顶格,后面不允许出现任何内容)
  • nowdoc与heredoc与引号相比,不会改变其输出结构

字符串转义

  • 单引号双引号的区别
    • 在单引号中能够识别 ’ ,在双引号中不能识别
    • 双引号中因为能够识别$符号,所以双引号可以解析变量,而单引号不可以
  • 双引号中变量识别的规则
    • 保证变量的独立性,不要让系统难以区分
    • 使用{}大括号

字符串长度

  • 基本函数strlen():中文占三个字节
  • 多字节字符串扩展模块:mbsreing扩展
  • 字符串相关函数

数组定义语法

  • 使用array关键字:(最常用)
    $变量 = array(元素1,元素2,元素3……);
  • 使用中括号包裹数据:
    $变量 = [元素1,元素2,……];
  • 隐形定义数组:
    $变量[] = 值;
    $变量[下标] = 值;

PHP数组特点

  • 可以整数下标或字符串下标
    如果数组下标都为整数:索引数组
    如果数组下表都为字符串:关联数组
  • 不同下标可以混合存在:混合数组
  • 数组元素的顺序以放入顺序为准,跟下标无关
  • 数组下标的自增长特性
  • 特殊值下标的自动转换
  • PHP中的数组元素没有类型限制,没有长度限制
  • PHP中数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存

多维数组

直接看例子


	//定义二维数组
	$info = array(
		array('name' => 'Jim','age' => 30),
		array('name' => 'Tom','age' => 28),
		array('name' => 'Lily','age' => 20)//最后一个元素不建议加逗号
	);
	echo '
';
	print_r($info);
/*
输出结果为:
Array
(
    [0] => Array
        (
            [name] => Jim
            [age] => 30
        )

    [1] => Array
        (
            [name] => Tom
            [age] => 28
        )

    [2] => Array
        (
            [name] => Lily
            [age] => 20
        )

)
*/

遍历数组

  • foreach遍历语法
    foreach($数组变量 as [ $下标 => ] $值){
    //通过 $下标或值访问元素的下标或值;
    }
    通常如果是关联数组(字母下标),就需要下标;如果是数字下标就直接访问值

	//定义数组
	$arr = array(1,2,3,4,5,6,7,8,9,10);
	foreach($arr as $k => $v){
		//$k、$v是随意命名的
		echo 'key:',$k,'== value:',$v,'
'
; } /*输出结果为: key:0== value:1 key:1== value:2 key:2== value:3 key:3== value:4 key:4== value:5 key:5== value:6 key:6== value:7 key:7== value:8 key:8== value:9 key:9== value:10 */
  • while配合each和list遍历数组
    • each函数使用:each能够从一个数组中获取当前数组指针所指向的元素的下标和值,拿到之后将数组指针下移,同时将拿到的元素下标和值以一个四个元素的数组返回:
      0下标 - > 取的元素的下标值
      1下标 - > 取得元素的值
      key下标 - > 取的元素的下标值
      value下标 - > 取得元素的值

	$arr = array(1,'name' => 'Tom',3,'age' => 30);
	echo '
';
	//each函数指针操作
	print_r(each($arr));
	print_r(each($arr));
	print_r(each($arr));
	print_r(each($arr));
	print_r(each($arr));
/*
输出结果为:
Array
(
    [1] => 1
    [value] => 1
    [0] => 0
    [key] => 0
)
Array
(
    [1] => Tom
    [value] => Tom
    [0] => name
    [key] => name
)
Array
(
    [1] => 3
    [value] => 3
    [0] => 1
    [key] => 1
)
Array
(
    [1] => 30
    [value] => 30
    [0] => age
    [key] => age
)
*/
  • list函数使用:list是一种结构,不是一种函数(没有返回值),list提供一堆变量去从一个数组中取得元素值,然后依次存放到对应的变量当中;list必须从索引数组中去获取数组,而且必须从0开始
  • list(变量1,变量2……)=each(数组)//是一种赋值运算,但整个表达式可以得到false结果(each是取不到正确结果的)

	$arr =array(1,'name' => 'Tom',3,'age' => 30);
	while(list($key,$value) = each($arr)){
		echo 'key is :' . $key . ' value is :' . $value . '
'
; } /* 输出结果为: key is :0 value is :1 key is :name value is :Tom key is :1 value is :3 key is :age value is :30 */

你可能感兴趣的:(编程语言相关,php)