环境搭建
nginx 是一个高性能的http服务器和反向代理服务器。即nginx可以作为一个HTTP服务器进行网站的发布处理,也可以作为一个反向代理服务器进行负载均衡。但需要注意的是:nginx本身并不会对php文件进行解析。对PHP页面的请求将会被nginx交给FastCGI进程监听的IP地址及端口,由php-fpm(第三方的fastcgi进程管理器)作为动态解析服务器处理,最后将处理结果再返回给nginx。即nginx通过反向代理功能将动态请求转向后端php-fpm,从而实现对PHP的解析支持,这就是Nginx实现PHP动态解析的基本原理。
详细链接
安装php
https://www.php.net/downloads.php
安装nginx
http://nginx.org/en/download.html
配置
1、需要配置nginx.conf文件
server {
listen 8000 backlog=4096;
server_name www.baidu.com localhost;
access_log logs/access.log main;
root /home/leimengyao/api/app/htdocs;
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/home/leimengyao/php7/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/leimengyao/api/app/htdocs$fastcgi_script_name;
include fastcgi_params;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ /\.ht {
deny all;
}
}
基础语法注意点
三种语法
PHP 脚本可以放在文档中的任何位置。
PHP 脚本存放位置
<% %>
以上两种需要在配置文件中开启(ASP),以上用的比较少
<script language="php"></script>
<?php ?> //最常使用
变量
变量以 $ 符号开始,后面跟着变量的名称
变量名必须以字母或者下划线字符开始
变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分大小写的($y 和 $Y 是两个不同的变量)
弱类型语言
PHP 会根据变量的值,自动把变量转换为正确的数据类型。
在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。
变量作用域
local
global
static
parameter
预定义变量
$_GRT get请求提交的数据
$_POST post请求提交的数据
$_REQUEST get与post请求提交的数据
$_GLOBALS PHP中所有的全局变量
$_SERVER 服务器的信息
$_SESSION session会话信息
$_COOKIE cookie会话信息
$_ENV 环境信息
$_FILES 文件上传的信息
打印语句
- echo(): 可以一次输出多个值,多个值之间用逗号分隔。echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用。
- print(): 函数print()打印一个值(它的参数),如果字符串成功显示则返回true,否则返回false。
- print_r():
可以把字符串和数字简单地打印出来,而数组则以括起来的键和值得列表形式显示,并以Array开头。但print_r()输出布尔值和NULL的结果没有意义,因为都是打印"\n"。因此用var_dump()函数更适合调试。 - var_dump():
判断一个变量的类型与长度,并输出变量的数值,如果变量有值输的是变量的值并回返数据类型。此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。 - echo
是语法结构,也就是关键字,不是函数。使用的时候不用加括号,加上也可以。显示多个值的时候可以用逗号隔开。只支持基本类型,布尔型除外,echo true的时候显示1,echo false的时候啥都没有。
print 和 echo 基本一致。但是print 不支持逗号分隔多个显示变量的语法。
print_r 是函数,不仅可以打印变量的的值,还能显示变量类型,而且也可以显示数组和对象这样复杂的变量类型。print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。
两者相同点:
echo 和 print 都是语言结构(官方文档解释为language construct);
echo 和 print 都是用来输出字符串的;
当同时只有一个参数的时候,echo 和 print 后面的括号(parenthesis)都是可选的,即:echo ($argument1) 等价于 echo $argument1,print(argument)等价于print argument;
echo 和 print 在输出之前,都会将参数的进行转换,尝试转换为字符串类型。
两者的区别:
echo能接受N个字符串类型的参数(注意:有多个参数的时候,不能使用括号,即echo
a
r
g
1
,
arg1,
arg1,arg2是正确的,echo(
a
r
g
1
,
arg1,
arg1,arg2)会导致解析错误); print只能接收1个字符串类型的参数;
echo没有返回值; print有返回值,其值永远为int类型的1。
在这里引用PHP官方原文档的说明 : “The major differences to echo are that print only accepts a single argument and always returns 1.”
关于PHP EOF
<?php
$name="变量会被解析";
$a=<<<EOF
$name<br><a>html格式会被解析</a><br/>双引号和Html格式外的其他内容都不会被解析
"双引号外所有被排列好的格式都会被保留"
"但是双引号内会保留转义符的转义效果,比如table:\t和换行:\n下一行"
EOF;
echo $a;
?>
数据类型
String(字符串)
Integer(整型)
Float(浮点型)
Boolean(布尔型)
Array(数组)
Object(对象)
NULL(空值)
Resource(资源类型)
进制转换
整型定义 保存的数据有范围限制,4个字节存储数据,可以区分符号
十进制:$a = 110;
二进制:$a = 0b110;
八进制:$a = 0110;
十六进制:$a = 0x110;
$int01 = 110;
$int02 = 0b110;
$int03 = 0110;
$int04 = 0x110;
echo "<hr/>",$int01,"-",$int02,"-",$int03,"-",$int04; //页面上表示的数据都是以十进制进行表示的
/*
进制的转换
10——>2 10/2=5...0 5/2=2...1 2/2 = 1...0 1/2 = 0...1 1010 需要补足到32位 00000000 00000000 00000000 00001010
PHP内置了很多转换函数
Decbin() 10->2
Decoct() 10->8
Dechex() 10->16
Bindec() 2->10
*/
echo "<hr/>",Decbin($int01);
比较
松散比较:使用两个等号 == 比较,只比较值,不比较类型。
严格比较:用三个等号 === 比较,除了比较值,也比较类型。
设置常量
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
该函数有三个参数:
- name:必选参数,常量名称,即标志符。
- value:必选参数,常量的值。
- case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
常量是可以全局访问的
php字符串
<?php
//链接字符串
$txt1 = "Hello";
$txt2 = "World";
$txt3 = $txt1.$txt2;
echo $txt3;
//空格
echo PHP_EOL;
//获取字符串长度
echo strlen($txt3);
//中文的长度与编码相关 utf-8一个中文三个字节
$txt = "你好!";
//空格
echo PHP_EOL,strlen($txt);
//获取字符串出现的位置
echo PHP_EOL,strpos($txt3,$txt2);
?>
运算符
https://www.runoob.com/php/php-operators.html
流程控制
if (条件)
{
if 条件成立时执行的代码;
}
elseif (条件)
{
elseif 条件成立时执行的代码;
}
else
{
条件不成立时执行的代码;
}
<?php
switch (n)
{
case label1:
如果 n=label1,此处代码将执行;
break;
case label2:
如果 n=label2,此处代码将执行;
break;
default:
如果 n 既不等于 label1 也不等于 label2,此处代码将执行;
}
?>
数组
数值数组 - 带有数字 ID 键的数组
关联数组 - 带有指定的键的数组,每个键关联一个值
多维数组 - 包含一个或多个数组的数组
//定义一个数据数组
$array01 = array("first","second","third");
//显示类型与值
var_dump($array01);
//遍历数组
for($i=0;$i<count($array01);$i++) {
echo "<br/>",$array01[$i];
}
echo "<br/>";
//定义一个关联数组
$array02 = array("zyx"=>"22","hq"=>"18");
//显示类型与值
var_dump($array02);
//遍历数组
foreach($array02 as $x => $x_value){
echo "<br/>",'key'.'-->'.$x.' '.'value'.'-->'.$x_value;
}
数组排序
sort() - 对数组进行升序排列
rsort() - 对数组进行降序排列
asort() - 根据关联数组的值,对数组进行升序排列
ksort() - 根据关联数组的键,对数组进行升序排列
arsort() - 根据关联数组的值,对数组进行降序排列
krsort() - 根据关联数组的键,对数组进行降序排列
//php冒泡排序算法
$nums = array(1,81,7,5,1,2,3,6,8);
//获取数组的长度
$length = count($nums);
for($i=0;$i<$length;$i++){
for($j=$i;$j<$length;$j++){
if($nums[$i]>$nums[$j]){
$nums[$i]=$nums[$i]+$nums[$j];
$nums[$j]=$nums[$i]-$nums[$j];
$nums[$i]=$nums[$i]-$nums[$j];
}
}
}
var_dump($nums);
php超级全局变量
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
$GLOBALS
$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。
$GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
//测试$GLOBALS
$var1=12;
$var2=13;
//定义函数
function test() {
global $var1,$var2;
echo $var1."--".$var2;
}
//执行test
test();
//查看$GLOBALS的值
var_dump($GLOBALS);
$_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
详细信息
$_REQUEST
PHP $_REQUEST 用于收集HTML表单提交的数据。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 “Submit” 按钮提交表单数据时, 表单数据将发送至标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_REQUEST 来收集表单中的 input 字段数据:
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
$_POST
PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 “Submit” 按钮提交表单数据时, 表单数据将发送至标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_POST 来收集表单中的 input 字段数据
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
</body>
</html>
$_GET
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。
$_GET 也可以收集URL中发送的数据。
<html>
<body>
<a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>
</body>
</html>
<html>
<body>
<?php
echo "Study " . $_GET['subject'] . " @ " . $_GET['web'];
?>
</body>
</html>
PHP函数
//递归函数
function add($num) {
if($num<1) {
return 0;
}
return $num+add($num-1);
}
echo add(5);
PHP魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
//__DIR__ 表示当前文件所在系统的绝对路径
//__FILE__ 表示当前文件所在系统的绝对路径(包括自身文件的名称)
//__LINE__ 表示当前常量所在的行数
//__NAMESPACE__ 表示当前文件所在的命名空间
//__CLASS__ 表示当前文件所在的类
//__METHOD__ 表示当前文件所在的方法
命名空间
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP面向对象
Java面向对象与之类似
<?php
class phpClass {
var $var1;
var $var2 = "constant string";
function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
类使用 class 关键字后加上类名定义。
类名后的一对大括号({})内可以定义变量和方法。
类的变量使用 var 来声明, 变量也可以初始化值。
函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。
构造函数
构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。
析构函数
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
通过类来获取常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字(如 self,parent 或 static)。
<?php
class ClassConst
{
const flag = "flag";
function test() {
echo self::flag.PHP_EOL;
}
}
//通过new来调用
$test = new ClassConst();
$test->test(); //flag
echo $test::flag.PHP_EOL;
//通过类名来获取常量
echo ClassConst::flag.PHP_EOL;
//通过变量来获取
$var = "ClassConst";
echo $var::flag;
抽象类
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
<?php
/*
任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。
定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。
继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。
例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。
*/
abstract class PrintFactory
{
private $txt;
/**
* @return mixed
*/
public function getTxt()
{
echo $this->txt.PHP_EOL;
}
/**
* @param mixed $txt
* protected修饰说明子类可以访问到
*/
protected function setTxt($txt): void
{
$this->txt = $txt;
}
//抽象方法
abstract function DivPrint();
}
class MyPrint extends PrintFactory
{
function DivPrint()
{
// TODO: Implement DivPrint() method.
parent::setTxt("调用一下抽象类的方法");
echo parent::getTxt();
//自定义
echo "hello";
}
}
$myPrint = new MyPrint();
$myPrint->DivPrint();
static关键字
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
<?php
/*
声明类属性或方法为 static(静态),就可以不实例化类而直接访问。
静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。
由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
静态属性不可以由对象通过 -> 操作符来访问。
自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
*/
class TestStatic
{
//定义一个静态变量
public static $txt;
//定义一个普通的变量
public $var;
/**
* @return mixed
*/
public function getVar()
{
return $this->var;
}
/**
* @param mixed $var
*/
public function setVar($var): void
{
$this->var = $var;
}
function getTxt(){
echo self::$txt;
}
static function setTxt($param){
self::$txt=$param;
}
}
//静态变量,方法通过类直接调用
TestStatic::setTxt("hello world");
TestStatic::setTxt("hello world!!!");
echo TestStatic::$txt.PHP_EOL;
$test = new TestStatic();
$test->getTxt();
//hello world!!!
//hello world!!!
final关键字
父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
调用父类构造方法
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。