php 基础教程
php文件如何在浏览器运行
将php文件放进c:\\wamp64\www
中,在浏览器输入http://localhost/xxx
xxx:文件名即可在浏览器运行php文件
支持三种注释
大小写敏感
- 所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感
- 所有变量都对大小写敏感
变量是存储数据的容器
- 变量以 $ 符号开头,其后是变量的名称
- 变量名称必须以字母或下划线开头
- 变量名称不能以数字开头
- 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
- 变量名称对大小写敏感(Y 是两个不同的变量)
创建变量
- 没有创建变量的命令,变量会在首次为其赋值时被创建
- 如果为变量赋的值是文本,需用引号包围该值
- 变量会被主动转换成正确的数据类型,不必声明
变量作用域
有三种不同的变量作用域:
- local(局部)- 函数内部声明的,只能在函数内部进行访问
- global(全局)- 函数之外声明的,只能在函数以外进行访问
- static(静态)
要在函数内部访问全局变量,要用global
关键词
PHP 同时在名为 $GLOBALS[index]
的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量:
通常,当函数完成/执行后,会删除所有变量。如果不想被删除,需用static
关键词:
- 每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时所包含的信息
- 该变量仍然是函数的局部变量
输出 echo 和 print
- echo - 能够输出一个以上的字符串
- print - 只能输出一个字符串,并始终返回 1
echo
echo
, echo()
均可使用
显示字符串(字符串中能包含HTML标记):
wtf!";
echo "wtttttttf
";
echo "This", " string", " was", " made", " with multiple parameters.";
//输出 This string was made with multiple parameters.
?>
显示变量:
";
echo "My car is a {$cars[0]}";
?>
注意{$cars[0]}
print
print
, print()
均可使用
其他输出与echo无差,但不能输出以下:
print "my", " name"," is"; //非法
数据类型
字符串、整数、浮点数、逻辑、数组、对象、NULL
字符串
单双引号均可
整数
- 整数必须有至少一个数字(0-9)
- 整数不能包含逗号或空格
- 整数不能有小数点
- 整数正负均可
- 可以用三种格式规定整数:十进制、十六进制(前缀是 0x)或八进制(前缀是 0)
var_dump()
会返回变量的数据类型和值
";
$x = 0x8C; // 十六进制数 返回140
var_dump($x);
echo "
";
$x = 047; // 八进制数 返回39
var_dump($x);
?>
浮点数
有小数点或指数形式的数字
";
$x = 8E-5;
var_dump($x); //返回8.0E-5
?>
逻辑
true 或 false
数组
$cars=array("Volvo","BMW","SAAB");
对象
存储数据和有关如何处理数据的信息
php中必须明确地声明对象:
- 首先声明对象的类,用
class
关键词 - 然后在对象类中定义数据类型,再在该类的实例中使用此数据类型
color = $color;
}
function what_color() {
return $this->color;
}
}
?>
NULL
表示变量无值
字符串函数
-
strlen()
函数返回字符串的长度,以字符计(包括空格和标点符号) -
str_word_count()
函数对字符串中的单词进行计数 -
strrev()
函数反转字符串 -
strpos()
函数用于检索字符串内指定的字符或文本,第一位是0。如果未找到匹配,则将返回 FALSE。
echo strpos("Hello world!","world");
-
str_replace()
函数用一些字符串替换字符串中的另一些字符
echo str_replace("world", "Kitty", "Hello world!"); // 输出 Hello Kitty!
PHP String 参考手册
常量
- 常量类似变量,但是常量一旦被定义就无法更改或撤销定义
- 有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)
- 与变量不同,常量贯穿整个脚本是自动全局的,在函数外定义也可以在函数内使用
设置常量
define()
有三个参数:
- 首个参数定义常量的名称
- 第二个参数定义常量的值
- 可选的第三个参数规定常量名是否对大小写不敏感,默认是 false。
false或不写 - 敏感, true - 不敏感
运算符
算术运算符:
+ - * / %
赋值运算符:
= += -= *= /= %=
字符串运算符:
递增/递减运算符:
- ++$x 前递增, $x 加一递增,然后返回 $x
- $x++ 后递增, 返回 $x,然后 $x 加一递增
- --$x 前递减, $x 减一递减,然后返回$x
- $x-- 后递减 , 返回 $x,然后 $x 减一递减
比较运算符:
输出布尔值
除了其他常见的,还有<>
- 不等于
逻辑运算符:
and,oy, xor(异或),&&,||,!
数组运算符:
用于比较数组
联合+
:
$x = array("a" => "apple", "b" => "banana");
$y = array("c" => "orange", "d" => "peach");
print_r($x + $y); // 联合 $x 和 $y,不能用echo
相等 =
:
var_dump($x == $y); //输出bool(false)
全等===
不相等!=
和 <>
不全等!==
if...else...elseif
- if (条件) {
当条件为 true 时执行的代码;
} - if (条件) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
} - if (条件) {
条件为 true 时执行的代码;
} elseif (condition) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
}
Switch
switch (expression)
{
case label1:
expression = label1 时执行的代码 ;
break;
case label2:
expression = label2 时执行的代码 ;
break;
default:
表达式的值不等于 label1 及 label2 时执行的代码;
}
While
- while (条件为真) {
要执行的代码;
} - do {
要执行的代码;
} while (条件为真);
先执行代码块再检查条件,如果条件为真就继续循环。
For
for (init counter; test counter; increment counter) {
code to be executed;
}
Foreach
foreach 循环只适用于数组,并用于遍历数组中的每个键/值对
foreach ($array as $value) {
code to be executed;
}
每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。
$colors = array("red","green","blue","yellow");
foreach ($colors as $value) {
echo "$value
";
}
/* 输出red
green
blue
yellow */
函数
- 用户定义的函数声明以单词
function
开头 - 函数名能够以字母或下划线开头(而非数字)
- 函数名对大小写不敏感
- 可以在括号内部添加多个参数,用逗号隔开
- 默认参数形如
$minheight=50
,如果调用函数时没有写入参数值,则使用默认参数值 - 返回值用
return
function functionName($fname) {
被执行的代码;
}
数组
创建数组:
$cars=array("porsche","BMW","Volvo");
count()
函数用于返回数组的长度(元素数)
关联数组
$age=array("Bill"=>"35","Steve"=>"37","Elon"=>"43");
//或者
$age['Bill']="63";
$age['Steve']="56";
$age['Elon']="47";
// 在脚本中使用指定值
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
echo "Elon is " . $age['Elon'] . " years old.";
遍历关联数组
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
foreach($age as $x=>$x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "
";
}
PHP 数组参考手册
多维数组
数组排序
数组中的元素能够以字母或数字顺序进行升序或降序排序
sort()
- 以升序对数组排序
对于字符,先大写再小写
对于数字,先只有一位,再两位,再...
$cars=array("porsche","BMW","Volvo","Ass","ass");
sort($cars);
$clength=count($cars);
for($x=0;$x<$clength;$x++)
{
echo $cars[$x];
echo "
";
} //输出结果:Ass BMW Volvo ass porsche(一个一行)
rsort()
- 以降序对数组排序
与上面的相反
先小写再大写、先位数高的再只有一位的
asort()
- 根据值对数组进行升序排序
ksort()
- 根据键对数组进行升序排序
arsort()
- 根据值对数组进行降序排序
krsort()
- 根据键对数组进行降序排序
超全局
超全局意味着在一个脚本的全部作用域中都可用
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
$GLOBALS
- 引用全局作用域中可用的全部变量
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。
$x = 30;
$y = 65;
function addition() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z; //由于 z 是 $GLOBALS 数组中的变量,因此在函数之外也可以访问它
$_SERVER
- 保存关于报头、路径和脚本位置的信息
$_REQUEST
- 用于收集 HTML 表单提交的数据
当用户通过点击提交按钮来提交表单数据时, 表单数据将发送到 标签的
action
属性中指定的脚本文件,使用超级全局变量 $_REQUEST
来收集 input
字段的值:
$_POST
- 广泛用于收集提交 method="post"
的 HTML 表单后的表单数据,也常用于传递变量
$_GET
- 用于收集提交 HTML 表单 (method="get") 之后的表单数据, 也可以收集 URL 中的发送的数据
测试 $GET
当点击链接 "测试 $GET",参数 "subject" 和 "web" 被发送到 "test_get.php",然后就能够通过 $_GET 在 "test_get.php" 中访问这些值了。
php 表单
表单处理
$_GET 和 $_POST 用于收集表单数据
当用户填写此表单并点击提交按钮后,表单数据会发送到名为 "welcome.php" 的 PHP 文件供处理。表单数据是通过 HTTP POST 方法发送的。
如需显示出被提交的数据,您可以简单地输出(echo)所有变量。"welcome.php" 文件是这样的:
Welcome
Your email address is:
表单验证
验证规则:
- Name 必需 必须包含字母和空格。
- E-mail 必需 必须包含有效的电子邮件地址(包含 @ 和 .)。
- Website 可选 如果选填,则必须包含有效的 URL。
- Comment 可选。多行输入字段(文本框)。
- Gender 必需 必须选择一项。
Name:
E-mail:
Website:
Comment:
Gender:
Female
Male
表单元素
当提交此表单时,通过 method="post" 发送表单数据
htmlspecialchars()
函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 <
和 >
。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。
验证函数
*(通过 PHP trim() 函数)去除用户输入数据中不必要的字符(多余的空格、制表符、换行)
*(通过 PHP stripslashes() 函数)删除用户输入数据中的反斜杠(\)
表单必填
显示错误消息
表单URL/email
验证名字
$name = test_input($_POST["name"]);
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允许字母和空格!";
}
验证email
$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "无效的 email 格式!";
}
验证URL
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%
=~_|]/i",$website)) {
$websiteErr = "无效的 URL";
}
表单完成 - 保留表单中的值
Name:
E-mail:
Website:
Comment:
Gender:
value="female">Female
value="male">Male
php高级教程
二维数组
$cars = array
(
array("Volvo",22,18),
array("BMW",15,13),
array("Saab",5,2),
array("Land Rover",17,15)
);
用两个索引访问
使用For循环来遍历元素:
for ($row = 0; $row < 4; $row++) {
for ($col = 0; $col < 3; $col++) {
echo $cars[$row][$col];
echo "
";
}
}
日期
date(format,timestamp)
- format 必需。规定时间戳的格式。
- timestamp 可选。规定时间戳。默认是当前时间和日期。
- d - 表示月里的某天(01-31)
m - 表示月(01-12)
Y - 表示年(四位数)
1 - 表示周里的某天
echo "今天是 " . date("Y-m-d") . "
";
echo "今天是 " . date("l");
获得简单时间
h - 带有首位零的 12 小时小时格式
i - 带有首位零的分钟
s - 带有首位零的秒(00 -59)
a - 小写的午前和午后(am 或 pm)
echo "现在时间是 " . date("h:i:sa");
获得时区
date_default_timezone_set("Asia/Shanghai");
echo "当前时间是 " . date("h:i:sa");
创建日期
mktime()
函数返回日期的 Unix 时间戳
mktime(hour,minute,second,month,day,year)
$d=mktime(9, 12, 31, 6, 10, 2015);
echo "创建日期是 " . date("Y-m-d h:i:sa", $d);
strtotime()
函数用于把人类可读的字符串转换为 Unix 时间
$d=strtotime("10:38pm April 15 2015");
echo "创建日期是 " . date("Y-m-d h:i:sa", $d);
PHP 日期参考手册
**include, require **
可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)
- require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
- include 只生成警告(E_WARNING),并且脚本会继续
include
"footer.php" 文件:
Copyright © 2006-" . date("Y") . " W3School.com.cn";
?>
如需在一张页面中引用这个页脚文件,使用 include 语句:
欢迎访问首页
可以用div
元素,这样可以通过CSS设置样式:
假设 "vars.php" 文件中定义了一些变量:
引用这个 "vars.php" 文件,就可以在调用文件中使用这些变量:
如果使用 require 语句完成相同的案例,echo 语句不会继续执行,因为在 require 语句返回严重错误之后脚本就会终止执行。
文件
readfile() - 读取文件,并把它写入输出缓冲
"webdictionary.txt" 文本文件存放在服务器上:
AJAX = Asynchronous JavaScript and XML
CSS = Cascading Style Sheets
HTML = Hyper Text Markup Language
PHP = PHP Hypertext Preprocessor
SQL = Structured Query Language
SVG = Scalable Vector Graphics
XML = EXtensible Markup Language
读取此文件并写到输出流的 PHP 代码如下(如读取成功则 readfile() 函数返回字节数):
输出:
AJAX = Asynchronous JavaScript and XML CSS = Cascading Style Sheets HTML = Hyper Text Markup Language PHP = PHP Hypertext Preprocessor SQL = Structured Query Language SVG = Scalable Vector Graphics XML = EXtensible Markup Language236
PHP Filesystem 参考手册
文件打开/读取/关闭
fopen() - 打开文件
第一个参数包含被打开的文件名,第二个参数规定打开文件的模式:
r 打开文件为只读。文件指针在文件的开头开始。
w 打开文件为只写。删除文件的内容或创建一个新的文件,如果它不存在。文件指针在文件的开头开始。
a 打开文件为只写。文件中的现有数据会被保留。文件指针在文件结尾开始。创建新的文件,如果文件不存在。
x 创建新文件为只写。返回 FALSE 和错误,如果文件已存在。
r+ 打开文件为读/写、文件指针在文件开头开始。
w+ 打开文件为读/写。删除文件内容或创建新文件,如果它不存在。文件指针在文件开头开始。
a+ 打开文件为读/写。文件中已有的数据会被保留。文件指针在文件结尾开始。创建新文件,如果它不存在。
x+ 创建新文件为读/写。返回 FALSE 和错误,如果文件已存在。
fread() 函数读取打开的文件
第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。
如下 PHP 代码把 "webdictionary.txt" 文件读至结尾:
fread($myfile,filesize("webdictionary.txt"));
fclose() 函数用于关闭打开的文件
fgets() 函数用于从文件读取单行
下例输出 "webdictionary.txt" 文件的首行:
调用 fgets() 函数之后,文件指针会移动到下一行
feof() 函数检查是否已到达 "end-of-file" (EOF)
";
}
fclose($myfile);
?>
fgetc() 函数用于从文件中读取单个字符
文件创建/写入
fopen() 函数也用于创建文件
创建名为 "testfile.txt" 的新文件。此文件将被创建于 PHP 代码所在的相同目录中:
$myfile = fopen("testfile.txt", "w");
fwrite() 函数用于写入文件
第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串
文件上传
创建一个文件上传表单
标签的
enctype
属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,使用 multipart/form-data
。
创建上传脚本
0)
{
echo "Error: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "
";
echo "Type: " . $_FILES["file"]["type"] . "
";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
}
?>
通过使用 PHP 的全局数组 $_FILES
,可以从客户计算机向远程服务器上传文件。
-
$_FILES["file"]["name"]
- 被上传文件的名称 -
$_FILES["file"]["type"]
- 被上传文件的类型
给文件上传增加限制
// 用户只能上传 .gif 或 .jpeg 文件,文件大小必须小于 20 kb
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
Cookies
cookie 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
setcookie() - 创建cookies,必须位于 标签之前
setcookie(name, value, expire, path, domain);
创建名为 "user" 的 cookie,把为它赋值 "Alex Porter"。也规定此 cookie 在一小时后过期:
$_COOKIE 变量用于取回 cookie 的值
使用 isset() 函数来确认是否已设置了 cookie:
";
else
echo "Welcome guest!
";
?>
删除 cookie - 使过期日期变更为过去的时间点
session
session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
工作机制:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
开始 PHP Session
session_start() 函数必须位于 标签之前:
存储 Session 变量 - 使用 $_SESSION
变量
isset()
函数检测是否已设置 "views" 变量。如果已设置 "views" 变量,累加计数器。如果 "views" 不存在,则创建 "views" 变量并把它设置为 1:
终结 Session
unset()
函数用于释放指定的 session 变量:
也可以通过 session_destroy()
函数重置 session,将失去所有已存储的 session 数据:
error
die() - 基本的错误处理
创建自定义错误处理器
- error_level 必需。为用户定义的错误规定错误报告级别。必须是一个值数。
- error_message 必需。为用户定义的错误规定错误消息。
- error_file 可选。规定错误在其中发生的文件名。
- error_line 可选。规定错误发生的行号。
- error_context 可选。规定一个数组,包含了当错误发生时在用的每个变量以及它们的值。
Error: [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
trigger_error() - 触发错误
1)
{
trigger_error("Value must be 1 or below");
}
?>
错误记录
默认根据在 php.ini 中的 error_log
配置,PHP 向服务器的错误记录系统或文件发送错误记录。使用 error_log()
函数,可以向指定的文件或远程目的地发送错误记录。
通过email发送错误信息:
function customError($errno, $errstr)
{
echo "Error: [$errno] $errstr
";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"[email protected]","From: [email protected]");
}
异常(Exception) - 用于在指定的错误发生时改变脚本的正常流程
正确的处理程序应当包括:
- Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
- Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
- Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象
1)
{
throw new Exception("Value must be 1 or below");
}
return true;
}
//在 "try" 代码块中触发异常
try
{
checkNum(2);
//If the exception is thrown, this text will not be shown
echo 'If you see this, the number is 1 or below';
}
//捕获异常
catch(Exception $e)
{
echo 'Message: ' .$e->getMessage();
}
?>
创建一个自定义的 Exception 类
getLine().' in '.$this->getFile()
.': '.$this->getMessage().' is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
}
catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}
?>
多个异常
getLine().' in '.$this->getFile()
.': '.$this->getMessage().' is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "[email protected]";
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
//check for "example" in mail address
if(strpos($email, "example") !== FALSE)
{
throw new Exception("$email is an example e-mail");
}
}
catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>