[[官方手册]](http://php.net/manual/zh/index.php)
[TOC]
## 简介
### PHP特点
PHP:Hypertext Preprocessor,超文本预处理器。
* 是一种脚本语言。由Web服务器中安装的PHP应用模块解析。融合了现代编程语言(C,Java和Perl)的一些最佳特性。
* 运行在服务器端。只会在服务器端运行,不会传到客户端。PHP根据不同用户的不同请求,完成在服务器中的业务操作,并将结果返回给用户。
* 嵌入到HTML中。通过特殊的标识符号嵌入到HTML代码中。嵌入的这些PHP代码需要先在服务器中运行完成,若有输出则将输出结果字符串嵌入原来的PHP代码处,再和HTML代码一起响应给客户端的浏览器进行解析。
**脚本语言**:又称为动态语言,是使用一种特定的描述性语言、依据一定格式编写的可执行文件。脚本是一种纯文本(如ASCII码)保存的程序,只在被调用时进行解释或编译。脚本在执行时,是由系统的脚本解释器,将脚本中的文字命令一条一条翻译成机器可识别的指令,并按脚本中的顺序执行。
### PHP应用
PHP是用来协助Web服务器工作的编程语言,是对Web服务器功能的扩展,外挂在Web服务器上一起工作,需要安装PHP应用程序服务器对PHP脚本进行解释执行。
1. 收集表单(Form)数据。$_GET,$_POST。
2. 生成动态网页。根据用户在客户端的不同输入请求,服务器端的PHP脚本程序可动态输出内容返回给客户端,但客户端无法得知具体的处理过程/代码。
3. 字符串处理。字符串是PHP的一种基本数据类型。PHP中有丰富的字符串处理函数,还可以使用正则表达式对字符串和文本进行搜索、查找、匹配、替换等操作。
4. 动态输出图像。PHP通过使用GD扩展库可用于动态输出图像(文字按钮、验证码、数据统计图等),还可编辑图像(处理缩略图、为图片添加水印等)。
5. 处理服务器端文件系统。PHP可利用文件系统函数任意操作服务器中的目录和文件(打开、编辑、复制、创建、删除,文件属性等)。
6. 编写数据库支持的网页。PHP可以连接所有主流的数据库,MySQL、Oracle、SQL Server、MangoDB等。
7. 会话跟踪控制。$_SESSION、$_COOKIE。
8. 处理XML文件。PHP 5基于libxm2标准化所有的XML扩展,并添加了SimpleXML和XMLReader支持。
9. 支持利用大量的网络协议。LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 环境)等。PHP已经支持对Java对象的即时连接,并可以将他们自由地用做PHP对象。甚至可以用CORBA扩展库来访问远程对象。
10. 服务器端的其他操作。PHP在电子商务领域,其Cybercash支付、CyberMUT、VeriSign Payflow Pro及MCVE函数对于在线交易程序来说非常有用。还有很多其他的扩展库:mnoGoSearch搜索引擎函数、IRC网关函数、压缩工具(gzip、bz2)、日历转换、翻译等等。
11. 应用于所有主流操作系统。Windows、Linux、iOS、RISC OS等。
12. 支持大多数Web服务器。Apache、Nginx、TomCat、IIS、PWS(Personal Web Server)、Netscape等。对于大多数服务器,PHP提供了一个模块。(Web服务器安装成功后,可在php脚本中应用“phpinfo()”函数查看PHP模块的情况)
13. 支持面向过程和面向对象的开发。
## 0. 命名空间
在全局命名空间中选择创建的符号名称时,要考虑到以下指导方针以免未来的 PHP 版本破坏掉用户使用的符号名称。
### 0.1 全局命名空间
以下代码结构会进入全局命名空间:
* functions(函数)
* classes(类)
* interfaces(接口)
* constants(常量,并非类常量)
* 在函数/方法之外定义的变量
### 0.2 规则
以下列表指出了 PHP 工程在选择新的内部标识符时保留给自己的权利。最终指南是官方的[» 编码标准:](http://git.php.net/?p=php-src.git;a=blob_plain;f=CODING_STANDARDS;hb=HEAD)
* PHP 拥有最顶层命名空间,但是会尝试找到合体的描述命名以避免任何明显的冲突。
* 函数名在两个词中间使用下划线,类名则同时使用 camelCase 和 PascalCase 规则。
* PHP 在任何扩展库的全局符号前附加上扩展库的名称(此规则在过去则有无数例外)。例如:
- curl_close()
- mysql_query()
- PREG_SPLIT_DELIM_CAPTURE
- new DOMDocument()
- new SplFileObject()
- Iterators 和 Exceptions 则只是简单加上 "Iterator" 和 "Exception" 后缀。例如:
- ArrayIterator
- LogicException
- PHP 保留所有以` __ `开头的符号(双下划线)作为魔术符号。建议用户不要在 PHP 中创建以` __ `打头的符号,除非是要使用有文档记载的魔术函数功能。例如:
- __get()
- __autoload()
### 0.3 提示
要写出能经受住时间考验的代码,建议给任何进入全局命名空间的符号都加上一个不常见的 3-4 字母的前缀(或后缀),中间用下划线分开。为了避免与其它用户空间代码出现命名空间冲突,建议先研究一下其它项目中已有的前缀(或后缀)并适当地公布出来。示例如下:
- MyPx_someFunc()
- Foo_Date
- $asdf_dbh
## 2. 时间戳
### 2.1
### 2.2
## 3. JSON
### 3.1
### 3.2
## 4. PDO
### 4.1
### 4.2
## 5. 全局变量
### 5.1 $_SERVER,服务器变量
### 5.2 $_ENV,环境变量
PHP中的`$_ENV`是一个包含服务器端环境变量的数组。它是PHP中一个超级全局变量,我们可以在PHP 程序的任何地方直接访问它。
`$_ENV`只是被动的接受服务器端的环境变量并把它们转换为数组元素,你可以尝试直接输出它。
当你想看看一个变量中究竟有什么东西在里面时,可以有三种方式:
~~~php
1、var_dump($_ENV);
2、print_r($_ENV);
3、foreach($_ENV as $key=>$val){echo $key.'--------'.$val.'<br>';}
~~~
第一种最方便而且输出的内容格式清晰。
由于`$_ENV`变量是取决于服务器的环境变量的,从不同的服务器上获取的`$_ENV`变量打印出的结果可能是完全不同的。所以无法像`$_SERVER`那样列出完整的列表。以下是`$_ENV`数组包含的比较通用的元素:
有时候,`$_ENV`会为空,其原因通常是php的配置文件php.ini的配置项为:`variables_order = "GPCS"`。要想让`$_ENV`的值不为空,那么variables_order的值应该加上一个大写字母“E”,即:`variables_order = "EGPCS"`。
上述配置表示了PHP接受的外部变量来源及顺序,`EGPCS`是Environment、Get、Post、Cookies、Server的缩写。如果variables_order 的配置中缺少E ,则PHP 无法接受环境变量,那么`$_ENV` 也就为空了。
由于开启`$_ENV`,即variables_order = "EGPCS"会导致一些性能损失,按php官方的说法是,在生产环境中,不推荐使用。他们更推荐使用`getenv (string $varname)`函数来获取Environment中的值,而这点需要在编程时就注意到。如果编程时用了$_ENV而variables_order中又没有配置为variables_order = "EGPCS",则程序运行时可能会报错。
### 5.3 $_GET,URL GET变量
### 5.4 $_POST,HTTP POST变量
### 5.5 $_REQUEST,request变量
### 5.6 $_FILES,HTTP文件上传变量
### 5.7 $_COOKIE,HTTP Cookie
### 5.8 $_SESSION,HTTP Sesssion变量
### 5.9 $GLOBALS,Global变量
## 6. 类与对象
[参考文档,http://php.net/manual/zh/oop5.intro.php](http://php.net/manual/zh/oop5.intro.php)
PHP 5 具有完整的对象模型。
PHP 5 中的新特性包括访问控制,抽象类和 final 类与方法,附加的魔术方法,接口,对象复制和类型约束。
PHP 对待对象的方式与引用和句柄相同,即每个变量都持有对象的引用,而不是整个对象的拷贝。
### 6.1 类的定义(class)
每个类的定义都以关键字 `class` 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。
Example #1 简单的类定义
~~~php
<?php
class SimpleClass
{
// property declaration
public $var = 'a default value';
// method declaration
public function displayVar() {
echo $this->var;
}
}
?>
~~~
一个类可以包含有属于自己的常量,变量(称为“属性”)以及函数(称为“方法”)。
当一个方法在类定义内部被调用时,有一个可用的伪变量` $this`。`$this` 是一个到主叫对象的引用(通常是该方法所从属的对象,但如果是从第二个对象静态调用时也可能是另一个对象)。
### 6.2 类的实例化(new)
要创建一个类的实例,必须使用 `new `关键字。当创建新对象时该对象总是被赋值,除非该对象定义了构造函数并且在出错时抛出了一个异常。类应在被实例化之前定义(某些情况下则必须这样)。
在类定义内部,可以使用 `new self` 和 `new parent` 创建新对象。
PHP 5.3.0 引进了两个新方法来创建一个对象的实例:
code:
~~~php
<?php
class Test
{
static public function getNew()
{
return new static;
}
}
class Child extends Test
{}
$obj1 = new Test();
$obj2 = new $obj1;
var_dump($obj1 !== $obj2);
$obj3 = Test::getNew();
var_dump($obj3 instanceof Test);
$obj4 = Child::getNew();
var_dump($obj4 instanceof Child);
?>
~~~
以上例程会输出:
~~~php
bool(true)
bool(true)
bool(true)
~~~
### 6.3 类的继承(extends)
一个类可以在声明中用 `extends` 关键字继承另一个类的方法和属性。PHP不支持多重继承,一个类只能继承一个基类。
被继承的方法和属性可以通过用同样的名字重新声明被覆盖。但是如果父类定义方法时使用了 final,则该方法不可被覆盖。可以通过 parent:: 来访问被覆盖的方法或属性。
当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。
code简单的类继承
~~~php
<?php
class ExtendClass extends SimpleClass
{
// Redefine the parent method
function displayVar()
{
echo "Extending class\n";
parent::displayVar();
}
}
$extended = new ExtendClass();
$extended->displayVar();
?>
~~~
以上例程会输出:
~~~php
Extending class
a default value
~~~
## x. 异步通信库(Swoole)
### x.1 异步IO
### x.2 webSocket
## [参考资源]
### 官方
#### [函数参考](http://php.net/manual/zh/funcref.php)
#### [字符串 函数](http://php.net/manual/zh/ref.strings.php)
#### [日期与时间相关扩展](http://php.net/manual/zh/refs.calendar.php)
#### [数组](http://php.net/manual/zh/book.array.php)
#### [类与对象](http://php.net/manual/zh/language.oop5.php)
- WebAPP
- Linux Command
- 入门
- 处理文件
- 查找文件单词
- 环境
- 联网
- Linux
- Linux目录配置标准:FHS
- Linux文件与目录管理
- Linux账号管理与ACL权限设置
- Linux系统资源查看
- 软件包管理
- Bash
- Daemon/Systemd
- ftp
- Apache
- MySQL
- Command
- Replication
- mysqld
- remote access
- remark
- 限制
- PHP
- String
- Array
- Function
- Class
- File
- JAVA
- Protocals
- http
- mqtt
- IDE
- phpDesigner
- eclipse
- vscode
- Notepad++
- WebAPI
- Javasript
- DOM
- BOM
- Event
- Class
- Module
- Ajax
- Fetch
- Promise
- async/await
- Statements and declarations
- Function
- Framwork
- jQurey
- Types
- Promise
- BootStrap
- v4
- ThinkPHP5
- install
- 定时任务
- CodeIgniter
- React.js
- node.js
- npm
- npm-commands
- npm-folder
- package.json
- Docker and private modules
- module
- webpack.js
- install
- configuration
- package.json
- entry
- modules
- plugins
- Code Splitting
- loaders
- libs
- API
- webpack-cli
- Vue.js
- install
- Compile
- VueAPI
- vuex
- vue-router
- vue-devtools
- vue-cli
- vue-loader
- VDOM
- vue-instance
- components
- template
- Single-File Components
- props
- data
- methods
- computed
- watch
- Event-handling
- Render Func
- remark
- 案例学习
- bootstrap-vue
- modal
- fontAwesome
- Hosting Font Awesome Yourself
- using with jquery
- using with Vue.js
- HTML
- CSS
- plugins
- Chart.js
- D3.js
- phpSpreadSheet
- Guzzle
- Cmder
- Git
- git命令
- git流程
- Postman
- Markdown
- Regular Expressions
- PowerDesigner
- 附录1-学习资源