前言

最近在系统的学习 PHP ,参考的资料是《PHP编程》+ 官方文档(如果你有好的学习资料,欢迎推荐给我)。虽然这本《PHP编程》是基于 PHP5 的,但我笔记里的代码,全部在 PHP 7.2 的环境里测试过,是能够运行的。另,本笔记中只记录我模糊不清的知识。

大小写

类、函数、内置的结构以及关键字等是不区分大小写的。(PS:变量区分大小写)

注释

PHP 有多种注释方式,这些方式都是借鉴现有的语言(C、C++、UNIX shell)
其中 shell 风格的注释使用 # 来标识。

数据类型

PHP 提供八种类型的值或称为数据类型。

  • 四种是标量型(单值)的:整形、浮点数(实数)、字符串和布尔型。
  • 两种复合类型(集合):数组和对象。
  • 剩下的两种是特殊类型:资源和 NULL 。

  • 十六进制以 0x 开头,字母是可以大写或小写,但通常是大写
  • 八进制以 0 开头。
  • 二进制以 0b 开头。
  • 变量在双引号中会被解析(解释),而在单引号中,他们不会被解析:
  1. $name = "Guido";
  2. echo "Hi, $name\n"; // Hi, Guido
  3. echo 'Hi, $name'; // Hi, $name
  • 在 PHP 中,以下值的计算结果为 false

  • 关键字 false

  • 整形 0
  • 浮点数 0.0
  • 空字符串 "" 和字符串 "0"
  • 空数组
  • 空对象
  • NULL
  • 定义一个类,就可以用关键字 new 创建这个类的任意数量的对象,类的属性和方法可以通过 -> 结构访问。

变量的变量

  1. $foo = "bar";
  2. $$foo = "baz"; //变量bar的值为

变量的引用

在PHP中,引用就是如何创建变量的别名。可以说两个变量储存了相同的值。
销毁其中一个变量的值,不会影响另一个变量的值。

  1. $bigLongVariableName = "PHP";
  2. $short =& $bigLongVariableName;
  3. $bigLongVariableName .= " rocks!";
  4. print "\$short is $short\n"; // $short is PHP rocks!
  5. print "Long is $bigLongVariableName\n"; // Long is PHP rocks!
  6. $short = "Programing $short";
  7. print "\$short is $short\n"; // $short is Programming PHP rocks!
  8. print "Long is $bigLongVariableName\n"; // Long is Programming PHP rocks!
  9. $white = "snow";
  10. $black =& $white;
  11. unset($white);
  12. print $black; //snow

这里的换行符可能在浏览器中显示不出来,可以参考这篇:如何在 PHP 中换行,解决问题。

变量的作用域

在 PHP 中,只有函数可以提供局部作用域。与其他语言不同,在 PHP 中不能创建一个作用域是循环、条件分支或其他块类型的局部变量。也就是说函数外声明的变量就是全局变量,他们可以在程序的任何部分被访问。不过,默认情况下全局变量在内部函数中是不可访问的。
为了让函数访问全局变量共有两个方法:

方法一:使用 global 关键字

  1. function updateCounter()
  2. {
  3. global $counter;
  4. $counterr++;
  5. }
  6. $counter = 10;
  7. updateCounter();
  8. echo $counter; // 11

方法二:使用 PHP 中的 $GLOBALS 数组

  1. function updateCounter()
  2. {
  3. $GLOBALS[counter]++:
  4. }
  5. $counter = 10;
  6. updateCounter();
  7. echo $counter; // 11

静态变量 ( static )

静态变量在一个函数中被多次调用时,其值不会丢失,但此变量仅在函数内时可见的。

  1. function updateCounter()
  2. {
  3. static $counter = 0;
  4. $counter++;
  5. echo "Static counter is now {$counter}\n";
  6. }
  7. $counter = 10;
  8. updateCounter(); // Static counter is now 1
  9. updateCounter(); // Static counter is now 2 // 不会再被付初始值
  10. echo "Global couter is {$couter}\n"; // Global counter is 10

隐式转换

当二元算数操作符是两个不同的类型时 PHP 会根据需要自动转换,其中的阶梯为:字符串 -> 整数 -> 浮点数。
假定一个字符串以一个整数或浮点数开始。如果未在字符串的开始处发现任何数字,该字符串的数值为0。如果字符串包含一个点( . )或大写/小写的 e ,对该字符串的求值则生成一个浮点数。例如:

  1. "9 Lives" - 1; //8 (整数)
  2. "3.14 Pies" * 2; //6.28 (浮点数)
  3. "9 Lives." -1; //8 (整数)
  4. "1E3 Points of Light" + 1 // 1001 (浮点型)

