PHP基础

来源:互联网 发布:知乎 济南血液病医院 编辑:程序博客网 时间:2024/05/17 03:20

1.      变量赋值

变量赋值:分为传值赋值( $a=123; )和引用赋值($b=&$a;)。传值赋值互不影响,各用一块空间;引用赋值共同用一个空间,一个值改变另一个值也改变。

变量作用域,local(局部),global(全局),static(静态)

Note:$this是一个特殊的变量,它不能被赋值。

2.     预定义全局变量

预定义全局变量: $_GET、$_POST、$_REQUEST、$_SERVER、$_ENV、$_FILE、$_COOKIE、$_SESSION、 $GLOBALS。

1)     超全局变量无需用关键字global或者local等定义,直接在全局可用。

2)     PHP接受通过HTML表单提交的信息时,会将提交的数据保存在超全局数组中,可以通过使用这些超全局变量来获取表单信息。form表单method缺省情况下,默认是get。input提交,name是提交过去的键名,value是提交过去的键值。提交过去的表单以数组形式储存在全局变量里。属性为checkbox时,name值可以是数组,如:name[]。如果get和post共同存在的时候,并且键(键名)相同,则以post提交的值为准,若是request也是获取的post的值。

3)     与HTML表单相关的超全局变量有$_GET,$_POST,$_REQUEST。与HTML表单相关的表单提交有$_GET,$_POST

4)     $_SERVER是服务器和执行环境信息,包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。

5)     cookie是服务器留在用户计算机中的一小段文本信息。每当相同的计算机通过浏览器请求页面时,服务器会设置cookie并在响应时发送cookie到客户端,客户端进行保存,在下次请求访问时带上这个cookie。

① cookie常用于识别用户,PHP能够创建并获取cookie的值。

② 和其他 HTTP 头一样,必须在脚本产生任意输出之前发送Cookie(由于协议的限制)。

③ 一旦设置 Cookie 后,下次打开页面时可以使用$_COOKIE 读取。 Cookie值同样也存在于$_REQUEST

④ $_COOKIE['value'] ='newvalue'; 无法修改cookie。Cookie 只能通过setcookie 设置过期时间。

⑤ cookie的生命周期可以通过cookie.setMaxAge(2000);来设置,如果没有设置setMaxAge,则cookie的生命周期当浏览器关闭的时候,就消亡了,setcookie('name','null'); 设置false或 ''或setcookie("TestCookie", "", time() -600); 过期的时间,表已经删除了该cookie值;

⑥ http://php.net/manual/zh/features.cookies.php

⑦ http://php.net/manual/zh/book.network.php

6)      $_SESSION访问者访问web网站时分配唯一id(会话id ),储存在cookie中或URL进行传递。 session保存方式可以是文件(默认)或数 据库(是扩展,需要定义)。sessionId是 键名,sessionname是键值。

session会话请求:1.服务器端生成 session id保存给客服端 2.cookie存储; 3.生成session文件保存在服务器端

$_SESSION['value'] = 'newvalue';可以修改或设置SESSION的值。

$_SESSION = array(); 等同于session_unset();

destroy删除会话文件,不会删除内存中的会话变量。

http://php.net/manual/zh/book.session.php

7)     $_FILES全局变量

Post 文件上传:enctype="multipart/form-data"

http://php.net/manual/zh/features.file-upload.post-method.php

resource文件系统及目录操作:

http://php.net/manual/zh/book.filesystem.php

使用 'b' 来强制使用二进制模式,这样就不会转换数据。要使用fopen() 中 mode标记,要么用'b' 或者用't' 作为 mode 参数的最后一个字符。在操作二进制文件时如果没有指定 'b'标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于\r\n 字符的奇怪问题。为移植性考虑,强烈建议在用fopen() 打开文件时总是使用'b' 标记。

远程文件(HTTP)不能以写入的方式打开,只能是只读方式。

3.     自定义常量

自定义常量,define("常量名必须全部大写","常量值");

constant返回一个常量值,格式为:constant (name )

PHP_version系统常量,输出PHP版本号。

 

PS: 预定义常量(又称魔术常量,一般包括当前地址,行数,文件名等)和预定义变量(当前服务器版本,系统等)

 

4.     var_dump

var_dump:打印类型和数值,显示结构信息。

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

 

5.     print

print 实际上不是函数(而是语言结构) 只能打印出简单类型变量的值(如int,string) :

print"This spans\nmultiple lines. The newlineswill be\noutput as well.";      //print输出,反斜杠转义。输出结果为:Thisspans multiple lines. The newlines will be output as well.

 

// 可以在打印语句中使用变量
$foo "foobar";
$bar "barbaz";

print 
"foo is $foo"// foo is foobar

 

