PHP基础学习笔记

PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用

PHP的超全局变量

基础

  • 描述变量使用$或者${}, 前者会匹配更多字符让其合法
  • <?php echo==<?=
  • 纯php文件文末结束符可省略
  • 支持#,//,/* */注释(//,#后面的?>不会被注释), /* */不可嵌套
  • PHP 支持 10 种原始数据类型
  • 如果想查看某个表达式的值和类型,用 var_dump() 函数。
  • 如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype() 函数。要检验某个类型,不要gettype(),而用 is_type 函数
  • 如果要将一个变量强制转换为某类型,可以对其使用强制转换或者 settype() 函数, 使用*符号也能改变类型

整型

  • 要使用八进制表达,数字前必须加上 0(零)。要使用十六进制表达,数字前必须加上 0x。要使用二进制表达,数字前必须加上 0b
  • 将 resource 转换成 integer 时, 结果会是 PHP 运行时为 resource 分配的唯一资源号
  • PHP 7.4.0 之前不支持_, 如1_234

浮点型

  • 永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数
  • 由于 NAN 代表着任何不同值,不应拿 NAN 去和其它值进行比较,包括其自身,应该用 is_nan() 来检查

String字符串

  • ..=
1
2
3
4
5
6
7
<?php
$a = "Hello ";
$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";
$a .= "World!"; // now $a contains "Hello World!"
?>
  • 单引号代表的字符串里的\转义符能转'\两个字符, \n没有任何含义, 在单引号里的$失去了变量的含义(类似linux)
  • 双引号里的\能转移一些特殊字母和解析$变量
  • {}里面可以使用多重变量, 如
1
2
3
4
5
6
7
8
9
10
11
<?php
class foo {
var $bar = 'I am bar.';
}

$foo = new foo();
$bar = 'bar';
$baz = array('foo', 'bar', 'baz', 'quux');
echo "{$foo->$bar}\n";
echo "{$foo->{$baz[1]}}\n";
?>
  • []与{}都可以访问字符串片段
  • .可以连接字符串

heredoc结构

类似linux的cat > file.name << eof, 可输入转义字符和变量, 如

1
2
3
4
5
6
7
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;
?>

更多用法

newdoc结构

  • 与heredoc的区别是不具备转义和解析变量的能力
1
2
3
4
5
6
7
<?php
$str = <<<'EOD'
Example of string
spanning multiple lines
using nowdoc syntax.
EOD;
?>

Array数组

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
"foo" => "bar",
"bar" => "foo",
];
?>
  • PHP的Array支持键值对
  • 可以使用array()或者[]初始化一个array对象
  • key只能是intergestring
  • 使用print_r或者var_dump函数来输出array
  • 要删除某键值对,对其调用 unset() 函数。
  • unset() 函数允许删除数组中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数
  • foreach 控制结构是专门用于数组的。它提供了一个简单的方法来遍历数组。
  • 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

Iterable

Iterable是 PHP 7.1 中引入的一个伪类型。它接受任何 array 或实现了 Traversable 接口的对象。这些类型都能用 foreach 迭代, 也可以和 生成器 里的 yield from 一起使用

  • 类在扩展/实现(extending/implementing)的时候, 可以将参数类型从 array 或 Traversable 放宽到 iterable, 也可以将返回类型 iterable 的范围缩小到 array 或 Traversable

Resource

资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。所有这些函数及其相应资源类型见附录

参见 get_resource_type()

持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。参见数据库永久连接一章

NULL

null不区分大小写

PHP8.0.0新增了一个类型mixed, 代表任意类型

namespace可以避免与其它用户空间代码出现命名空间冲突

变量

  • PHP 提供了大量的预定义变量, 超全局变量列表
  • PHP 中全局变量在函数中使用时必须声明为 global或者使用$GLOBALS数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# global
<?php
$a = 1;
$b = 2;

function Sum() {
global $a, $b;

$b = $a + $b;
}

Sum();
echo $b;

# GLOBALS
$a = 1;
$b = 2;

function Sum()
{
$GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}

Sum();
echo $b;
?>
  • 静态变量在离开函数后不会被销毁, 声明static $var
  • 可变变量使用$$

要将可变变量用于数组,必须解决一个模棱两可的问题。这就是当写下 $$a[1] 时,解析器需要知道是想要 $a[1] 作为一个变量呢,还是想要 $$a 作为一个变量并取出该变量中索引为 [1] 的值。解决此问题的语法是,对第一种情况用 ${$a[1]},对第二种情况用 ${$a}[1]

