PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源的、简单的,面向对象的,解释型的,健壮的,安全的,性能非常之高的,独立于架构的,可移植的,动态的脚本语言。

用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

PHP不仅可用来开发Web应用程序,也可以开发普通应用程序。

采用PHP的网站如新浪网(sina)、中国人(Chinaren)等,但由于PHP本身存在的一些缺点,使得它不适合应用于大型电子商务站点,而更适合一些小型的商业站点。首先,PHP缺乏规模支持。其次,缺乏多层结构支持。对于大负荷站点,
解决方法只有一个:分布计算。数据库、应用逻辑层、表示逻辑层彼此分开,而且同层也可以根据流量分开,群组成二维数组。而PHP则缺乏这种支持。还有上面提到过的一点,PHP提供的数据库接口支持不统一,这就使得它不适合运用在电子商务中。

1.运行环境

1. 运行环境
Windows 环境:
WAMP = windows + apache + mysql + php
WNMP = windows + nginx+ mysql + php

Linux环境:
LAMP = linux + apache + mysql + php
LNMP = linux + nginx+ mysql + php

常用集成环境软件:wampserver、phpstudy、Xampp等。

2.基本语法

纯php写法:

<?php
// PHP 代码
echo "Hello World!";
?>

html和PHP嵌套写法:

<!DOCTYPE html>
<html>
<body>

<?php
echo "Hello World!";
?>

</body>
</html>

3.开发注意事项

1. PHP 脚本以 <?php 开始,以 ?> 结束;
2. 每条语句后边都要加分号;
3. PHP 文件的默认文件扩展名是 ".php"。
4. PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码;
   如果是纯php代码,可以不写结束标签 ?> ,也不推荐写结束标签 ?>;
   后者除了php代码,还有html代码,必须要写结束标签 ?>。
5. php代码的执行顺序: 从上往下,依次执行
6. 单行注释: //这里是注释内容
   多行注释: /*这里是注释内容*/
7. 单引号和双引号对比:
	- 双引号可以解释变量,单引号不可以解释变量。
    - 双引号可以使用 \ 解释转义字符;单引号不解释转义字符,必须加上 \ 才可以解释,除了\\;
   	  转义字符: \r(回车)  \n(换行)   \t(制表) \\(表示一个反斜线) 等。
    - 双引号中可以加单引号,单引号可以加双引号;双引号中不能加双引号,单引号中不能加单引号,如果要加,需要转义。
    - 尽量使用单引号就是用单引号,因为它的效率更高,双引号需要解释,在输出。
8. 变量命名
	- 变量必须以$开始,由数字,字母,下划线的组合,但是不能以数字开始。
	- 变量名要起的有意义,达到见名知意(建议优先考虑英文)
	- 变量名遵循驼峰法或者下划线法(建议大家使用小驼峰)
	- 变量名区分大小写
9. 常量定义:define('常量名',常量值); 
10. 数据类型
	- 整型   浮点型   字符串类型   布尔型   数组   对象   资源   空(null)
11. 输出方式
	- echo   - 可以输出一个或多个字符串
	- print   - 只能输出简单类型变量的值,如int,string
	- print_r - 可以输出复杂类型变量的值,如数组,对象
	- printf -函数用于格式化输出字符串,主要用于字符串中以%开头的格式字符串替换。
	- sprintf -函数也用做字符串格式化。该函数与 printf 函数基本相同, 但它可以将转换后的结果保存到一个字符串变量中,而不是直接输出。(因为跟printf类似,下面就不做详细演示了)
	- var_dump -打印变量的相关信息,包括表达式的类型与值,通过缩进显示其结构。
	
	提示:echo输出的速度比print快,echo是PHP语句,没有返回值,print和print_r是PHP函数,函数有返回值。
	print返回值为1(int类型),print_r返回值为true(bool类型)。

4.超全局变量

1、$GLOBALS
$GLOBALS 是一个预定义的超全局数组,其中包含了全局作用域中的所有可用变量,变量的名字就是数组的键。在一个PHP脚本的全部作用域中都可以访问。还有一个与$GLOBALS 很类似的叫 global 关键字,它也可以让我们在函数内部使用在函数外部定义的全局变量。

<?php
function test() {
    $foo = "局部变量";
    echo 'GLOBALS 中 foo 是: ' . $GLOBALS["foo"] . "\n";
    echo 'test 中 foo 是: ' . $foo . "\n";
    
	global $foo2; // 通过global来声明$foo2,相当于传递参数
	$foo2 += 1;
}
$foo = "全局变量";
$foo2 = 1;
test();
echo 'foo2 = ' . $foo2 . "\n";
//输出:
//GLOBALS 中 foo 是: 全局变量
//test 中 foo 是: 局部变量
//foo2 = 2
?>

2、$_SERVER
$_SERVER 准确来说是一个数组,包含了头信息、路径、以及脚本位置等等信息。这个数组中的项目由 Web 服务器创建。服务器可能会忽略一些,不一定每个服务器都提供全部项目。
下表列出了 $_SERVER 变量中的部分元素(以本篇博客地址为例):