// 也可以使用数组
$bar = array("value" => "foo");

print 
"this is {$bar['value']} !"// this is foo !

 

// 使用单引号将打印变量名,而不是变量的值
print 'foo is $foo'// foo is $foo

6.     print_r

print_r是函数,函数可以有返回值(即便没有用) 。print_r可以打印出复杂类型变量的值(如数组,对象),如果给出的是 string、integer 或float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。

如果想捕捉 print_r() 的输出,可使用 return 参数。若此参数设为 TRUE,print_r() 将不打印结果(此为默认动作),而是返回其输出。

Example #1 return 参数示例

<?php
    $b 
= array ('m' => 'monkey''foo' => 'bar''x' => array ('x''y''z'));
    
$results print_r ($btrue); //$results 包含了 print_r 的输出结果
?>

7.     PHP数据类型

PHP数据类型分为三大类,标量数据类型(整型,浮点,布尔,字符串),复合数据类型(数组,对象),特殊数据类型(空值,资源)

u  浮点型,第十四位后的十五为要进行四舍五入(浮点型一般可以判断大于,小于,但由于精度问题,不能直接判断等于。)

u  如果给PHP变量赋值的整型大于PHP默认最大值,将自动转换为浮点型

u  强制转换类型,(类型)变量。

u  布尔值以下都是为假,false自身,整型0,浮点型0.0,空字符串以及字符串"0",不包括任何元素的数组,不包括任何成员变量的对象,特殊类型null包括尚未设置的变量。

u  字符串有单引号和双引号,一个英文字符占一个字节空间,单引号内再输出单引号会报错,可以使用\反斜杠转译,防止报错,但可以直接输出双引号不用转译符。双引号内输出双引号也需要转译,但可以输出单引号。

① 字符串

Ø  双引号定义的字符串会对PHP变量和特殊字符进行解析。单引号定义的字符串不会解析变量和特殊字符。

用花括符定界变量的边界,如果没有花括符,会往后执行,直到找到空白结束,才会结束PHP变量的搜索定界。花括号明确变量名,只有$紧挨着 { 时才会被识别,例 ${ } or { $ }。PHP遇到$符号,会尽可能往后找更多的字符来组成PHP变量。要输出花括符或者变量符进行转义即可。

变量定界说明:在花括号中,只要抓住花括号不被解析的条件,把$符号转义则不会被解析。

Ø  Heredoc结构就像是没有使用双引号的双引号字符串(<<<EOT EOT;);Nowdoc 结构是类似于单引号字符串,nowdoc 中不进行解析操作(<<<'EOT' EOT;)。这里的EOT可以自定义。

Ø  字符串函数:

1)     字符串常用操作函数

2)     int strlen ( string $string ) 返回字符串所占的字节长度;有一个参数是string类型,返回值的类型是整型。(编码类型 GBK一个中文一般情况占两个字节;编码类型 utf-8 一个中文正常情况下占三个字节,那么三个字节才会被计为一个字符);字符串http://php.net/manual/zh/book.strings.php

3)     mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding()] ) php中括号内的参数表示可选参数,一般可选参数都会有默认值。

mb_strlen 一般用来查询中文、非字符串、英文字符串、查看的是在指定编码下的获取。返回的是在某个编码下,字符串所占的字符数。

$encoding 表示字符编码,如果省略则使用内部的字符编码(默认是与strlen一样的)。返回的是具有某编码的字符串所包含的字符数。

mixed 在不同情况下,有不同的返回值。是混合类型,或者不确定类型。

PS:如果文件编码是utf-8,在utf-8内部设置编码格式为GBK的话,默认是用utf-8的字节/2,这里的2是每2个字节为一个GBK字符。(因为转码的字符和当前页面的字符不一致);多字节字符串http://php.net/manual/zh/book.mbstring.php

4)     strpos ( string $haystack , mixed $needle [, int$offset = 0 ] );

$offset 默认从0开始,如果$offset=3,则是第二个字符;

PS:不能用返回值 == false 来判断是否查找到字符,因为有的值恰好返回的是0,所以0只能用 === false来判断是否查找到字符串,

5)     string strstr ( string $haystack , mixed $needle [,bool $before_needle = false ] )

bool $before_needle= false 表示从查找的字符串往后截取,如果为true则向前截取

② 数组

1)     PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到keys 的类型。值可以是PHP支持的任何类型,包括另一种数组。

2)     根据数组键名和数据类型的不同进行分类:索引数组(以数字作为键名的数组)、关联数组(以字符串或数字和字符串混合为键名的数组)。

3)     根据数组维数的不同进行分类:一维数组(只能保存一列数据内容)、多维数组(可以保存较复杂的数据内容)。