对于对象, $foo->$bar将bar解析后作为foo的属性

注意: 在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用

常量

  • 定义规则^[a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]*$
  • 使用define(name, value) 和const定义一个常量

const打小写敏感

表达式

  • 三元表达式
1
$first ? $second : $third

运算符

  • 除了基本的比较运算符外, PHP还支持===(值与类型相等)!==
  • PHP支持递增和递减运算符和**运算符
  • PHP 支持引用赋值,使用$var = &$othervar;语法。引用赋值意味着两个变量指向了同一个数据(类型linux硬链接)

对象复制

  • new 运算符自动返回一个引用,因此对 new 的结果进行引用赋值是错误的
  • NULL 合并运算符??
  • <=>返回-1 0 1
  • PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

@ 运算符只对表达式有效。对新手来说一个简单的规则就是:如果能从某处得到值,就能在它前面加上 @ 运算符

  • (``)命令执行运算符
1
2
3
4
<?php
$output = `ls -al`;#输出当前目录所有文件及详细信息
echo "<pre>$output</pre>";
?>

在windows上, 如果输出是二进制文件, 需要使用popen(), 因为windows的管道是以文件形式打开的

  • &&,||,and,or运算优先级高.
  • 数组运算符
  • instanceof 用于确定一个 PHP 变量是否属于某一类 class,确定一个变量是不是继承自某一父类的子类

流程控制

  • elseifelse if语义一样, 区别在于前者可以使用冒号, 后者不行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

/* 不正确的使用方法: */
if ($a > $b):
echo $a." is greater than ".$b;
else if ($a == $b): // 将无法编译
echo "The above line causes a parse error.";
endif;


/* 正确的使用方法: */
if ($a > $b):
echo $a." is greater than ".$b;
elseif ($a == $b): // 注意使用了一个单词的 elseif
echo $a." equals ".$b;
else:
echo $a." is neither greater than or equal to ".$b;
endif;

?>
  • PHP 提供了一些流程控制的替代语法,包括 ifwhileforforeachswitch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;endwhile;endfor;endforeach; 以及 endswitch;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php if ($a == 5): ?>
A is equal to 5
<?php endif; ?>

<?php
if ($a == 5):
echo "a equals 5";
echo "...";
elseif ($a == 6):
echo "a equals 6";
echo "!!!";
else:
echo "a is neither 5 nor 6";
endif;
?>

注意如果不是^<?php这样写的话会输出空格

  • foreach不支持使用@来抑制错误信息

函数

  • 使用默认参数时,任何默认参数必须放在任何非默认参数的右侧
  • ...指定可变参数, 也可用于传递array作为函数参数
  • :命名参数允许传入乱序的参数, 需要指定参数名
  • 命名参数也可以与位置参数相结合使用。此种情况下,命名参数必须在位置参数之后
  • PHP支持可变函数, 函数名和方法名都可以使用变量指定
  • 箭头函数支持与 匿名函数 相同的功能,只是其父作用域的变量总是自动的
    • 会参考参数去父作用域中寻找是否有该值
  • 匿名函数需要使用use继承父作用域的变量
1
2
3
4
5
6
$message = 'hello';

// 继承 $message
$example = function () use ($message) {
var_dump($message);
};
  • 匿名函数会自动绑定当前实例this, 可以使用静态匿名函数阻止绑定

常用函数

1
2
3
4
# 取整(PHP4,5,6,7,8),参数mode传入常量,代表四舍五入还是直接舍去小数
round ( float $val , int $precision = 0 , int $mode = PHP_ROUND_HALF_UP ) : float
# 整除(PHP7,8)
intdiv ( int $dividend , int $divisor ) : int

语言结构

语言结构就是PHP本身支持的语句, 比如echo, print等.

与函数的区别在于语句的运行速度快, 但缺少了函数的一些特性, 比如函数可以接受其他函数返回的参数等

文本处理

RCRE

作者

manu

发布于

2021-03-09

更新于

2023-01-06

许可协议

# 相关文章
  1.CI框架
# 推荐文章
  1.ALTER
  2.数据库笔记
  3.微信小程序笔记
  4.动态调试-OD
  5.winPE结构
  6.git指令

:D 一言句子获取中...