参数	描述
DOCUMENT_ROOT	当前运行脚本所在的文档根目录。在服务器配置文件中定义。 /weixin_43844718/article/details/126857460
HTTP_ACCEPT	当前请求头中 Accept: 项的内容,如果存在的话。
HTTP_ACCEPT_CHARSET	当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:“iso-8859-1,*,utf-8”。
HTTP_ACCEPT_LANGUAGE	当前请求头中 Accept-Language: 项的内容(如果存在)。例如,“en”
HTTP_HOST	当前请求头中 Host: 项的内容,如果存在的话。
HTTP_REFERER	引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。)
HTTPS	如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。
PHP_SELF	当前执行脚本的文件名,与 document root 有关。例如,在地址为 /weixin_43844718/article/details/126857460
PATH_INFO	包含由客户端提供的、跟在真实脚本名称之后并且在查询语句(query string)之前的路径信息(如果存在)
PATH_TRANSLATED	当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。
SCRIPT_FILENAME	当前执行脚本的绝对路径。
SERVER_ADMIN	该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
SERVER_PORT	Web 服务器使用的端口。默认值为 “80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
SERVER_SIGNATURE	包含了服务器版本和虚拟主机名的字符串。
SCRIPT_NAME	包含当前脚本的路径。
SCRIPT_URI	URI 用来指定要访问的页面。例如 “/index.html”。
SERVER_ADDR	当前运行脚本所在的服务器的 IP 地址。
SERVER_NAME	当前运行脚本所在的服务器的主机名。例如,“blog.csdn.net”。
SERVER_SOFTWARE	服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24)
SERVER_PROTOCOL	请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。
REMOVE_ADDR	浏览当前页面的用户 IP 地址,注意与 $_SERVER[‘SERVER_ADDR’] 的区别。
REQUEST_METHOD	访问页面使用的请求方法;例如,“GET”, “HEAD”,“POST”,“PUT”。
REQUEST_URI	URI 用来指定要访问的页面。例如,“index.html”
REQUEST_TIME	请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
REMOTE_ADDR	浏览当前页面的用户的 IP 地址。
REMOTE_HOST	浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。
REMOTE_PORT	用户机器上连接到 Web 服务器所使用的端口号。
3、$_GET
$_GET 可以获取到使用 get 方法传递的参数的相关信息。

4、$_POST
$_POST 可以获取到使用 post 方法传递的参数的相关信息。

5、$_REQUEST
$_REQUEST 是一个关联数组,默认包含 $_GET、$_POST、$_COOKIE 中的内容。建议不用这个超级变量,因为它不够安全。

6、$_FILES
$_FILES 是一个关联数组,包含通过 HTTP POST 方法上传给当前脚本的文件内容。

$_FILES数组内容如下: 
$_FILES['file']['name'] 客户端文件的原名称。 
$_FILES['file']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"image/gif"。 
$_FILES['file']['size'] 已上传文件的大小,单位为字节。 
$_FILES['file']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。 
$_FILES['myFile']['error'] 和该文件上传相关的错误代码。['error'] 是在 PHP 4.2.0 版本中增加的。下面是它的说明:(它们在PHP3.0以后成了常量) 
	UPLOAD_ERR_OK :0; 没有错误发生,文件上传成功。 
	UPLOAD_ERR_INI_SIZE :1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。 
	UPLOAD_ERR_FORM_SIZE :2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。 
	UPLOAD_ERR_PARTIAL :3; 文件只有部分被上传。 
	UPLOAD_ERR_NO_FILE :4或5; 4-没有文件被上传;5-上传文件大小为0.

7、$_COOKIE
$_COOKIE 是一个关联数组,包含 通过 HTTP cookie 传递给当前脚本的内容。

8、$_SESSION
$_SESSION 是一个关联数组,包含当前脚本中的所有 session 内容。

9、$_ENV
$_ENV 是一个包含服务器端环境变量的数组。

5.魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

魔术常量	描述
__LINE__	文件中的当前行号。
__FILE__	文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
__DIR__	文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__DIR__	文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
__METHOD__	当前函数的名称。
__CLASS__	当前类的名称。
__NAMESPACE__	当前命名空间的名称。
__TRAIT__	Trait 的名字。

6.魔术方法

php规定以两个下划线 __ 开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法,所有魔术方法都必须被定义为公共的。

魔术方法	描述
__get	当调用一个未定义的属性时访问此方法。
__set	给一个未定义的属性赋值时调用。
__isset	当在一个未定义的属性上调用isset()函数时调用此方法。
__unset	当在一个未定义的属性上调用unset()函数时调用此方法。
__call	当调用一个未定义(包括没有权限访问)的方法是调用此方法。
__autoload	使用尚未被定义的类时自动调用。通过此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
注意: 在
__construct	构造方法,当一个对象被创建时调用此方法。
__destruct	析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。
默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.,析构函数允许你在使用一个对象之后执行任意代码来清除内存,当PHP决定你的脚本不再与对象相关时,析构函数将被调用。
在一个函数的命名空间内,这会发生在函数return的时候,对于全局变量,这发生于脚本结束的时候,如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值,通常将变量赋值勤为NULL或者调用unset。
__clone	使用clone方法复制一个对象时,对象会自动调用__clone魔术方法,如果在对象复制需要执行某些初始化操作,可以在__clone方法实现。
__toString	在将一个对象转化成字符串时自动调用,比如使用echo打印对象时,如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in,此方法必须返回一个字符串。
__sleep	串行化的时候用。
serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
__wakeup	反串行化的时候调用。相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
__set_state	调用var_export()导出类时,此静态方法会被调用。
__invoke	当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
__callStatic	__callStatic() 是为了处理静态方法调用,PHP5.3.0以上版本有效,PHP 确实加强了对 __callStatic() 方法的定义;它必须是公共的,并且必须被声明为静态的。