PHP笔记

自学PHP,整理一些笔记

PHP笔记

1 概念

1.1 定义

PHP(外文名:PHP: Hypertext Preproce+ssor,中文名:“超文本预处理器”)是一种通用开源脚本语言。

1.2 特点

  • 语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。
  • 用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;
  • PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

2 基础

2.1 PHP标记

1
2
3
<?
echo \"Hello, World!\"
?>
  • PHP使用<? >标记PHP语句块

2.2 注释

2.2.1 行注释

1
2
// 行注释
# 行注释2.2.2

2.2.2 块注释

1
2
3
4
/*
块注释,行1
块注释,行2
*/

2.3 变量

2.3.1 定义与调用

1
2
$str=\"hello\";
echo \"$str\".\" world\" // 单点.表示字符串连接

2.3.2 可变变量

PHP中的变量名也可以是变量:

1
2
$i=\"abc\";
$$i=\"xyz\"; // 此时,即 $abc=\"xyz\"

2.3.3 判断变量类型

  • is_integer($var)
  • is_string($var)
  • is_double($var)
  • is_array($var)

2.3.4 读取变量类型

  • gettype($var)

2.3.5 设置变量类型

  • settype($var, \"string\")

2.3.6 判断变量是否定义

  • isset($var)

2.3.7 删除变量

  • unset($var)
  • unset($arr['...'])
  • unset($var1, $var2, ...)

2.3.8 预定义变量

2.3.8.1 $GLOBALS[]

全局范围有效

2.3.8.2 $_SERVER[]
  • $_SERVER['PHP_SELF']
    • 当前脚本文件名
  • $_SERVER['SERVER_ADD']
    • 服务器IP
  • $_SERVER['SERVER_NAME']
    • 服务器主机名
  • $_SERVER['DOCUMENT_ROOT']
    • 网页站点的服务器根目录
  • $_SERVER['SCRIPT_FILENAME']
    • 当前脚本文件名
  • $_SERVER['SCRIPT_NAME']
    • 当前脚本路径
  • $_SERVER['HTTP_REFERER']
    • 上一页面,链接至当前页的URL
  • $_SERVER['REQUEST_URI']
    • 访问此页面所需的URI
2.3.8.3 HTTP处理
  • $_GET[]
  • $_POST[]
  • $_FILE[]
  • $_COOKIE[]

2.4 常量

2.4.1 定义常量

1
2
define(STR, \"hello\");    // 字符串常量
define(SIZE, 100); // 数值常量

2.4.2 预定义常量

  • __FILE__
    • 当前PHP文件名
  • __LINE__
    • 当前脚本执行行,行号
  • PHP_OS
  • PHP_VERSION

2.5 逻辑结构

2.5.1 if语句

1
2
3
4
5
6
7
8
9
10
11
12
if(...)
{
statements
}
elseif(...)
{
statements
}
else
{
statements
}

2.5.2 switch语句

1
2
3
4
5
6
7
8
9
switch($var)
{
case 1: statements
break;
case 2: statements
break;
...
default: statements
}

2.5.3 for语句

1
2
3
4
for($i=0; i<10; i++)
{
statements
}

2.5.4 while语句

1
2
3
4
while(...)
{
statements
}

2.5.5 do-while语句

1
2
3
4
5
do
{
statements
}
while(...)

2.6 函数

2.6.1 自定义函数

1
2
3
4
5
function func_name(params)
{
statements
[return $param]
}

2.6.2 系统函数

1
2
3
<? 
phpinfo();
?>
  • 输出php信息页
1
function_exists(\"fopen\");
  • 判断名为fopen的函数是否存在

2.7 HTML与PHP交互

1
2
3
4
<form name=\"form1\" method=\"POST\" action=\"form1.php\">
<input name=\"user\" type=\"text\">
...more...
</form>
  • html处显示表单,指定action为处理脚本
1
$user=$_POST['user'];    // 预定义变量__POST['user']存储POST报文传来的name为\"user\"的变量
  • php脚本通过PHP预定义变量读取传来的数据

2.8 会话 $_SESSION[]

2.8.1 概念

  • session:从用户访问到关闭浏览器期间存在的会话

2.8.2 使用

1
2
3
4
5
<?
session_start();
$_SESSION['user']='USER1';

?>
  • 此变量在会话期间一直有效,可用于用户登录后,多个页面持续显示

2.9 文件 $FILES[]

1
<input name=\"myfile\" type=\"file\" />
  • 在HTML中POST文件
1
2
3
4
5
6
7
$name=FILES['myfile']['name']    // 获取文件名
$name=FILES['myfile']['type'] // 获取类型
$name=FILES['myfile']['size'] // 获取大小
$name=FILES['myfile']['tmp_name'] // 获取上传至服务器后的临时文件名
$name=FILES['myfile']['error'] // 获取错误信息

move_uploaded_file($FILES['myfile']['tmp_name'], $dest_filename) // 将上传文件移动到指定的路径和文件名
  • 在PHP中处理上传了的文件

3 数组 array

3.1 定义与调用

1
2
$arr=array('a', 'b', 'c');
// 用arr[0]~arr[2]调用
  • 默认数字index
1
2
3
4
$arr=array('server'=>\"apache\", \"os\"=>\"windows\", \"db\"=\"MySQL\");
/*
arr[0~2]或arr['server']
*/
  • 自定义key-value映射

3.2 compact

1
2
3
$num=1;
$arr=array('a', 'b');
$new_arr=compact(\"num\", \"arr\");
  • compact合并变量为新数组

3.3 combine

1
2
3
$keys=(1,2,3);
$values=('a', 'b', 'c');
$keyvalue_arr=combine($keys, $values);
  • combine合并$key_arr$value_arr为新的键值对应数组

3.4 foreach

1
2
3
4
foreach($arr as $per_value)
{
statements
}
  • 遍历数组中的每一个值
1
2
3
4
foreach($arr as $key=>$value)
{
statements
}
  • 遍历数组中的每一个键和对应的值
1
2
echo \"<pre>\";
print_r($arr);
  • 通常在print_r之前输出<pre>,HTML预解析,保留原格式。

3.6 count

1
2
3
4
for($i=0; $i<count($arr); $i++)
{
statements
}
  • count() 可以用在for循环中

3.7 array_chunk

1
array_chunk($arr, $chunk_size, $preserve_key);
  • $arr 中的元素分为每$chunk_size个一组。

3.8 array_merge

1
array_merge($arr1, $arr2, ...);
  • 将多个array合并成一个array

3.9 current

1
$pos=current($arr);
  • 获取array的当前读写位置

3.10 next

1
$pos=next($arr);
  • 获取array读写位置的下一项,并移动读写指针到下一项

3.11 prev

1
$pos=prev($arr);
  • 获取array读写位置的前一项,并移动读写指针到前一项

3.12 end

1
$pos=end($arr);
  • 获取array读写位置的最后一项,并移动读写指针到最后一项

3.13 reset

1
reset($arr);
  • 重置array读写指针位置

3.14 sort

1
sort($arr);
  • $arr执行排序(依据value排序,重建key(1,2,3,...))

3.15 rsort

1
rsort($arr);
  • $arr执行逆向排序(依据value排序,重建key(1,2,3,...))

3.16 asort

1
asort($arr);
  • $arr执行排序(依据value排序,保留key-value映射)

3.17 ksort

1
ksort($arr);
  • $arr执行排序(依据key排序)

3.18 shuffle

1
shuffle($arr);
  • $arr执行乱序排序(且重建key)

3.19 array_reverse

1
array_reverse($arr);
  • $arr执行倒序排序(且重建key)

3.20 range

1
$arr=range($low, $high[, $step]);
  • 根据范围建立array,建立从低到高(步长默认为1)的$arr

3.21 array_push

1
array_push($arr, $var);

3.22 array_pop

1
array_pop($arr);

3.23 array_change_key_case

1
array_change_key_case($arr, CASE_UPPER/CASE_LOWER);
  • 包含key,转换到全大写/小写

3.24 array_intersect

1
array_intersect($arr1, $arr2, ...);
  • 求交集 A1∩A2∩...

3.25 array_diff

1
array_diff($arr1, $arr2, ...);
  • 求差集 A1-A2-...

3.26 array_diff_assoc

1
array_diff_assoc($arr1, $arr2, ...);
  • 求差集 A1-A2-...
    • 注意:assoc 表示把key值也计入比较

3.27 array_flip

1
$fliped_arr=array_flip($arr1);
  • key-value对换

3.28 array_fill

1
$arr=array_fill($start_idx, $count, $fillvalue);
  • start_idx开始,用$fillvalue填充$count个元素

3.29 array_count_values

1
$count=array_count_values($arr);
  • array中value种类个数

3.30 array_key_exists

1
$bool=array_key_exists($key, $arr);
  • $arr中是否存在$key

3.31 array_keys

1
$keys=array_keys($arr);
  • 输出array的keys

3.32 in_array

1
$bool=in_array($value, $arr);
  • value是否在数组内

3.33 array_map

1
array_map(\"func_name\", $arr);
  • 回调函数func_name,处理$arr

3.34 key

1
$key=key($arr);
  • 当前项的key

4 字符串 String

4.1 explode

1
$arr=explode($seperator, $str[, $count]);
  • 分割符分割字符串,可以定义分几份为止

4.2 implode

1
$str=implode($seperator, $arr);
  • 合并$arr$str, 并设置分隔符

4.3 strcmp

1
strcmp($str1, $str2);
  • 比较字符串

4.4 str_replace

1
str_replace($search, $replace, $str);
  • $str$search部分替换为$replace部分

4.5 print

1
2
print $str
print($str);

4.6 sprintf

1
sprintf($format_str, $args);
  • $format_str 即包含%d, %s的格式化字符串

4.7 substr

1
substr($str, $start_idx, $args);

4.8 ltrim

1
ltrim($str);
  • 从左向右清除空白符

4.9 rtrim

1
rtrim($str);
  • 从右向左清除空白符

4.10 trim

1
2
trim($str);
trim($str$char);
  • 清除内容两侧的空白符

4.11 strlen

1
$length=strlen($str);

4.12 strtolower/strtoupper

1
2
strtolower($str);
strtoupper($str);
  • 大小写转换

4.13 htmlentities

1
htmlentities($str)
  • html编码

4.14 html_entity_decode

1
html_entity_decode($str)
  • html字符串解码

4.15 str_repeat

1
$repeated_str=str_repeat($str, $times);
  • $str重复多次生成新的字符串

4.16 parse_str

1
parse_str($str);
  • 分析字符串,并生成相关变量

4.17 str_split

1
str_split($str, $length);
  • $str切片分割,每片长度$length

4.18 md5

1
md5($str);

4.19 sha1

1
sha1($str);

5 日期及时间 Date&Time

5.1 date

1
$date_str=date($format[, $timestamp]);

5.2 mktime

1
$timestamp=mktime($hour, $minute, $second, $month, $day, $year);

5.3 getdate

1
$arr=getdate([$timestamp]);

5.4 checkdate

1
checkdate($month, $day, $year);
  • 检查日期是否合法,如2月30日之类

6 文件及目录 File&Dir

6.1 opendir

1
$dirhandle=opendir($path);
  • 打开文件,返回值为句柄

6.2 closedir

1
closedir($path);

6.3 readdir

1
$filename=readdir($dirhandle);
  • 读取当前目录的下一项文件名,若无,则false

6.4 scandir

1
$file_list=scandir($path);

6.5 getcwd

1
getcwd();
  • 取得当前工作目录(current working directory)

6.6 chdir

1
chdir($path);
  • 更改工作目录

6.7 mkdir

1
mkdir($path, $mode);

6.8 rmdir

1
rmdir($path);

6.9 fopen

1
2
$filehandle=fopen($filename, $mod);
$filehandle=fopen($url, $mod);

6.10 fclose

1
fclose($filehandle);

6.11 feof

1
feof($filehandle);

6.12 fgets

1
2
$line=fgets($filehandle);
$line=fgets($filehandle, $size);
  • 默认每次读取1024字节长度的一行

另:

1
2
3
readfile
file
get_file_contents

6.13 fwrite

1
fwrite($filehandle, $content[, $length]);

另:

1
2
fputs	// fwrite的别名
file_put_contents($filename, $data);

6.14 filexxx

1
2
3
fileowner($filename);
filesize($filename);
filetype($filename);

6.15 is_xxx

1
2
3
4
is_dir($filename);
is_file($filename);
is_readable($filename);
is_writeable($filename);

6.16 basename

1
$str=basename($path);
  • 从完整文件路径中读取文件名

6.17 dirname

1
$str=dirname($path);
  • 从完整文件路径中读取目录部分(层级)

6.18 copy

1
copy($src, $dest);
1
unlink($filename);
  • 删除文件

6.20 rename

1
rename($oldname, $newname)

6.21 chxxx

1
2
3
chgrp($filename, $grp);
chmod($filename, $mod);
chown($filename, $user);

6.22 flock

1
flock($filehandle, $operation);
  • $operation
    1. LOCK_SH 读锁定,共享锁
    2. LOCK_EX 写锁定,互斥锁
    3. LOCK_UN 释放,解锁
    4. LOCK_NB 锁定时不阻塞

6.23 filextime

1
2
3
fileatime($filename);  // access time
filemtime($filename); // modified time
filectime($filename); // inode change time

7 HTTP

7.1 fopen

1
$filehandle=fopen($url, $mod);

7.2 fgetss

1
$str=fgetss($url, $mod);
  • 读取网络文件一行,并过滤HTML和PHP标记

7.3 urlencode/urldecode

1
2
$str=urlencode($str);	// 非字母或数字的字符编码为 %+2位十六进制表示
$str=urldecode($str); // 编码为可读url字符串

7.4 parse_url

1
$arr=parse_url($url);
  • $arr['key']
    • key
      1. scheme
      2. host
      3. port
      4. user
      5. pass
      6. path
      7. query
      8. fragment
1
header('key:value');
  • 修改HTTP头部
  • print_r($_SERVER)可读取

7.6 setcookie

1
setcookie($name[, $value, $expire, $path, $domain, $secure]);
  • expire cookie生命值倒计时, 通常用 time()+n 单位秒
  • $path cookie的有效路径
  • $domain cookie的有效域名
  • $secure 是否当https时才有效

读取时,可用 $_COOKIE[$name]读取


8 系统信息

8.1 getenv

1
getenv($key);
  • $key
    1. DOCUMENT_ROOT
    2. SERVER_ROOT
    3. SCRIPT_NAME
    4. HTTP_USER_AGENT
    5. REQUEST_METHOD
    6. SERVER_PROTOCOL

8.2 putenv

1
putenv(\"$key=$value\");

8.3 get_loaded_extensions

1
$arr=get_loaded_extensions();

8.4 get_extension_funcs

1
$arr=get_extension_funcs($module);

8.5 phpinfo

1
echo phpinfo()

8.6 getmypid

1
getmypid();

8.7 get_current_user

1
get_current_user();

9 数学

9.1 计算

1
abs/floor/round/ceil/exp/pow/sqrt

9.2 转换

1
2
3
decbin/dechex/decoct
bindec/hexdec/octdec
base_convert

9.3 随机数

1
mt_rand($min, $max);
  • rand()

10 数据库 MySQL

10.1 总例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*建立连接*/
$conn=mysql_connect($server, $user, $password);
if(!conn)
die('no connection'.mysql_error());

/*选中数据库*/
mysql_select_db('test');

/*执行SQL语句*/
$result=mysql_query($sql);

/*获取,分析SQL执行结果*/
$row=mysql_fetch_array($result, MYSQL_ASSOC); // MYSQL_ASSOC以索引关联
$row_count=mysql_num_rows($result);
$count=mysql_affected_rows();
fields=mysql_fetch_field(); // 获取域信息

/*关闭数据库连接*/
mysql_close($conn);

11 面向对象程序设计 OOP

11.1 总例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php

/**
* 定义Person类
*/
class Person
{
private $name;

/* 构造函数 */
public function __construct($name=NULL)
{
if($name)
{
$this->name=$name;
}
}

/* 析构函数 */
public function __destruct()
{
echo 'destructing object'
}

public function getName()
{
return $this->name;
}

public function setName($name)
{
$this->name=$name;
}
}

/**
* 定义Student类,继承Person类
*/
class Student extends Person
{
private static $count;
private $school;

public function __construct($name, $school)
{
parent::__construct($name);
$this->school=$school;
}

public function setSchool($school)
{
$this->school=school;
}

public getSchool()
{
return $this->school;
}

/* 静态成员函数专门处理静态变量 */
public static function counts()
{
self::$count++;
}

public static function getCount()
{
return self::$count;
}
}

/**
* OOP具体调用
*/
$stu=Student();
echo $stu->getName();

?>

11.2 Magic Methods

类的特殊方法(function)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 对象的构造与析构 */
__construct();
__destruct();

/* 取/置一个不存在的属性 */
__get($name);
__set($name, $value);

/* 调用一个不存在的方法 */
__call();

/* 对象内容转字符串 */
__tostring();

/* 对象的clone方法 */
__clone();

/* 对象的clone使用方法 */
$obj=new Obj;
$obj_cloned=clone $obj;