4)     数组的遍历:foreach遍历数组、for循环遍历数组、list操作配合each函数遍历数组、数组的游标操作遍历数组。

5)     for循环遍历只能打印索引数组。

6)     List each

list把数组中的值赋给一些变量;

each返回数组中当前的键/值对并将数组指针向前移一步。

键值对被返回为四个单元的数组,键名为0,1,key和value。单元0和key包含有数组单元的键名1和value包含有数据。如:$foo = array("bob", "fred"); 输出结果为:   Array
(
    [1] => bob
    [value] => bob
    [0] => 0
    [key] => 0
)

 

 

While(list ($key,$value)=each($arr)){echo$key.’=>’.$value . “<br/>”;}

7)     数组函数:http://php.net/manual/zh/book.array.php

PS:游标操作来遍历数组:while($value = currebt($arr)){....;next($arr);}//改变指针指向,让指针向后移,也就是指向下一个元素,不然会死循环。

8.      运算符

u  算术运算符(数学运算)

遵循数学运算规则(从左到右,先乘除后加减,有括号先算括号内)。

分为加减乘除,取反取模,自加和自减。

取模是被除数除以除数取余的意思(如果除数<被除数,则取模的余数为除数。取模余数的符号跟除数一致,跟被除数没有任何关系)。取模运算符的操作数运算前都会被转换成整数,除去小数部分(10.2%4.7)。取模结果为零说明能整除,在很多时候可以当条件。

自加自减($a++[先返回,再自加],--$a[先自减,再返回])

$a=1;$b=++$a; (此时$a已经为2) $c=$a++;此时$c为2,操作完成后为3。

简化的算术运算符:

$a+= $b;       左加       $a = $a + $b;

$a-= $b;       左减       $a = $a - $b;

$a*= $b;        左乘       $a = $a * $b;

$a/= $b;        左除       $a = $a / $b;

$a%= $b;       做取模    $a = $a % $b;

PS:除法运算符总是返回浮点数(10/3),只有两个数都是整数,并且能整除(10/2),才能返回整数。

u  赋值运算符(变量间赋值‘=’,它不是‘等于’,表示把右边表达式的值赋给左边的运算数)

u  比较运算符(比较两个变量是否相等)

$a== $b 等于       如果类型转换后 $a 等于 $b , 则返回true

$a=== $b     全等       如果 $a 等于 $b ,并且他们的类型(数据类型)也相同,则返回true

$a!= $b  不等       如果类型转换后 $a 不等于 $b , 则返回true

$a<> $b 不等       如果类型转换后 $a 不等于 $b , 则返回true

$a!== $b      不全等    如果 $a 不等于 $b , 或者它们类型不同,则返回true

$a< $b 小于       如果 $a 严格小于 $b , 则返回true

$a> $b 大于       如果 $a 严格大于 $b ,则返回true

$a<= $b 小于等于       如果 $a 小于或者等于 $b,则返回true

$a>= $b 大于等于       如果 $a 大于或者等于 $b,则返回true

u  逻辑运算符(返回布尔真假值)

$a and $b

And(逻辑与)

TRUE,如果 $a 和 $b 都为 TRUE

$a or $b

Or(逻辑或)

TRUE,如果 $a 或 $b 任一为 TRUE

$a xor $b

Xor(逻辑异或)

TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。

! $a

Not(逻辑非)

TRUE,如果 $a 不为 TRUE

$a && $b

And(逻辑与)

TRUE,如果 $a 和 $b 都为 TRUE

$a || $b

Or(逻辑或)

TRUE,如果 $a 或 $b 任一为 TRUE

 

u  字符串运算符

字符串运算符分为连接运算符(.) , 连接赋值运算符(.=),连接赋值运算符将右边的参数附到左边参数之后。

u  三元运算符(简化的分之语句)

格式 : 表达式(值一)?值二:值三;   //当表达式为true时,输出值二,为false输出值三。

u  运算符优先级。

"||" 比 "or" 的优先级高  "&&" 比 "and" 的优先级高  = 的优先级高于or

              $f false or true; //false

              $h = true and false; //true

$e = false || true; //因为后者优先级高,所以可以吧后者看为一个整体,如:$e =(false || true);

$f = false or true; //因为前者优先级高,所以可以看作($f= false) or true;

如果用 and 或者or 字母,在没有其他符号的情况下,没有优先级区分。如:if(true and false){echo“123”;} //输出结果是false,因为and是两个值同时为true才为真

与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同

 

9.     顺序控制和分之控制

顺序控制(从上到下,从左到右,当然排除特殊情况,比如有括号)

分之控制 (单分之,双分之,多分之)

