飞机的 PHP 学习笔记一:语言基础

前言

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

大小写

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

注释

PHP 有多种注释方式,这些方式都是借鉴现有的语言(C、C++、UNIX shell)

其中 shell 风格的注释使用 # 来标识。

数据类型

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

  • 四种是标量型(单值)的:整形、浮点数(实数)、字符串和布尔型。

  • 两种复合类型(集合):数组和对象。

  • 剩下的两种是特殊类型:资源和 NULL 。

  • 十六进制以 0x 开头,字母是可以大写或小写,但通常是大写

  • 八进制以 0 开头。

  • 二进制以 0b 开头。

  • 变量在双引号中会被解析(解释),而在单引号中,他们不会被解析:

    $name = "Guido";
    echo "Hi, $name\n"; // Hi, Guido
    echo 'Hi, $name'; // Hi, $name
  • 在 PHP 中,以下值的计算结果为 false

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

变量的变量

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

变量的引用

在PHP中,引用就是如何创建变量的别名。可以说两个变量储存了相同的值。

销毁其中一个变量的值,不会影响另一个变量的值。

$bigLongVariableName = "PHP";
$short =& $bigLongVariableName;
$bigLongVariableName .= " rocks!";
print "\$short is $short\n"; // $short is PHP rocks!
print "Long is $bigLongVariableName\n"; // Long is PHP rocks!

$short = "Programing $short";
print "\$short is $short\n"; // $short is Programming PHP rocks!
print "Long is $bigLongVariableName\n"; // Long is Programming PHP rocks!

$white = "snow";
$black =& $white;
unset($white);
print $black; //snow

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

变量的作用域

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

为了让函数访问全局变量共有两个方法:

方法一:使用 global 关键字

function updateCounter()
{
    global $counter;
    $counterr++;
}

$counter = 10;
updateCounter();
echo $counter; // 11

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

function updateCounter()
{
    $GLOBALS[counter]++:
}

$counter = 10;
updateCounter();
echo $counter; // 11

静态变量 ( static )

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

function updateCounter()
{
    static $counter = 0;
    $counter++;

    echo "Static counter is now {$counter}\n";
}

$counter = 10;
updateCounter(); // Static counter is now 1
updateCounter(); // Static counter is now 2 // 不会再被付初始值
echo "Global couter is {$couter}\n"; // Global counter is 10

隐式转换

当二元算数操作符是两个不同的类型时 PHP 会根据需要自动转换,其中的阶梯为:字符串 -> 整数 -> 浮点数。

假定一个字符串以一个整数或浮点数开始。如果未在字符串的开始处发现任何数字,该字符串的数值为0。如果字符串包含一个点( . )或大写/小写的 e ,对该字符串的求值则生成一个浮点数。例如:

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

除法操作符

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

自动递增操作符

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

$a = "z";
echo  ++$a; // "aa"

垃圾收集

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

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

操作符

错误屏蔽( @

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

执行( ` )

反引号操作符可以把反引号之间的字符串当作shell命令执行,并返回输出结果:

$listing = `ls`;
echo $listing; // 输出文件目录

类型( instanceof

Instanceof 操作符用来测试一个变量是否为给定类的实例化对象,或者是一个接口的实现:

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

流程控制语句

新的写法

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; // 这里不一样

这里仅展示 if 的写法,其他语句与上面类似。

break 与 continue

PHP 中 breakcontinue 分别代表提前退出一个循环和跳到循环条件的下一次判断。不同的是,可以在关键词后面放一个数字,表示 break 要中断多少层循环。以 break 为例:

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

break 类似,continue 也可以退出多个层次的循环。

declare

declare 语句允许指定的一段代码执行指令。目前只有两种 declare 的方式:ticksencoding 指令

ticks

Tick(时间周期)是一个 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。不是所有语句都可以计时。通常条件表达式和参数表达式都不可计时。

在每个 tick 中出现的事件是由 register_tick_function() 来指定的。注意每个 tick 中可以出现多个事件。

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

// A function called on each tick event
function tick_handler()
{
  echo "tick_handler() called\n <br/>";
}

register_tick_function('tick_handler');

$a = 1;

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

encoding

使用 encoding 指令指定 PHP 脚本输出编码的格式

declare(encoding = "UTF-8");

PS : 这种语句在编译时要加上 --enable-zend-multibyte 的选项。否则没有效果。

exit 和 return

脚本执行到 exit 语句时,就会停止执行。

return 语句一般用于某个函数退出返回,或者脚本停止执行。

die() 函数时 exit 语句的一个别名。

包含代码

PHP 提供两种方式实现从另外的模块加载代码和 HTML 内容:requireinclude

  • require 加载一个不存在的文件时,会产生一个致命的错误,进而脚本停止运行
  • include 加载一个不存在的文件时,会产生一个警告哦,不停止脚本的执行
  • 如果你多次引用同一个文件,但是你只想加载一次,可以使用 include_oncerequire_once

在 Web 页面中嵌套 PHP

标准( XML )风格

<?php echo "Hello, world"; ?>

SGML 风格

<? echo "Hello, world"; ?>

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

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

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!