PHP 教程
基本尝试
-
PHP 脚本以 结尾
-
PHP 文件的默认文件扩展名是 ".php"。
-
PHP 语句以分号结尾(;)
-
PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数。
-
PHP注释, 支持
//
,#
,/* */
常量
常量是单个值的标识符(名称)。在脚本中无法改变该值。
define("GREETING", "Welcome to W3School.com.cn!");
echo GREETING;
- 如需设置常量,请使用 define() 函数 - 它使用三个参数:
- 首个参数定义常量的名称
- 第二个参数定义常量的值
- 可选的第三个参数规定常量名是否对大小写敏感。默认是 false。
变量
-
大小写
在 PHP 中,所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感。不过在 PHP 中,所有变量都对大小写敏感。 -
定义变量
PHP 没有创建变量的命令。变量会在首次为其赋值时被创建。
<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>
-
PHP 变量规则:
a. 变量以 $ 符号开头,其后是变量的名称
a. 变量名称必须以字母或下划线开头
a. 变量名称不能以数字开头
a. 变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _)
a. 变量名称对大小写敏感($y 与 $Y 是两个不同的变量)
a. 不必告知 PHP 变量的数据类型, PHP 根据它的值,自动把变量转换为正确的数据类型
a. PHP 是一门类型松散的语言 -
作用域
a. local(局部)- 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
1. global 关键字可以将局部变量变为全部变量global $x,$y;
a. global(全局)- 函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
a. static(静态)- 函数中定义的静态变量在第一次调用后就一直存在,不会像局部变量一个样在执行完后删除。 -
$GLOBALS数组
PHP 同时在名为 $GLOBALS[indexName] 的数组中存储了所有的全局变量。可以通过这个数组直接操作全部变量。$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
-
检测变量类型
$x = 10.365;
var_dump($x);
数据类型
-
整型,浮点型,字符串,布尔,null
-
PHP NULL 值,特殊的 NULL 值表示变量无值。
NULL 值标示变量是否为空。也用于区分空字符串与空值数据库。可以通过把值设置为 NULL,将变量清空 -
数组
$cars=array("Volvo","BMW","SAAB");
var_dump($cars);
字符串
PHP的字符串函数太全面了,查找、转换、加密、格式
-
支持单引号或双引号
-
字符串拼接使用的不是
+
,而是.
:echo "Stored in: " . "upload/";
-
字符串中的变量名在echo时直接转换为其值
-
strlen() - 字符串长度
strlen("Hello world!");
-
strpos() - 查找索引位置
echo strpos("Hello world!","world");
-
substr() - 字符串截取
echo substr("Hello world",6,3); //wor
-
str_split() - 把字符串分割到数组中。
-
join() - implode() 的别名。返回由数组元素组合成的字符串。
-
str_replace() - 替换字符串中的一些字符(对大小写敏感)。
-
str_repeat() - 把字符串重复指定的次数。
输出DOM
-
输出方法 echo 和 print
- echo - 能够输出一个以上的字符串
- print - 只能输出一个字符串,并始终返回 1
- 提示:echo 比 print 稍快,因为它不返回任何值。
- echo/print 是一个语言结构,有无括号均可使用:echo 或 echo() / print 或 print()
-
echo/print 命令来显示字符串和变量:
$txt1="Learn PHP";
$txt2="W3School.com.cn";
$cars=array("Volvo","BMW","SAAB");
echo $txt1;
//
echo "Study PHP at $txt2";
echo "My car is a {$cars[0]}";
$txt1="Learn PHP";
$txt2="W3School.com.cn";
$cars=array("Volvo","BMW","SAAB");
print $txt1;
//
print "Study PHP at $txt2";
print "My car is a {$cars[0]}";
PHP class
- class的定义,函数的定义,默认参数的设定,操作对象属性
class Car
{
var $color;
function Car($color="green", $name) {
$this->color = $color;
echo $name;
}
function what_color() {
return $this->color;
}
}
PHP 逻辑运算符 - 支持两套,也是醉了啊
数组操作
-
PHP 数组运算符
-
数组定义
$cars=array("Volvo","BMW","SAAB");
-
在 PHP 中,有三种数组类型:
- 索引数组 - 带有数字索引的数组 -
$cars=array("Volvo","BMW","SAAB");$cars[0]="Volvo";
- 关联数组 - 带有指定键的数组 -
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");$age['Peter']="35";
- 多维数组 - 包含一个或多个数组的数组
- 索引数组 - 带有数字索引的数组 -
-
数组长度
echo count($cars);
-
数组遍历
$cars=array("Volvo","BMW","SAAB");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++) {
echo $cars[$x];
}
$age=array("Bill"=>"35","Steve"=>"37","Peter"=>"43");
foreach($age as $x=>$x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
}
- 数组独有的foreach循环
$colors = array("red","green","blue","yellow");
foreach ($colors as $value) {
echo 123;
}
- 数组排序
- 升序 -
sort($cars);
- 降序 -
rsort($cars);
- 值升序 -
asort($age);
- 值降序 -
arsort($age);
- 键升序 -
ksort($age);
- 键降序 -
krsort($age);
- 升序 -
系统变量 - PHP 全局变量 - 超全局变量
- $GLOBALS - 全局变量的关联数组
- $_SERVER - 保存关于报头、路径和脚本位置的信息的关联数组。
- $_REQUEST - 请求表单input信息,
$_REQUEST['fname']
- $_POST - post请求的数据
- $_GET - post请求的数据
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
常用特殊函数
-
htmlspecialchars() 函数 - 将特殊字符转码
htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)对代码进行利用。<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
-
stripslashes() 函数)删除字符串中的反斜杠()
-
empty() 检查是否为空
-
preg_match("/[1]*$/",$name) - 正则式匹配
日期+时间
-
date(format,[timestamp])
- format必需。规定时间戳的格式。
- timestamp 可选。规定时间戳。默认是当前时间和日期。
-
format形式
- d - 表示月里的某天(01-31)
- m - 表示月(01-12)
- Y - 表示年(四位数)
- 1 - 表示周里的某天
- h - 带有首位零的 12 小时小时格式
- i - 带有首位零的分钟
- s - 带有首位零的秒(00 -59)
- a - 小写的午前和午后(am 或 pm)
-
实例
echo "今天是 " . date("Y/m/d");
echo "今天是 " . date("Y.m.d");
echo "今天是 " . date("Y-m-d");
echo "今天是 " . date("l");
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);
-
Unix 时间戳包含 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)与指定时间之间的秒数。
-
strtotime() 用字符串来创建日期的Unix 时间戳
strtotime(time,now)
$d=strtotime("10:38pm April 15 2015");
echo "创建日期是 " . date("Y-m-d h:i:sa", $d);
include 和 require
通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。包含文件省去了大量的工作。这意味着您可以为所有页面创建函数、标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
include 和 require 语句是相同的,除了错误处理方面:
1. require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
1. include 只生成警告(E_WARNING),并且脚本会继续
语法:
include 'filename';
require 'filename';
文件操作
-
文件读写模式对照表
-
fopen() - 函数为您提供比 readfile() 函数更多的选项。fopen() 函数也用于创建文件。
-
fread() 函数读取打开的文件。第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数。
-
fclose() 函数用于关闭打开的文件。
-
fgets() 函数用于从文件读取单行。
-
fgetc() 函数用于从文件中读取单个字符。
-
feof() 函数检查是否已到达 "end-of-file" (EOF)。
$myfile = fopen("webdictionary.txt", "r") or die("Unable to open file!");
// 输出单字符直到 end-of-file
while(!feof($myfile)) {
echo fgetc($myfile);
}
fclose($myfile);
-
fwrite() 函数用于写入文件。第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串。
-
默认的fwrite会覆盖原有的内容
文件上传
利用全局数组 $_FILES获取提交的文件对象
-
$_FILES对象的属性
- $_FILES["filename"]["name"] - 被上传文件的名称
- $_FILES["filename"]["type"] - 被上传文件的类型
- $_FILES["filename"]["size"] - 被上传文件的大小,以字节计
- $_FILES["filename"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
- $_FILES["filename"]["error"] - 由文件上传导致的错误代码
-
上传实例代码
//对于 IE,识别 jpg 文件的类型必须是 pjpeg,对于 FireFox,必须是 jpeg。
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 20000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br />";
//
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " already exists. ";
}
else
{
move_uploaded_file($_FILES["file"]["tmp_name"],
"upload/" . $_FILES["file"]["name"]);
echo "Stored in: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "Invalid file";
}
cookie
- setcookie() 函数用于设置 cookie。
注释:setcookie() 函数必须位于 标签之前。
格式:setcookie(name, value, expire, path, domain);
<?php
setcookie("user", "Alex Porter", time()+3600);
?>
<html>
<body>
</body>
</html>
注释:在发送 cookie 时,cookie 的值会自动进行 URL 编码,在取回时进行自动解码(为防止 URL 编码,请使用 setrawcookie() 取而代之)。
- 服务端读取cookie - $_COOKIE
<html>
<body>
<?php
//使用 isset() 函数来确认是否已设置了 cookie
if (isset($_COOKIE["user"]))
echo "Welcome " . $_COOKIE["user"] . "!<br />";
else
echo "Welcome guest!<br />";
?>
</body>
</html>
- 删除cookie - 当删除 cookie 时,您应当使过期日期变更为过去的时间点。
<?php
// set the expiration date to one hour ago
setcookie("user", "", time()-3600);
?>
Sessions
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
- 启动session - session_start() 函数必须位于 标签之前
<?php session_start(); ?>
<html>
<body>
</body>
</html>
- session存取 - $_SESSION
//访问计数器
<?php
session_start();
if(isset($_SESSION['views']))
$_SESSION['views']=$_SESSION['views']+1;
else
$_SESSION['views']=1;
echo "Views=". $_SESSION['views'];
?>
- 清除session - unset() 或 session_destroy() 函数。
- unset() 函数用于释放指定的 session 变量 -
unset($_SESSION['views']);
- session_destroy() 将重置 session,您将失去所有已存储的 session 数据 -
session_destroy();
- unset() 函数用于释放指定的 session 变量 -
错误处理
三种不同的错误处理方法:
- 简单的 "die($msg)" 语句 - 返回错误消息并终止脚本
<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
- 自定义错误和错误触发器
格式:error_function(error_level,error_message,error_file,error_line,error_context)
错误报告级别
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
- 修改默认的错误处理函数 -
set_error_handler("customError");
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
//set error handler
set_error_handler("customError");
//trigger error
echo($test);
?>
- 触发错误 - ``trigger_error($msg,[$level]);`
可能的错误类型:
a. E_USER_ERROR - 致命的用户生成的 run-time 错误。错误无法恢复。脚本执行被中断。
a. E_USER_WARNING - 非致命的用户生成的 run-time 警告。脚本执行不被中断。
a. E_USER_NOTICE - 默认。用户生成的 run-time 通知。脚本发现了可能的错误,也有可能在脚本运行正常时发生。
<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
- 错误记录和报告
默认地,根据在 php.ini 中的 error_log 配置,PHP 向服务器的错误记录系统或文件发送错误记录。通过使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录。通过电子邮件向您自己发送错误消息,是一种获得指定错误的通知的好办法。
<?php
//通过 E-Mail 发送错误消息
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"someone@example.com","From: webmaster@example.com");
}
//set error handler
set_error_handler("customError",E_USER_WARNING);
//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>
异常处理
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "catch" 代码块。
如果异常没有被捕获,而且又没用使用 set_exception_handler() 作相应的处理的话,那么将发生一个严重的错误(致命错误),并且输出 "Uncaught Exception" (未捕获异常)的错误消息。
- 异常处理实例
<?php
//创建可抛出一个异常的函数
function checkNum($number)
{
if($number>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();
}
?>
- 自定义异常
<?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
.': <b>'.$this->getMessage().'</b> is not a valid E-Mail address';
return $errorMsg;
}
}
$email = "someone@example...com";
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();
}
?>
- 设置顶层异常处理器 (Top Level Exception Handler) - set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
过滤器(Filter)
PHP 过滤器用于验证和过滤来自非安全来源的数据。验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。设计 PHP 的过滤器扩展的目的是使数据过滤更轻松快捷。
-
函数和过滤器
如需过滤变量,请使用下面的过滤器函数之一:- filter_var() - 通过一个指定的过滤器来过滤单一的变量
- filter_var_array() - 通过相同的或不同的过滤器来过滤多个变量
- filter_input - 获取一个输入变量,并对它进行过滤
- filter_input_array - 获取多个输入变量,并通过相同的或不同的过滤器对它们进行过滤
-
验证整型的实例
<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
{
echo("Integer is not valid");
}
else
{
echo("Integer is valid");
}
?>
a-zA-Z ↩︎