除法操作符

如果两个数能整除,则为整数( 4/2 ),否则为浮点数( 1/2 )。

自动递增操作符

在 PHP 中,对字符串中使用自动递增,会相应得到下一个字母。(我测试了一下,只对递增操作符有效)

  1. $a = "z";
  2. echo ++$a; // "aa"

垃圾收集

PHP 使用引用计数写时复制来管理内存。

  • 写时复制:保证了变量间复制值不浪费内存。
  • 引用计数:保证了不在需要时将内存释放给操作系统。

    操作符

    错误屏蔽( @

    一些操作符或者函数可能产生错误信息,错误屏蔽操作符用来阻止这些信息的产生。

    执行( ` )

    反引号操作符可以把反引号之间的字符串当作shell命令执行,并返回输出结果: `` $listing =ls`; echo $listing; // 输出文件目录
  1. ### 类型( `instanceof` )
  2. Instanceof 操作符用来测试一个变量是否为给定类的实例化对象,或者是一个接口的实现:

$a = new Foo; $isAFoo = $a instanceof Foo; // ture $isABar = $a instanceof Bar; // false

  1. ## 流程控制语句
  2. ### 新的写法
  3. PHP 支持很多传统编程结构,用来控制程序执行的流程。与传统的用一对大括号包括的写法不同, PHP 还提供了另外一种语法。使用一个冒号(`:`)作为流程控制语句的结尾,并且以特定的关键字作为流程控制语句块的结尾。

if ($user_balidated){ echo “Welocome!”; $greeted = 1; }else{ echo “Access Forbidden!”; exit; } //等价于 if ($user_balidated): // 这里不一样 echo “Welcome!”; $greeted = 1; else: // //这里不一样 echo “Access Forbidden!”; exit; endif; // 这里不一样

  1. 这里仅展示 `if` 的写法,其他语句与上面类似。
  2. ### break 与 continue
  3. PHP `break` `continue` 分别代表提前退出一个循环和跳到循环条件的下一次判断。不同的是,可以在关键词后面放一个数字,表示 `break` 要中断多少层循环。以 `break` 为例:

$i = 0; $j = 0; while($i < 10){ while($j < 10){ if ($j == 5){ break 2; } ++$j; } ++$i; } echo “{$i},{$j}”; // 0,5

  1. `break` 类似,`continue` 也可以退出多个层次的循环。
  2. ### declare
  3. `declare` 语句允许指定的一段代码执行指令。目前只有两种 `declare` 的方式:`ticks` `encoding` 指令
  4. #### ticks
  5. Tick(时间周期)是一个 `declare` 代码段中解释器每执行 `N` 条可计时的低级语句就会发生的事件。不是所有语句都可以计时。通常条件表达式和参数表达式都不可计时。<br />在每个 tick 中出现的事件是由 [register_tick_function()](https://www.php.net/manual/zh/function.register-tick-function.php) 来指定的。注意每个 tick 中可以出现多个事件。

declare(ticks=1); // 每执行一条语句时,tick_handler()就会被执行

// A function called on each tick event function tick_handler() { echo “tick_handler() called\n
“; }

register_tick_function(‘tick_handler’);

$a = 1;

if ($a > 0) { $a += 2; print($a); }

  1. #### encoding
  2. 使用 `encoding` 指令指定 PHP 脚本输出编码的格式

declare(encoding = “UTF-8”);

  1. PS : 这种语句在编译时要加上 `--enable-zend-multibyte` 的选项。否则没有效果。
  2. ### exit 和 return
  3. 脚本执行到 `exit` 语句时,就会停止执行。<br />`return` 语句一般用于某个函数退出返回,或者脚本停止执行。<br />`die()` 函数时 `exit` 语句的一个别名。
  4. ## 包含代码
  5. PHP 提供两种方式实现从另外的模块加载代码和 HTML 内容:`require` `include`
  6. - `require` 加载一个不存在的文件时,会产生一个致命的错误,进而脚本停止运行
  7. - `include` 加载一个不存在的文件时,会产生一个警告哦,不停止脚本的执行
  8. - 如果你多次引用同一个文件,但是你只想加载一次,可以使用 `include_once` `require_once`
  9. ## 在 Web 页面中嵌套 PHP
  10. ### 标准( XML )风格

<?php echo “Hello, world”; ?>

  1. ### SGML 风格

<? echo “Hello, world”; ?>

`` 这种形式被称为短标签,默认时关闭的。你可以在编译时增加-enable-short-tags选项,或者在 PHP 配置文件中打开short_open_tag` 。

感谢你看到了这里。如果文章有错误,请评论指正,谢谢!