PHP
2016年2月20日
1 目标:服务器端脚本程序,类似JSP。
2 原理:解析脚本(PHP+HTML),由Web服务器执行后生成纯HTML。脚本以C为基础,修改为接近JavaScript的格式。
3 流程:安装Web服务器Apache,安装PHP,配置Apache使用PHP模块,创建PHP页面,发布,测试。
参考:http://windows.php.net/download#php-5.6-ts-VC11-x64
http://www.jb51.net/article/53787.htm
http://www.th7.cn/Program/php/201410/305828.shtml
3.1 安装Web服务器Apache:
3.1.1下载Apache(ApacheLounge下载)Win64-VC14版(如果没有安装vc14运行时文件,需要先到ms官网下载)。
安装VC14运行时:AppacheLounge 2.4是基于VC14Update1编译的,可以从官网下载安装文件。
安装Apache:下载完成后解压,按照ReadMe.txt步骤安装。解压到C:/Apache24。
3.1.2启动Apache服务器:httpd.exe。
从命令行打开httpd.exe。
3.1.3测试:http://localhost ,显示It works!则成功。
3.2 安装PHP:下载PHP,创建配置
3.2.1下载PHP:要与Apache的版本相一致,这里使用PHP7的vc14-X64,ThreadSafe版(Apache必须使用ThreadSafe版本)。
3.2.2创建配置文件:将php.ini-development复制一份,改名为php.ini。
3.3 配置Apache,使用PHP模块:
在Apache的conf目录中修改httpd.conf,在文档结尾处添加PHP模块支持。
注意:如果安装目录中无php7apache2_4.dll,这是版本问题,只有线程安全的版本中才有这个文件。
# php7 support
LoadModulephp7_module D:/ProgramData/php-7.0.3-Win32-VC14-x64/php7apache2_4.dll
AddTypeapplication/x-httpd-php .php .html .htm
# configurethepath to php.ini
PHPIniDir"D:/ProgramData/php-7.0.3-Win32-VC14-x64"
3.4 发布Web页面
3.4.1创建PHP页面
//index.php
<!DOCTYPE HTMLPUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
echo "Hello World,PHP7!"
?>
</body>
</html>
3.4.2发布:将php页面copy到apache的web目录htdocs。
3.4.3测试:http://localhost/index.php
4 方法:PHP
PHP:personal home page,个人主页,目标是简单的服务器程序。后改名,不断加入强大功能。
参考:
5 语法
参考:http://www.w3school.com.cn/php
5.1 基本语法
5.1.1文件名后缀:以.php为后缀。
5.1.2标签:<?php 脚本 ?>。
5.1.3注释:单行//,单行#,多行/* */。
5.1.4关键字、类、函数等大小写不敏感,变量大小写敏感。
5.1.5语句结尾:以分号结尾。
5.1.6变量名:以$标识,不声明类型,变量名规则同C。
5.1.7变量作用域:默认情况下,函数内为local,外部为globle。在函数内可以使用global声明为全局。static声明为静态。
5.1.8输出:echo()或print()。
括号可以省略,区别在于echo只输出,速度快,可以指定多个string。print始终返回1,只能指定一个string。
注意:在“”内也会将$var作为变量解释,如果想要输出$,则应使用转义字符\。
5.1.9数据类型:php不用声明变量类型,但变量类型在内部有字符串,整型,浮点型,对象,数据和NULL。
5.1.10字符串操作:strlen(),strpos(目标字符串,关键字)。串接运行符.。
5.1.11换行符:输出</br>。
参考:http://www.jb51.net/article/33723.htm
5.1.12变量详细信息:var_dump()输出变量类型,长度与值。
参考:http://www.php100.com/html/php/hanshu/2013/0905/4344.html
5.1.13常量:全局作用域,不可改变。使用define(常量名,值【,大小写不敏感(默认为false)】)。
5.1.14流程控制:类似Java。foreach(数据名 as 当前值){}。
5.1.15函数:与JavaScript相同。
5.1.16数组:与JavaScript相同。长度count(),可以使用=>设置key=》value。排序(sort,rsort,assort,arsort,ksort,krsort)。
$a=array("a","b","c");
5.1.17json:使用json_encode(数组)将数组转化为json。
参考:http://bbs.youkuaiyun.com/topics/390344812
5.1.18示例:PHP基本操作
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
//variant
$x=5;
$y=6;
$z=$x+$y;
//echo/print
//string
print "x+y=".$z;
echo "Hello World,PHP!";
function myFun(){
global$i;#comment,global
$i=1;
static $s=5;#static
$s+=1;
echo "global i=",$i,"</br>";
echo "static s=",$s,"</br>";
};
myFun();
myFun();
echo "out function global i =",$i,",type=",var_dump($i);
//datatype
function dataType(){
$i=1;
$f=1.21;
$s="str";
$t=true;
$a=array("a","b","c");
$n=NULL;
echo "</br>";
var_dump($i);
var_dump($f);
var_dump($s);
var_dump($t);
var_dump($a);
var_dump($n);
};
dataType();
//String
function str(){
echo"</br>strlen()=",strlen("ccc"),",strpos=",strpos("abcdef","cd");
}
str();
//Constant
define("XX","this is xx constant!",true);
echo"</br>",Xx;
?>
</body>
</html>
5.2 面向对象
类、继承、多态
5.2.1类:使用class定义,使用new实例化,使用public/private/protected定义作用域。
在类中使用成员变量时使用$this->属性(属性前无$)。
在实例中使用属性时使用$实例名->属性(属性前无$)。
class 类名{
private/public $属性;
public/private function 方法名(参数){
$this->属性=xx;
}
}
类的常量:const 常量名=值。调用格式类名::常量名。
echo "</br>",MyClass::B_VAR;
构建函数:function __construct(参数){}
析构函数:function __desstruct(){}
final,abstract:与java相同。
继承性:单继承,多接口实现,与java相同。
接口:interface,与java相同。
对象比较:==(值)与===(值+类型),与javascript相同。
5.2.2示例:类的定义和使用
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
class MyClass{
constB_VAR=5;
public$a;
function __construct($a){
echo"construct:\$this->a=",$this->a,",\$a=",$a,"</br>";
$this->a=$a;
}
function __desstruct(){
echo "__desstruct";
}
function showA(){
echo "a=",$this->a;
}
}
$c=new MyClass(7);
$c->a=18;
$c->showA();
echo"</br>",MyClass::B_VAR;
?>
</body>
</html>
5.2.3继承和多态:继承使用extends,多态直接重写。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
class Base{
public $a;
function __construct($a){
echo"construct:\$this->a=",$this->a,",\$a=",$a,"</br>";
$this->a=$a;
}
function __desstruct(){
echo "__desstruct";
}
function showA(){
echo "a=",$this->a;
}
}
class Subextends Base{
private $b;
functionshowA(){
echo "sub->a=",$this->a;
}
}
$c=new Base(7);
$sub= new Sub(5);
$sub->showA();
?>
</body>
</html>
5.2.4作用域操作符::
用于调用常量或静态变量(类外部用类名::变量,内部用self::变量),以及基类成员函数(parent::成员函数)。
子类无法直接调用基类的属性(将基类操作作为基类成员函数可以由子类调用)。
参考:http://bbs.chinaunix.net/thread-747748-1-1.html
http://www.php100.com/html/webkaifa/PHP/PHP/2009/1106/3487.html
http://bbs.blueidea.com/thread-3003126-1-1.html
示例:作用域
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
class Base{
static public $s="xx";
public $a;
function __construct($a){
echo"construct:\$this->a=",$this->a,",\$a=",$a,"</br>";
$this->a=$a;
}
function __desstruct(){
echo "__desstruct";
}
function showA(){
echo "a=",$this->a;
}
}
class Sub extends Base{
const SUB_VAR="ss";
private $b;
function showA(){
echo "sub->a=",$this->a;
echo ",parentstatic=",parent::$s,",self const=",self::SUB_VAR;
echo "</br>parent::showA():",
parent::showA();
}
}
$c=new Base(7);
$sub= new Sub(5);
$sub->showA();
echo"</br>const=",Sub::SUB_VAR;
?>
</body>
</html>
5.3 预定义变量(超全局变量):
5.3.1$GLOBALS:全局变量数组,其中还有一个指向自身的迭代指针。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
//variant
$x=5;
$y=6;
echo "HelloWorld,PHP!";
myFun();
var_dump($GLOBALS);
?>
</body>
</html>
结果
array(7) {
["_GET"]=> array(0) { }
["_POST"]=> array(0) { }
["_COOKIE"]=> array(0) { }
["_FILES"]=> array(0) { }
["GLOBALS"]=> 迭代
["x"]=> int(5)
["y"]=> int(6)
}
5.3.2$_SERVER:服务器信息。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
//variant
$x=5;
$y=6;
echo "HelloWorld,PHP!";
var_dump($_SERVER);
?>
</body>
</html>
结果:
Hello World,PHP!
array(35) {
["HTTP_HOST"]=> string(9) "localhost"
["HTTP_CONNECTION"]=> string(10)"keep-alive"
["HTTP_CACHE_CONTROL"]=> string(9)"max-age=0"
["HTTP_ACCEPT"]=> string(74)"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
["HTTP_UPGRADE_INSECURE_REQUESTS"]=> string(1)"1"
["HTTP_USER_AGENT"]=> string(109)"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/47.0.2526.106 Safari/537.36"
["HTTP_ACCEPT_ENCODING"]=> string(19) "gzip,deflate, sdch"
["HTTP_ACCEPT_LANGUAGE"]=> string(23)"zh-CN,zh;q=0.8,en;q=0.6"
["PATH"]=> string(968) "D:\ProgramData\nexus-2.11.4-01-bundle\nexus-2.11.4-01\bin;D:\ProgramData\apache-maven-3.2.1\bin;D:\ProgramData\Oracle\Administrator\product\11.2.0\client_1\bin;C:\ProgramFiles (x86)\Common Files\NetSarang;C:\Program Files (x86)\Intel\iCLSClient\;C:\Program Files\Intel\iCLS Client\;C:\Program Files (x86)\NVIDIACorporation\PhysX\Common;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\ProgramFiles\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R)Management Engine Components\IPT;C:\Program Files (x86)\Intel\Intel(R)Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R)Management Engine Components\IPT;C:\Program Files (x86)\CommonFiles\lenovo\easyplussdk\bin;D:\Program Files (x86)\EmEditor;D:\ProgramFiles\TortoiseSVN\bin;D:\Program Files\OpenSSH\bin;D:\Program Files(x86)\CodeSmith\v6.5\;D:\ProgramFiles\TortoiseGit\bin;D:\ProgramData\Java\Jdk7u79\bin;"
["SystemRoot"]=> string(10) "C:\Windows"["COMSPEC"]=> string(27) "C:\Windows\system32\cmd.exe"
["PATHEXT"]=> string(53)".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
["WINDIR"]=> string(10) "C:\Windows"["SERVER_SIGNATURE"]=> string(0) ""
["SERVER_SOFTWARE"]=> string(31)"Apache/2.4.18 (Win64) PHP/7.0.3"
["SERVER_NAME"]=> string(9) "localhost"["SERVER_ADDR"]=> string(3) "::1"
["SERVER_PORT"]=> string(2) "80"["REMOTE_ADDR"]=> string(3) "::1"
["DOCUMENT_ROOT"]=> string(18)"C:/Apache24/htdocs"
["REQUEST_SCHEME"]=> string(4) "http"
["CONTEXT_PREFIX"]=> string(0) ""
["CONTEXT_DOCUMENT_ROOT"]=> string(18)"C:/Apache24/htdocs"
["SERVER_ADMIN"]=> string(17)"admin@example.com"
["SCRIPT_FILENAME"]=> string(28)"C:/Apache24/htdocs/index.php"
["REMOTE_PORT"]=> string(5) "55239"
["GATEWAY_INTERFACE"]=> string(7)"CGI/1.1"
["SERVER_PROTOCOL"]=> string(8)"HTTP/1.1"
["REQUEST_METHOD"]=> string(3) "GET"
["QUERY_STRING"]=> string(0) ""
["REQUEST_URI"]=> string(10)"/index.php"
["SCRIPT_NAME"]=> string(10)"/index.php"
["PHP_SELF"]=> string(10) "/index.php"
["REQUEST_TIME_FLOAT"]=> float(1456125073.442)
["REQUEST_TIME"]=> int(1456125073)
}
5.3.3$_REQUEST
5.3.4$_POST:全局变量,Post请求的参数数组。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<formaction="index.php" method="post"/>
Name:<input type="text"name="name"/></br>
E-Mail:<input type="email"name="email"/></br>
<input type="submit"/></br>
</from>
<?php
var_dump($_POST);
?>
</body>
</html>
5.3.5$_GET:全局变量,Get请求的参数数组。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
var_dump($_GET);
?>
</body>
</html>
5.3.6$_FILES
5.3.7$_ENV
5.3.8$_COOKIE
5.3.9$_SESSION
$_SERVER["PHP_SELF"] 能够接受用户输入,从而可能被用于攻击(服务器脚本)。
转换为字符:htmlspecialchars(),避免攻击。
5.4 常用函数
5.4.1无效值判断:empty()
参考:http://www.mycodes.net/74/2406.htm
如果没有定义,NULL,空字符串则返回true。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
var_dump($_GET);
if(empty($i)){
echo "\$i is empty";
}
else{
echo $i;
}
?>
</body>
</html>
5.4.2正则表达式:preg_match("/正则表达式/","字符串")。
参考:http://www.hi-docs.com/php/preg_match.html
注意:正则表达式需要使用//包住。
//index.php
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>PHP</title>
</head>
<body>
<?php
if(preg_match("/\d+/","1")){
echo "number";
}else{
echo "not number";
}
?>
</body>
</html>