67

PHP 基础教程(漫谈)

 5 years ago
source link: http://www.K0rz3n.com/2018/10/05/PHP 基础教程(漫谈)/?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

之前学习php的时候随手记下来的笔记( 应该是PHP5.x版本相对老,有些可能在php7中已经修改或者弃用 ),比较散,现在复习一下,于是就顺手整理一下并修改了一些错误和补充了一些内容。

1.关于 PHP 文件的解析

(1) php的文件后缀是 由apache配置文件(.htaccess) 决定的,他决定让PHP应用服务器用解析什么后缀作为php

(2) phpinfo(); 看到php 运行环境的所有参数

(3) php 文件中可以嵌套很多种脚本语言,html css javascript 等, <?php?> 之外的都是直接发送给客户端,里面的php代码应用服务器解析后再发送给客户端

2.语言标记

<?php ?> ——————>推荐使用

<? ?> ——————->PHP 的短标签(需要php.ini中开启 short_open_tag = On)

<?=$var?> ——————>PHP 的短标签相当于 <?php echo $var ?>(需要php.ini中开启 short_open_tag = On)

<% %> ——————>ASP风格(此种风格需要在配置文件php.ini中启用asp_tag选项)

<script language="php"> </script> ———->javascript 风格,在一些绕过中比较有用

3.指令分隔符

语句分为两种,一种是 功能执行语句 后面一定要加分号,一种是结构定义语句 后面一定不能加分号。

注意:与?>最近的一条语句可以不加分号

4.注释

// ———————>单行

/* */ ——————>多行

# ———————->脚本注释

/** */ —————->文档注释

注意:

1.注释与代码比例应该是1:1

2.不合适的代码不要删掉,先注释掉,方便以后修改

3.注释方便自己和他人的阅读理解

4.注释可以用来调试程序

5.注释写在代码的上面或者右边

特别强调:

当?>之后就是文件结尾的时候,可以不要这个东西,并且建议不加这个东西,因为在文件包含的时候,一些头函数 session cookie 什么的前面一定不能有空白,但是你在?>之后可能会不经意后回车什么的产生,这样包含的程序就会出错,不加一直到文件尾的全部都认为是php代码,不会有事。

5.变量

1.php可以用关键字命名

2.开头不可以是数字或者运算符号 (变量名的第一个字符已经扩展为 [a-zA-Z_\x7f-\xff] )

3.需要输出多次,或者可能会修改那就用变量

4. $变量名=值 没有类型,因为php是弱类型的语言,变量类型由存储的内容决定

5.PHP可以连续赋值

6.php变量和常量区分大小写,但是其他不区分

7.PHP变量名要有意义,

8.命名习惯是第一个单词首字母小写,其余首字母大写$aaaBbbCcc (驼峰式命名法)

6.可变变量

可变变量比较容易出现变量覆盖的问题

$one="aaa";
$a="one";
$$a=? --->aaa

7.引用赋值

类似于C指针

$a=&$b;

8.类型

整型 浮点型 布尔型 字符型

复合类型 –》数组 类

资源类型 –》 如fopen()

var_dump()可以查看类型

9.变量声明

$int=10 十进制
$int=045 八进制  375
$int=0xff 十六进制 25
$int=3e5  300000

整数的最大值是4字节 2的32次方

以下都是假

$bool=false;
$bool=0;
$bool=0.00;
$bool="";
$bool=" ";
$bool="0"
$bool=array();
$bool=null

10.字符串的声明

1.单双引号能声明字符串

2.字符串没有长度限制

3.在 双引号 声明的字符串中既 可以直接解析变量 ,又可以使用转义字符

4.在 单引号 声明的字符串中 不可以 直接解析变量,也不可以使用转义字符(转义字符\只能用来转义他自己,和单引号)

5. 字符串中嵌套变量

echo "asdada$int sdadadadadasdadas$int dasdsadsadadadadasda";

