PHP语言简介:
CLI:(Command-Line Interface)与Linux Shell语言类似,作为后台可执行脚本的解决方案,用于后台脚本编程。
mod_php或fastCGI:用于网络应用编程,开发网站或者互联网应用,被称为网络(Web)脚本模式,LAMP:Linux Apache MySQL PHP/Perl/Python
规范:
PHP代码部分需要用<?php ...?>括号框起来,类似于ASP或者JSP,实际开发中可以把“?>”去掉。
注释:
单行:“//”或者“#”,多行:“/* ... */”
变量:
所有变量以”$“符号开始,变量命名与C++和java相同,PHP是弱类型语言不需要声明变量类型
常量:
使用define函数定义,类似于C和C++语言,变量名一般使用全大写字母
函数:
比如:”function hello(){ ... }“
<html> <body> <?php function add($x,$y) { $total = $x + $y; return $total; } echo "1 + 16 = " . add(1,16); ?> </body> </html>
类定义:
和Java基本类似,比如”public class User{ ... }“
包含文件:
require和clude方法包含,避免重复包含使用require_once和include_once方法
"menu.php": echo '<a href="/default.php">Home</a> <a href="/tutorials.php">Tutorials</a> <a href="/references.php">References</a> <a href="/examples.php">Examples</a> <a href="/about.php">About Us</a> <a href="/contact.php">Contact Us</a>';
<html> <body> <div class="leftmenu"> <?php include 'menu.php'; ?> </div> <h1>Welcome to my home page.</h1> <p>Some text.</p> </body> </html>
命名空间:
比如:"namespace Core/Lib1"
预定义变量:
PHP提供大量预定义变量(预定义数组变量),用于存储来自服务器,运行环境和输入数据等动态信息,不同于其他语言对应的使用类包或者方法来获取的方式(如JAVA使用request.getParameter()方法,PHP会直接把所有的GET参数全部放到预定变量$_GET中)。
$GLOBALS | — | 引用全局作用域中可用的全部变量 |
$_SERVER | WEB | 服务器和执行环境信息 |
$_GET | WEB | HTTP GET变量 |
$_POST | WEB | HTTP POST变量 |
$_FILES | WEB | HTTP文件上传变量 |
$_COOKIE | WEB | HTTP Cookie |
$_SESSION | WEB | Session变量 |
$_REQUEST | WEB | HTTP Request 变量(包含了 $_GET, $_POST 以及 $_COOKIE 的内容。) |
$_ENV | — | 系统环境变量 |
$http_reponse_header | WEB | HTTP响应头 |
$argc | CLI | 传递给脚本的参数数目 |
$argv | CLI | 传递给脚本的参数数组 |
非 类型:PHP中null,false,0,空字符串,空数组之间可以画等号,也可以用===区别判断区别。
null | 当变量未被赋值,则为null |
0 | 整型数值 |
false | 布尔类型 |
空字符串 | 字符串' '和” “ |
空数组 | 空数组Array() |
魔术变量:(主要方便开发者调试PHP代码,魔术变量前后都有两个下划线)
__LINE__:返回文件中的当前行号
__FILE__:返回当前文件的完整路径和文件名
__DIR__:返回当前文件所在的目录
__FUNCTION__:返回当前函数的名称
__CLASS__:返回当前类的名称
__METHOD__:返回当前类的方法名
__NAMESPACE__:返回当前命名空间名
魔术方法:(主要解决PHP面向对象思想所遇到到的一些特殊情况,使用两个下划线开头)
__construct():通用的类构造函数
__destruct():通用的类析构造函数
__get(string $name):当试图读取一个并不存在的类属性时被调用
__set(string $name,mixed $value):给未定义的类变量赋值时被调用
__call(string $name,array $arguments):当调用一个不可访问类方法(如未定义或不可见)时,__call()被调用
__callStatic(string $name,array $arguments):当调用一个不可访问的静态方法时,__callStatic()方法会被调用
__toString():当打印一个类对象时被调用,这个方法类似与Java的toString 方法
__clone():当类对象被克隆时被调用
__sleep():持久话一个类对象时,如果__sleep()存在则先被调用,然后才执行序列化操作。这个功能可以用于清理对象,比如你有一些很大的对象,比如你有一些很大的对象
不需要持久化。
__wakeup():与__sleep()相反,在反持久化对象时,如果存在__wakeup()方法,则使用该方法预先准备对象数据。__wakeup()可用在类似于重新建立数据库连接等初始化操
作中。
__isset():当对未定义的类变量调用isset()或empty()时,__isset()会被调用
__unset():unset()一个对象的属性时被调用。如unset($class->name)
__invoke():当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用。
__autoload():区别于以上所有方法,并非是一个类方法,而是一个全局方法。在实例化一个对象时,如果对应的类不存在,则该方法被调用,可用于类的自动加载。
注意:所有的魔术方法都需要给予public属性。
数组:
有三种数组类型:
数值数组(创建方式以及使用)
$names = array("Peter","Quagmire","Joe");
$names[0] = "Peter"; $names[1] = "Quagmire"; $names[2] = "Joe";
<?php $names[0] = "Peter"; $names[1] = "Quagmire"; $names[2] = "Joe"; echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors"; ?>
关联数组(创建方式以及使用)
$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);
$ages['Peter'] = "32"; $ages['Quagmire'] = "30"; $ages['Joe'] = "34";
<?php $ages['Peter'] = "32"; $ages['Quagmire'] = "30"; $ages['Joe'] = "34"; echo "Peter is " . $ages['Peter'] . " years old."; ?>
多维数组
$families = array ( "Griffin"=>array ( "Peter", "Lois", "Megan" ), "Quagmire"=>array ( "Glenn" ), "Brown"=>array ( "Cleveland", "Loretta", "Junior" ) );
echo "Is " . $families['Griffin'][2] . " a part of the Griffin family?";
foreach 语句用于循环遍历数组。
每进行一次循环,当前数组元素的值就会被赋值给 value 变量(数组指针会逐一地移动) - 以此类推。
<html> <body> <?php $arr=array("one", "two", "three"); foreach ($arr as $value) { echo "Value: " . $value . "<br />"; } ?> </body> </html>
Date() 函数:date(format,timestamp)可把时间戳格式化为可读性更好的日期和时间。
<?php echo date("Y/m/d"); echo "<br />"; echo date("Y.m.d"); echo "<br />"; echo date("Y-m-d"); ?>mktime() 函数可为指定的日期返回 Unix 时间戳。
<?php $tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y")); echo "明天是 ".date("Y/m/d", $tomorrow); ?>
检测 End-of-file
if (feof($file)) echo "End of file";
<?php $file = fopen("welcome.txt", "r") or exit("Unable to open file!"); //Output a line of the file until the end is reached while(!feof($file)) { echo fgets($file). "<br />"; } fclose($file); ?>
<?php $file=fopen("welcome.txt","r") or exit("Unable to open file!"); while (!feof($file)) { echo fgetc($file); } fclose($file); ?>
<?php 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 常用于识别用户。cookie 是服务器留在用户计算机中的小文件。每当相同的计算机通过浏览器请求页面时,它同时会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
<?php setcookie("user", "Alex Porter", time()+3600); ?> <html> <body> </body> </html>注释:setcookie() 函数必须位于 <html> 标签之前。
取回 Cookie 的值:
<html> <body> <?php if (isset($_COOKIE["user"])) echo "Welcome " . $_COOKIE["user"] . "!<br />"; else echo "Welcome guest!<br />"; ?> </body> </html>删除 cookie:
<?php // set the expiration date to one hour ago setcookie("user", "", time()-3600); ?>不支持 cookie:
一种方式是从表单传递数据(POST)
PHP Sessions:
PHP session 变量用于存储有关用户会话的信息,或更改用户会话的设置。Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
当您运行一个应用程序时,您会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态。
通过在服务器上存储用户信息以便随后使用,PHP session 解决了这个问题(比如用户名称、购买商品等)。不过,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久储存信息,可以把数据存储在数据库中。
Session 的工作机制是:为每个访问者创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,亦或通过 URL 进行传导。
开始 PHP Session
存储 Session 变量
<?php session_start(); // store session data $_SESSION['views']=1; ?> <html> <body> <?php //retrieve session data echo "Pageviews=". $_SESSION['views']; ?> </body> </html>
终结 Session
unset() 函数用于释放指定的 session 变量:
<?php unset($_SESSION['views']); ?>您也可以通过 session_destroy() 函数彻底终结 session:(您将失去所有已存储的 session 数据。)
<?php session_destroy(); ?>
<html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail( "[email protected]", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //if "email" is not filled out, display the form { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
<html> <body> <?php function spamcheck($field) { //filter_var() sanitizes the e-mail //address using FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validates the e-mail //address using FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) {//if "email" is filled out, proceed //check if the email address is invalid $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Invalid input"; } else {//send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("[email protected]", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else {//if "email" is not filled out, display the form echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
简单的 "die()" 语句:
<?php if(!file_exists("welcome.txt")) { die("File not found"); } else { $file=fopen("welcome.txt","r"); } ?>自定义错误和错误触发器:
function customError($errno, $errstr) { echo "<b>Error:</b> [$errno] $errstr<br />"; echo "Ending Script"; die(); }
<?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); ?>
<?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 //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, "[email protected]","From: [email protected]"); } //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 异常处理:
什么是异常?
PHP 5 提供了一种新的面向对象的错误处理方法。
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
当前代码状态被保存
代码执行被切换到预定义的异常处理器函数
根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本
异常的基本使用:
创建自定义的异常处理器:
<?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 = "[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();
}
?>
重新抛出异常:
如果在其目前的 "try" 代码块中异常没有被捕获,则它将在更高层级上查找 catch 代码块。
设置顶层异常处理器:
set_exception_handler() 函数可设置处理所有未捕获异常的用户定义函数。
<?php
function myException($exception)
{
echo "<b>Exception:</b> " , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>
简而言之:如果抛出了异常,就必须捕获它。
PHP 过滤器(Filter):
如需过滤变量,请使用下面的过滤器函数之一:
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");
}
?>