PHP learning

环境搭建
鉴于我使用的是OSX系统,那么只需要把/etc/apache2/httpd.conf下的LoadModule php5_module libexec/apache2/libphp5.so这一行取消注释,即可使用PHP了
可以在自己的\Library\Webserver\Documents\下放一个这样的PHP页面检测是否成功,
<?php // Show all information, defaults to INFO_ALL phpinfo(); ?>
如果成功出现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返回1 -
echo可有多个参数(用逗号隔开) -
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
- ```php
<?php
echo $_SERVER['SERVER_NAME'];
echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['SCRIPT_NAME'];
?>
用于存储头文件、路径、脚本文件位置
-
$_REQUEST
-
Name:
收集HTML表单提交信息
- $_POST
- 收集`post`中的表单信息
- 如`$_POST['fname']`可以获取`<form>`中的`fname`的值
- $_GET
- 收集`get`中的表单信息
- ```php
<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来操纵Session
session_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)
第二行的参数为非必需的