ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
[[官方手册]](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)