多分支 [ifelse 和 switch case break default],switch可以使用整数,小数,字符串,布尔值,null,直到遇到break才停止往下执行。default位置不重要,它只会在所有条件不存在的时候执行,但如果不是放在最后,要加break。条件语句内的内容会自动转换成布尔值。分之只能选一个,当多个条件语句同时满足,则只会执行最上面的一个条件语句

 

10.  循环控制:for、while、do while、break、continue、goto

循环四要素,循环初始值,循环条件,循环体代码,步长。

PS:只要是循环语句,都必须有步长或者在循环体内添加步长改变循环条件,否则都会死循环。初始值除for循环,尽量都写在循环外面。

Ø  For循环包括初始值(1)、条件(2)、步长(3)和循环体(4)。for循环从左到右,从上到下,执行顺序为1243,步常最后一个执行(也可以放在步骤3中)。for循环没有条件或步长(没有步常将一直执行初始值)都会出现死循环。

PS:步长的作用是:改变循环条件;

       for循环可以有多个不同的初始值,多个不同的条件,多个不同的步长。

       for ($i = 1; ; $i++) {if ($i > 10) {break;}echo $i;}  //当第二个值写在循环体内的时候,第二值必须留着位置,并且分号表示结束。

       for循环也可以写成for (;;) { }(必须打两个分号,内容为空),前提是要四个步骤在之外必须定义。

Ø  while (条件) {

    循环体

}

endwhile;

Ø  do{循环体}while(条件);      //无论怎样,先执行一次循环体,再判断。

Ø  break结束当前for循环,while循环,do while循环或者switch结构语句。break可以接受可选参数来决定跳出几重循环。

Ø  continue在循环结构中用来跳过本次循环,继续执行下一次循环。可以接受可选参数跳出几重循环到循环结尾。continue要放在输出之前才有效果。continue后面没有业务代码就没有任何意义。

Ø  goto跳出循环或者switch,可以代替多层break。

 

11.  函数

函数(具有特定功能的代码段,分为系统内置函数和自定义函数。)

函数无需在调用之前被定义,除非当一个函数是有条件被定义时,必须在调用函数之前定义。调用函数:函数名()。函数返回值只能有一个,可以是任何PHP支持的数据类型,也可以用一个变量来接收该值如:$res=t()。 函数遇到return即可终止函数。(一个函数的函数名即是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据带回给调用函数,即递归调用,所以一般把函数名变量称为返回值。有返回值的函数必须有对应的return来返回。)

if ($makefoo) {

  function foo()

  {

    echo "I don't exist until programexecution reaches me.\n";

  }

}

u  函数参数传值分为按值传参和引用传参。

按值传参并不会改变外部变量;

引用传参会改变外部变量的值;引用传参的值是指向内存的,函数的值调用的是全局中的值(也就是指向内存的值)。当使用引用传参的时候,内存的值直接变换。这里的内存也就是全局变量;

参数可以有默认值,默认值的参数必须写在非默认值参数的右边,并且默认值必须是常量表达式(4种数据类型),不能是变量,类成员或者函数调用等。

u  PHP函数支持可变数量(可变函数跟可变变量($$a;)性质几乎相同)的参数列表(函数不带参数的时候,通过系统内置函数获取调用函数的参数情况):

Ø  func_num_args( void ) 函数调用时,参数的数量,返回一个整型数字。

Ø  func_get_args();函数调用时,获取参数的列表,返回的是一个数组。

Ø  func_get_arg();函数调用时,获取参数的某一项,从0开始计算参数位置。

u  函数内的变量有两种,分为局部变量(local)和静态变量(static)。

局部变量(local):函数内部声明的变量。

函数内部使用关键字static声明的变量值不能是表达式的值,只能是标量值(4种数据类型);

PS:普通局部变量,在函数调用时都会进行初始化。静态局部变量,在函数首次调用时,会进行初始化,之后不会再进行初始化,而是在原来的基础上继续执行。它可以用做静态计数器。

u  全局变量(global):全局申明的变量,全局有效。

global 表示外部全局变量,在函数内部不能直接访问,必须加global $a 在当前函数才能访问。这里的$a指的是全部变量$a;

 

12.  引入文件

include如果引入文件有错误,代码尽可能往下执行;而require如果引入文件有错误,立即终止执行。include 和require相当于复制引入文件的代码,写几个include则执行几次复制。

include_once和require_once会检测当前是否已包含这个文件,如果包含,则不会执行后面的include_once和require_once。

13.  链接

变量与类型相关扩展:http://php.net/manual/zh/book.var.php 

杂项函数:http://php.net/manual/zh/ref.misc.php 

Math 函数:http://php.net/manual/zh/ref.math.php 

serialize:http://php.net/manual/zh/language.oop5.serialization.php