环境搭建
鉴于我使用的是OSX系统,那么只需要把
/etc/apache2/httpd.conf
下的LoadModule php5_module libexec/apache2/libphp5.so
这一行取消注释,即可使用PHP了可以在自己的
\Library\Webserver\Documents\
下放一个这样的PHP页面检测是否成功,<?php// Show all information, defaults to INFO_ALLphpinfo();?>
如果成功出现PHP相关的信息,则说明PHP启用成功
基础语法
本文建立在你已有
C/C++/Java
等传统语言基础,并且知道数据库是什么的前提之下与
C/C++/Java
完全相同的部分被省去,仅讨论不同部分。首先 PHP 是服务端语言,和
Java
系的 JSP
.NET
系的ASP
对应主要用作动态页面显示,服务端操作等,由于其完全开源免费,所有得到了广泛的应用
位置
所有的php 语句都要包含在下面这样的 类html 标签里面
<?php// PHP code goes here?>
弱类型
和C/C++/Java不同,PHP是弱类型的,它使用
$varible_name
的方式来定义、使用变量。变量作用域
- 普通的全局变量在函数内不可见
- 只有在函数内使用
global
关键字(类似extern
)后才能使用 - 另可使用
GLOBALS['x']
的方式访问全局变量
基础输出
echo
与print
的区别
- 均可打印普通文本、变量、html标签
echo
没有返回值,print
返回1echo
可有多个参数(用逗号隔开)echo
速度稍微快一点
数据
var_dump()
显示数据类型+值
- 未初始化的值默认都是NULL
- 类必须显示声明
- Resource 类型 用于存 PHP外部资源
命名
- 变量大小写敏感
- 函数大小写不敏感
- 常量可以自定义是否大小写敏感,默认敏感
define(name, value, case-insensitive)
运算符
** 指数运算符 PHP 5.6 以后支持
==
!=
<>
仅看值是否相等 如 100 == "100"
===
!==
值和类型都要相等 100 !== "100"
有显式的
and
or
xor
运算符String类有特殊的连接运算符
.
.=
$txt1 .= $txt2 运行后 text2 的内容接到了text1上
if else
elseif
中间不能有空格for
支持
foreach
foreach ($array as $value) {code to be executed;}
数组
三类数组
- 下标数组(默认)
- 关联数组(类似
<map>
) - 多维数组
关联数组语法(含对应
foreach
用法)<?php$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");echo "Peter is " . $age['Peter'] . " years old.";foreach($age as $x => $x_value) {echo "Key=" . $x . ", Value=" . $x_value;echo "<br>";}?>
数组排序
| sort() | 基础升序 |
| ------ | -------- |
| 带r | 降序 |
| 带a | 按值排序 |
| 带k | 按键排序 |
特殊全局变量
-
$GLOBALS
-
$GLOBALS['z']用于直接访问全局变量
-
-
$_SERVER
-
<?phpecho $_SERVER['SERVER_NAME'];echo $_SERVER['HTTP_USER_AGENT'];echo $_SERVER['SCRIPT_NAME'];?>用于存储头文件、路径、脚本文件位置
-
-
$_REQUEST
-
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">Name: <input type="text" name="fname"><input type="submit"></form><?phpif ($_SERVER["REQUEST_METHOD"] == "POST") {// collect value of input field$name = $_REQUEST['fname'];if (empty($name)) {echo "Name is empty";} else {echo $name;}}?>收集HTML表单提交信息
-
-
$_POST
- 收集
post
中的表单信息 - 如
$_POST['fname']
可以获取<form>
中的fname
的值
- 收集
-
$_GET
-
收集
get
中的表单信息 -
<a href="test_get.php?subject=PHP&web=W3schools.com">Test $GET</a>可以通过
$_GET[subject]
获取subject 的值
-
PHP与表单
GET 与 POST的区别
GET
和POST
是两种服务端与客户端通信的方法,分别创建了特殊的关联数组GET
使用URL
参数传值,而POST
使用HTTP标准POST方法传值GET
传递的值对所有人可见,易于加入收藏、二次使用,限长约2000字符POST
传递的信息隐蔽,无限长,更安全一些,不可加入收藏
安全性的保障
有时候用户输入可能是恶意的,因此我们需要使用
**htmlspecialchars()**函数来防止 XSS攻击
总是要记得处理用户输入,主要工作:
- 使用 trim() 去除 无用的字符(空格 tab 换行符)
- 使用 stripslashes() 去掉转移符
\
- 使用htmlspecialchars() 去掉
<>
等会转义为html内容的符号 - 使用preg_match()来匹配正则表达式
进阶PHP
多维数组
$cars = array(array("Volvo",22,18),array("BMW",15,13),array("Saab",5,2),array("Land Rover",17,15));
数组内可有多种不同的类型的数据
Include指令
可以使用
include
或 require
指令来包含一个文件Include
和 require
区别- Include 在找不到文件等错误情况下继续执行php语句
- require则不会
文件处理
readfile() 函数
读取指定文件的内容,如果成功则返回所读取的字节数
文件处理模式
x 模式,仅创建新文件,且创建后只能写,如果同名文件之前已存在则返回
FALSE
文件上传
要进行文件上传,首先需要在
/etc/php.ini/
中增加一行file_uploads = On
文件上传只能使用
POST
模式可通过内置函数控制上传的文件大小、格式等,在此不详述。
Cookies
setcookie() 函数用法
setcookie(name, value, expire, path, domain, secure, httponly);
可以使用
$_COOKIE
来在php中操纵cookies修改 再次使用setcookie();
删除 使用setcookie() 并且把expire 设成过去的某个时间
Session
用于简单的身份认证,直至用户关闭浏览器
可以使用全局比变量
$_SESSION
来操纵Sessionsession_start()函数用法
必须在整个文件中最先出现,比任何html 标记都要先出现
所有的session变量都存储在
$_SESSION
全局变量下使用 session_unset() session_destroy() 来清除session变量 ,终止session
Filters
主要用于验证、处理外部输入
filter_list() 可列出所有支持的Filter
由于外部输入形式各异,必须使用Filter以保证系统安全性
filter_var() 同时验证和处理数据
整数验证时, 注意0要特殊处理,因为0也可被当成bool看待
同理可验证 邮箱 URL IP 等
错误处理
默认的错误处理很基础,仅仅显示错误的文件名+行数+简单的描述
但如果你的错误处理做的不好,可能会导致安全问题
die() 能显示指定的错误消息,并结束php程序
构建自定义错误处理器,语法如下
error_function(error_level,error_message, error_file,error_line,error_context)
第二行的参数为非必需的