这里面解析变量是要有空格的,输出的时候也有,因为合在一起区分不了变量。 解决方法是在变量外面加大括号

echo "asdada{$int}sdadadadadasdadas{$int}dasdsadsadadadadasda";

或者

echo "asdada${int}sdadadadadasdadas${int}dasdsadsadadadadasda";

6.双引号中不能使用双引号,单引号中不能使用单引号

注意:

最好使用单引号,越简单的东西浪费的资源越少,开发中有大量的输出,除非需要的时候用双引号

7.定界符声明字符串

$str=<<<p
    adkladaaksdak''a''"""sad'""a'‘’asdad{$int}dad\nadad\t\\adadaad\r
p;

这里的p是自定义的,第一个后面不能有任何符号包括空格,第二个前面不能有任何符号,包括空格。

定界符里面能解析变量,转义字符,单引号双引号

11.PHP的特性

会把多个0当成一个0

12.浏览器特性

会把多个空格解析为一个空格比如在字符串里面有一个\t,页面只会显示一个空格,但是源码里面很多个\n页面也是只有一个空格,源码里出现回车。

13.变量类型转换

一种是强制转换

setType(变量名,类型)

类型有 int iteger float double real bool boolean string array object

settype() 这个函数是将原变量的类型转换,

$val=intval(变量或值)

$val=floatval(变量或值)

$val=stringval(变量或值)

$a=(int)"100.131231asdad"

注意:

1.转换的时候一定要注意数字的范围

整数占4个字节,浮点数占8个字节,那么超过四个字节转换成整数就会出现溢出 整数最大是 2.147483648e9

超过或者等于这个值就会出错。

2.字符串转换的时候注意,开头是数字的字符串,转化成整型就会截取前面的数字,但是后面的不会有,纯粹>的字符换或者空字符都会转化成0

另一种是自动转换

这种用的比较多,因为这种情况下我们开发的时候不用管理类型,他会根据环境自动转换。

示例代码:

$a="100.123123adaddda";

$b=2.147483648e9;

$c=10;

$d=true;

echo $sum=$a+$b+$d+$c;
2147483759.1231

14.和变量有关的一些函数

gettype(变量名) 得到类型

isset() null 代表不存在 但是” “代表存在 ‘’代表存在

empty() “ “代表不为空

15.变量类型测试函数

is_bool()
is_int() is_integer() is_long()
is_float()  is_double()  is_real()
is_array()
is_resource()
is_object()
is_scalar() ------------->是否是标量,整型,字符串,浮点型,布尔
is_numberic()
is_callable() ----------->检查类中的方法是否可被调用(    当然先检查是否存在)
method_exists() ---------->只会检查是否存在,能不能调用不关他的事


print_r()打印数组
echo 打印普通变量

16.常量

常量用 define(“常量名”,值)定义,

常量使用范围比变量更广,在全局定义的变量在子函数中找不到,不能用除非 使用时在前面加 global $a 但是常量只要在全局定义记就没有限制。

常量定义以后就不能修改,也不能用unset取消,

常量在任何时候都不加$

常量的值只能是标量,(四种)

defined判断常量是否存在

预定义常量和魔术常量

预定义M_PI 

魔术 __FILE__

17.运算符

1.算术运算符

% 有两个目的

1.用来整除

2.用来控制数字大小

注意:

使用时,他会把他两边的数全部转化成整数再进行运算,因此不要用小数取余也尽量不要用负数

2.字符串运算符 .

不仅可以把两个字符串连接成新的字符串,还可以把一个任意标量和一个字符串连接成新的字符串。

3.赋值运算符

= += -= 、= *= %= .=

赋值运算符左边必须是变量,右边是表达式

4.比较运算符

== <> != === !==

注意:

这里面不要用一个等于号,那个是赋值语句 特别注意这个!== 这个叫恒不等于,他当数值相同但是类型不相同的时候 会返回真,但是!= 在这种情况下就会返回假。换句话说只要有一个不相等就会返回真。

5.逻辑运算符

&& and || or ! not

处理的都是bool 返回的也是bool

同一级不要出现不同的运算符混合,最好要加括号

6.位运算

& | ^ ~ << >> >>>

位运算会把左右的字符串转化成ascll  会把浮点数转化成整数 进=进行二进制的运算

>>2相当于除以4 <<2相当于乘以4
>>>无符号右主要是跨平台用

注意:

& | 既可以做位运算符也可以做逻辑运算符,但是这里面有着很大的区别。

7.短路问题:

使用&& || 会存在短路问题,会有一遍可能不执行,但是 & | 两边都要执行完毕不会出现短路问题

``可以执行系统命令 echo `ipconfig`;

@ 可以消除错误提示 @gettype()

提醒:用括号改变优先级比较好

18.函数

1.定义:

函数是被独立命名的,独立的代码段,他执行特定的任务,并可以给调用它的程序返回一个值传进函数的变量在函数中改变并不会影响该变量的值,这和c语言是一样的,除非你传进去的就是地址。

2.函数的优点

(1)提高程序的重用性

(2)提高程序的可维护性

(3)提高软件的开发效率

(4)提高软件的可靠性

(5)控制程序的复杂性

3.函数的声明

function 函数名(参数1,2,3)
{
    函数体;
    返回值;
}

注意:

一.函数必须调用才能执行,函数调用可以在声明前也可以在声明后 二.函数名和变量名一样,aa bb cc aaBbb

三.php没有命名空间的概念,因此函数在声明时绝对不能重名。(不仅和自己,还要和系统函数)

四.可以通过像函数传递参数来改变函数的行为,括号里面的变量和内部定义的变量是一样的,都是局部的。唯一不同的是,他可以在调用时赋值,里面的变量不可以

五.没有返回值就成为过程 六.我们把所有的返回值全部存到一个变量里面,然后返回这个变量,谁调用的他,就要返回到谁那里去。

七.函数执行到return就停止了,因此后面不要写语句。

4.可变函数

变量() php会寻找和变量值同名的函数

5.编写函数的规范

在编写函数的时候应该说明以下几点:

1.函数的功能

2.函数的参数

3.函数的返回值

php有2000多个系统函数,同样的功能你能写出来但是一定要使用系统函数,执行效率更高

函数的参数都是以 类型 + 值 的方式写入的(声明时)

6.函数的分类

1.常规函数

bool copy(string source ,string dest)

2.带有mixed

mixed表示可以传入任意类型的参数

bool chown(string filename,mixed user)

3.带有&的参数

表示引用赋值,必须传入一个变量,传进去的变量在函数中操作的是地址,直接就会被改变。

bool arrest(array &array [,int sort_flag])

4.带有中括号的参数

这种参数是可选的,如果你传入了值,就按照你传入的值用没传值,就用默认值。

bool arrest(array &array [,int sort_flag])

怎么做到这样子呢??

只要在定义的时候传进去默认值就行了。

function($a,$b,$c=10){}

这个时候如果第三个参数不传值,那么会用默认的10

注意:在设置的时候可选值绝对不能放在必须值得前面

5.带有…的参数的函数

…表示可以穿任意多个参数

int arry_unshift (array & array ,mixed var [,mixed...])

6.回调函数

带有callback参数的函数,就是调用这个函数我们需要传递一个函数进来(函数名),

array array_filter(array input [,callback callback])

7.内部函数

可以再函数内部再次声明函数,目的就是在函数的内部调用,用来帮助外部函数完成一些子功能。

8.递归函数

在自己内部调用自己

9.系统函数

19.PHP 变量的范围

局部变量:在函数内部声明的变量就是局部变量,只能在函数内部使用。

全局变量:在函数外声明,声明后整个脚本结束前都可以使用的包括在函数中和{}中都可以使用。

注意:

(1)php的变量分不出是声明还是调用,不像js 声明是var 变量,调用直接就是变量

(2)在php中使用全局变量要通过global 关键字将这个全局变量包含到这个函数中,目的是告诉函数你使用的这个变量是全局而不是函数内部的(global声明之后用的才是全局的)

20.php中的静态变量

静态变量只能在函数中或者是类中声明,不能在全局声明。

使用static 在变量前

作用:一个变量可以在同一个函数多次调用中重用

1.静态变量在静态代码段中保存

2.一个函数在多次调用之间重用,但是只在第一次调用函数时声明到内存,以后再调用就不再声明,直接使用

3.静态变量只能初始化为一个字符值或者一个常量,不能是表达式,即使变量定义时没有赋初值,系统也会自动赋值为零,或者是空字符。

21.包含文件

1.常见的四种方法:

require 可以重复包含

inculde

require_once 自动检测是否重复包含,并且只能包含一次

incukde_once

注意:这些都是系统指令,都有两种用法,

比如:

include(“文件名”);

include “文件名”;

echo(”@@@@@@@@@@@@@@@@@”);

echo “@@@@@@@@@@@@@@@@@@”;

这种包含不是直接拷贝(因为很多都不是php的语法),而是当成php解析后输出的代码

我们知道在PHP中是没有命名空间的,所以一个函数名不能定义两次,也就是如果文件中有定义函数的内容那么这个文件就不能被包含两次,这就是include_once和require_once存在的意义

但是,功能多的函数效率一定比较低。建议使用不带once的

2.require 和 inculde的区别是

require 是静态包含,就是确定要包含什么

include 是动态包含 被包含内容可能有变量。

22.数组

一.数组的概述

1.数组的本质:管理和操作一组变量,成批处理

2.数组是复合类型

3.数组中可以存储任意长度的数据,存储任意类型数据

4.php 中的数组就可完成其他语言数据结构的功能(链表,队列,栈,集合等)

二、数组的分类

数组中有多个单元(单元称为元素)

每个元素(下标[键],值)

单独访问元素的时候,都是通过下标来访问的

1.一维,二二维,三维,多维数组(数组的数组)

2.PHP中有两种数组

①索引数组:下标是顺序整数作为索引的

②关联数组:下标是字符串作为索引的

下标(整数,字符串)只有这两种

三、数组的声明方式

1.直接为数组元素赋值

a.这种情况下可以不给索引,那么他会按照顺序一个一个的赋值
b.如果突然在中间给了一个值的索引,后面的就会从所给的索引值加一开始
c.如果后面给了两个索引值,那么会从最大的值加一开始
d.关联数组的就是把数字改成字符串就行了
e.混合声明两者互不影响。

2.使用array函数赋值

a.默认是索引数组
b.用“键”=>值  使之成为关联数组
c.二或多维数组多个数组成员之间用逗号隔开
d.把二维数组香香成一个表格,那么三维数组就是三个表格

3.使用其他元素赋值 、

如file()会把文件内容的每一行存到一个数组里面。

四、数组的遍历

1.for语句循环遍历

a.其他语言只有这一种方式(首选)
b.php里面这种方式并不是首选的
c.用这种方式遍历数组必须是索引数组,并且下标必须连续

2.foreach 语句循环遍历

foreach(数组变量 as 变量值)
{
    循环体;    
}

a.循环的次数由数组的元素个数决定,有几个循环几次
b.每一次的循环都会将数组中的元素分别赋值给后面的变量
c.如果是关联数组,还想知道键值那么可以使用它的第二种形式


foreach(数组变量 as 变量1=>变量2)
{
    echo 变量1 ."===>".变量2 ;
}

变量1存键值  变量2存值

3.while() 和each() 或 list() 结合使用

each()函数

a. 需要一个数组作为参数
b. 返回值也是一个数组
c. 返回的数组是0,1 key value 四个固定的下标
   0和key 是当前数组元素的键
   1和value 是当前数组元素的值
d.默认当前元素就是第一个元素
e.每执行一次就会将当前元素向后移动
f.如果到最后的元素再执行这个函数,就会返回false
g.相当于返回两个,一个是索引数组,一个是关联数组

list()函数

a. list($a,$b,$c...)=array(1,2,3,...);
b. 数组中的元素个数要和list中的元素个数相同,如果只想打印一个,其他两个变量的位置也要空出来
c. 数组中的给每个元素会赋值给list()中的每个参数,list()会    把每个值转化成变量
d. list() 只能接受索引数组,并且按照索引的下标从小到大的顺序。

while(list($key,$value)=each($usr))
{
    echo $key."====>".$value."<br>";
}

但是这个还是有弊端,因为each()执行一次指针就会跑到最后下一次再使用就不行了,下面介绍已解决办法

使用数组的内部指针控制函数

next(数组)

prev(数组)

reset(数组)

end(数组)

current(数组) 取当前元素

key(数组) 取当前键值

五、超全局数组

预定义数组

自动全局变量 —- 超全局数组

1.包含了来自web服务器,客户端,运行环境以及用户输入的数据

2.他们在全局范围内自动生效,都可以直接使用这些数组

3.用户不能自定义这些数组,=但是操作方式和原来一样。

$_GET

$_POST

$_REQUEST//经由get post cookie 提交的数据都可以由他来接受,因此该数组不值得信任,最好不要使用. 

$_FILES//经由 http post方法提交至脚本的文件

$_COOKIES

$_SERVER

$_ENV//服务器,操作系统的环境信息

$_SESSION//变量由web服务器设定,或者直接和当前的执行环境有关

$GLOBALS//只要是当前脚本有效的变量都在里面,数数组键名为全局变量的名称

注意:

不要用变量来接受请求的参数,这种输进去的参数可以直接被转化成变量,那样带会来安全隐患,并且一般管理员并不打开自动注册为全局变量的选项

为什么不能一直使用get请求?

因为get请求是在地址栏里面的,而地址栏是有限长度的,最长是8092字节,并且明文显示是很不安全的。

六、数组的相关处理函数

1.和数组键值相关的函数

1.array_values()返回数组中所有的值并返回数字索引
2.array_keys() 返回数组中的键值,有两个可选参数,可以指定返回那个值得键值,第三个参数可以指定第二个参数是否需要严格按照类型进行匹配,严格true不严格就是false。
3.in_array()判断第一个参数是不是在数组中(第二个参数)还有第三个参数用来判断类型。
4.array_key_exists() 判断键值是否存在与数组当中。
5.array_flip(数组)交换数组中的键和值(但是注意如果不同的键值对应同一个值得话,反过来同一个键值对应着不同的值,那么后面的就会把前面的覆盖)
6.array_reverse()把数组对调,

2.统计数组元素个数和唯一性

1.count()  sizeof()
2.array_count_values() 统计数组中值出现的次数,返回一个数组。
3.array_unique()移除数组中重复的值,返回一个没有重复值得数组

3.使用回调函数处理数组

1.array_filter(数组,自定义函数)用回调函数过滤数组中的单元,函数返回真数据留下否则不留)

2.array_walk(数组,函数,其他)对数组中的每个元素应用回调函数,键和值都会传到函数中,值作为第一个参数,键作为第二个参数,因此这个函数需要接受两个值,还存在第三个参数,可以也当做变量传入中间的函数,作为参数

3.array_map(函数,数组,[数组])将回调函数作用到对应的数组元素值上,返回值是一个数组。第三个数组的元素个数一定要和第二个数组相同,函数可以接受两个参数,分别是两个数组对应的元素,进行操作,一定要用return 返回,

注意一下:

一.array_map() 和array_walk()还是有一定区别:

1.array_walk()能把数组的键和值全部传进去,但是 array_map()只能传进去。

2.array_walk()可以直接对数组进行操作不需要回值,但是array_map()就是根据传入的值得情况去返回一个值,代替原值,形成一个新的数组

二.array_filter()和array_map()也有区别:

前者返回的只是true或者false,True的保留,false的移除形成一个新的数组,但是不能改变数组元素的值

七、数组的排序函数

数组排序函数

sort()

rsort()

usort()

asort()

arsort()

uasort()

ksort()

krsort()uksort()

nasort()

natcasesort()

array_multisort()

1.简单的数组排序、

sort() rsort()

sort(array &array[, int sort_flag])

都是直接改变原数组的

2.根据键值对数组进行排序

ksort() krsort()

3.根据值进行排序

asort()  arsort()

注意:

sort()和rsort()也是根据值进行排序的但是他会忽略键值,排序完就成了顺序排列的数字,但是这个不会,键值对的关系将会保留。

4.根据自然数排序法对数组排序

natsort() natcasesort()

前一个区分大小写,后一个不区分

$arr=array("file1.txt","file2.txt","file11.txt","file6.txt");

类似于这样的数组,如果我们直接根据值进行排序,一位一位的比较但是我们得到的会是 1 11 2 6 这样的结果,我们用这两个也会是一位一位的比较,但是数字的排序是正确的

5.根据用户自定义的规则对数组进行排序

usort() uasort() uksort()

参数采用 数组,回调函数 的模式

function sortbylen($one,$two)
{
    if(strlen($one)==strlen($two))
        return 0;
    else
    {
        return (strlen($one)>strlen($two))?1:-1;//正一代表往后移,负一代表往前移。
    }
}

6.多维数组进行排序

array_multisort()

八、拆分 合并 分解 结合 的数组函数

1.array_slice(数组,起始,结束)

注意:

数组下标从零开始

他并不是在源数组上进行操作,而是返回一个新的数组,

还有第四个参数 true或者false true 的话键值不会改变,保留原来(这对关联数组没有影响,始终是保留键值的)

2.array_splice()

直接改变原数组,选择数组中的将其删除,并将删除的数组返回,如果有第四个参数(一个数组)就把他们用这些值一一替换

3.array_combine(键名数组,键值数组)

合并两个数组创建一个新的数组,其中一个数组作为键名 一个作为键值如果一个数组为空,或者两个个数不相同就会返回假

4.array_merge()

把一个或者多个数组合并成一个数组,如果键名有重复,该键的键值为最后一个对应的值,后面的覆盖前面的。如果数组是数字索引那么数组会以连续的重复索引合并在一起

5.array_intersect()

计算数组的交集

6.array_diff(数组1,数组2)

返回两个数组的差集,返回的是数组1有但是数组2没有的部分。

九、数组与数据结构相关的函数

1.使用数组来实现堆栈的功能

array_push(数组,值1,值2…)入栈———–》我们一般使用 $a[]=”” 直接赋值的方法来入栈,这样效率更高,但是连续入栈两个我个人觉得函数更加方便

array_pop(数组)出栈 ————》每次出栈一个,并返回

2.使用数组实现队的功能

array_unshift(数组,值1,值2….)

注意:

php的队尾是数组的最左边,值1比值2后进队。

array_shift(数组)

删除队头元素,记得用一个值接受

特别注意 :

unset() ======>既可以删除变量,也可以删除数组中的元素,还可以删除对象中的成员

3,其他和数据操作有关的函数

array_rand(数组,个数)

随机从数组中取出一个或者多个元素的键值并且返回取一个就返回一个,取得多就返回数组

shuffle()

将数组中的元素随机打乱,成功时返回真,失败时返回假(对原数组直接操作)

array_sum()

将数组元素求和

range(元素的最小值,最大值,步长)

创建一个包含指定范围内元素的数组,有三个参数,前两个可以是字母

array_map(函数名,数组)

将数组的每一个值传入一个函数,返回的是函数处理之后的新数组。

结语

这些就是PHP 的最基本的语法内容,其他面向对象的 内容请关注我的另一篇文章 《PHP 编程进阶(重点是面向对象和MVC)》


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK