一.PHP中的注释

1
2
3
4
5
6
7
8
9
// 或 # 单行注释

/*
多行注释
*/

/**
文档注释
*/

二.PHP中变量作用域

全局变量

  • 全局变量是在函数外部定义的变量,可以在任何地方访问。

局部变量

  • 局部变量是在函数内部定义的变量,只能在函数内部访问。

global 关键字

  • global 关键字用于在函数内部访问全局变量,变量前加上global为全局变量。

static 关键字

  • static 关键字用于在函数内部定义的变量,变量前加上static为静态变量。
1
2
3
4
5
6
7
function test() {
static $count = 0;
$count++;
echo $count;
# 每次使用static变量,都会保留上次的值
# 注意:该变量是函数的局部变量
}

三.PHP中EOF

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。

  • 必须后接分号,否则编译通不过。
  • EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
  • EOF 可以在字符串内部嵌套EOF
  • 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
  • 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
1
2
3
4
5
6
7
<?php
echo <<<EOF
<h1>第一个标题</h1>
<p>第一个段落。</p>
EOF;
// 结束需要独立一行且前后不能空格
?>

四.PHP中常量

常量的特征

  • 不变性: 常量一旦定义,其值不能改变
  • 全局作用域: 常量在定义后,可以在整个脚本的任何地方使用,无需使用 global 关键字。
  • 数据类型: 常量的值可以是标量数据类型(如布尔值、整数、浮点数、字符串)或数组(PHP 7 及以上版本)。
  • 区分大小写: 常量名称默认是区分大小写的。如果需要定义大小写不敏感的常量,可以在 define() 函数的第三个参数设置为 true。
  • 常量名不需要加 $ 修饰符。

定义常量

1
define(’常量名‘, 常量值,true(可选属性,不区分大小写));
1
const 常量名 = 常量值;

预定义常量

PHP 提供了一些预定义常量,可以在脚本中直接使用。这些常量通常用于获取 PHP 的配置信息、版本信息等。常见的预定义常量有:

  • PHP_VERSION当前 PHP 解析器的版本。
  • PHP_OS:服务器的操作系统。
  • PHP_INT_MAX:最大的整数值。
  • E_ERROR、E_WARNING、E_PARSE 等:错误报告级别。

实例

1
2
3
echo PHP_VERSION;(当前 PHP 解析器的版本)
echo PHP_OS;(输出服务器的操作系统)
echo PHP_INT_MAX;(输出最大的整数值)

五.字符串

字符串的特征

  • 字符串可以包含任意字符,包括空格、制表符、换行符等字符。

实例

1
2
$str = 'hello world';
echo $str;(输出 hello world)

strpos()函数

strpos() 函数用于在字符串内查找一个字符或一段指定的文本。
如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。

1
2
3
4
<?php
echo strpos("Hello world!","world");
?>
# 输出:6

运算符

递增/递减运算符

运算符 名称 描述
x++ 后递增 x+1再返回x
++x 预递增 先返回x再+1
x– 后递减 x-1再返回x
–x 预递减 先返回x再-1

比较运算符

运算符 名称 描述
x===y 完全等于 值和类型都相
x==y 等于 值相等
x!==y 不绝对等于 值或类型不相等
x!=y 不等于 值不相等
x<>y 不等于 值不相等

三目运算符

expr1 ? expr2 : expr3

如果 expr1 为 TRUE,则返回 expr2;否则返回 expr3。

实例

1
2
3
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
echo $username;
# 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值

组合比较符

组合比较符也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// 整型
echo 1 <=> 1; // 输出0
echo 1 <=> 2; // 输出-1
echo 2 <=> 1; // 输出1

// 浮点型
echo 1.5 <=> 1.5; // 输出0
echo 1.5 <=> 2.5; // 输出-1
echo 2.5 <=> 1.5; // 输出1


// 字符串
echo "a" <=> "a"; // 输出0
echo "a" <=> "b"; // 输出-1
echo "b" <=> "a"; // 输出1
?>

switch语句

基本结构

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
switch (expression) {
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
// 更多的 case 语句
default:
// 如果没有匹配的值
}
?>

expression 是要被比较的表达式。
case value: 是可能的值,如果 expression 的值等于某个 case 的值,就执行相应的代码块。
break; 用于终止 switch 语句,防止继续执行下一个 case。
default: 是可选的,用于指定当没有匹配的 case 时执行的代码块。

数组的排序函数

  • sort():对数组进行升序排序。

  • rsort():对数组进行降序排序。

  • asort():根据关联数组的值对数组进行升序排序。

  • arsort():根据关联数组的值对数组进行降序排序。

  • ksort():根据关联数组的键对数组进行升序排序。

  • krsort():根据关联数组的键对数组进行降序排序。

PHP的超级全局变量

超级全局变量列表:

  • $_REQUEST:包含所有请求参数的数组。

  • $_GET:包含所有 GET 请求参数的数组。

  • $_POST:包含所有 POST 请求参数的数组。

  • $_SESSION:包含所有 SESSION 请求参数的数组。

  • $_SERVER:包含所有 SERVER 请求参数的数组。

$_SERVER全局变量中的重要元素:

元素 描述
$_SERVER[‘PHP_SELF’] 当前脚本的路径
$_SERVER[‘SERVER_NAME’] 服务器名称
$_SERVER[‘SERVER_PORT’] 服务器端口
$_SERVER[‘REQUEST_METHOD’] 请求方法
$_SERVER[‘REQUEST_URI’] 请求 URI
$_SERVER[‘REMOTE_ADDR’] 客户端 IP 地址
$_SERVER[‘HOST’] 主机名

while语句

基本结构

1
2
3
4
5
<?php
while (条件) {
要执行的代码
}
?>

实例

1
2
3
4
5
6
7
<?php
$i = 0;
while ($i < 5) {
echo $i;
$i++;
}
?>

另一种结构

1
2
3
4
5
do
{
要执行的代码;
}
while (条件);

实例

1
2
3
4
5
6
7
8
9
<?php
$i = 0;
do
{
echo $i;
$i++;
}
while ($i < 5);
?>

for语句

基本结构

1
2
3
4
5
<?php
for (初始化; 条件; 增量) {
要执行的代码
}
?>

实例

1
2
3
4
5
6
<?php
$i = 0;
for ($i = 0; $i < 5; $i++) {
echo $i;
}
?>

foreach循环

foreach循环用于遍历数组。

基本结构

1
2
3
4
5
6
7
8
9
<?php
foreach (array as value){
要执行的代码
}
# 关联数组
foreach (array as key => value) {
要执行的代码
}
?>

实例

1
2
3
4
5
6
7
<?php
$x=array(1=>"Google", 2=>"Runoob", 3=>"Taobao");
foreach ($x as $key => $value)
{
echo "key 为 " . $key . ",对应的 value 为 ". $value . PHP_EOL;
}
?>

PHP函数中的魔法变量

FILE

__FILE__魔法变量用于获取当前脚本的路径。

LINE

__LINE__魔法变量用于获取当前脚本的行号。

NAMESPACE

__NAMESPACE__魔法变量用于获取当前命名空间。

CLASS

__CLASS__魔法变量用于获取当前类的名称。

METHOD

__METHOD__魔法变量用于获取当前方法的名称。

FUNCTION

__FUNCTION__魔法变量用于获取当前函数的名称。

DIR

__DIR__魔法变量用于获取当前脚本所在目录。

类和面向对象

类的定义格式

1
2
3
4
5
6
7
8
9
10
11
<?php
class phpClass {
var $var1;
var $var2 = "constant string";

function myfunc ($arg1, $arg2) {
[..]
}
[..]
}
?>
  • 使用 class 关键字后加上类名定义。
  • 类名后的一对大括号({})内可以定义变量和方法。
  • 类的变量使用 var 来声明, 变量也可以初始化值。
  • 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问。

实例

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
<?php
class Site {
/* 成员变量 */
var $url;
var $title;

/* 成员函数 */
function setUrl($par){
$this->url = $par;
}

function getUrl(){
echo $this->url . PHP_EOL;
}

function setTitle($par){
$this->title = $par;
}

function getTitle(){
echo $this->title . PHP_EOL;
}
}
# this 关键字用于在类内部访问当前对象的属性和方法,$this->当前对象的属性名。
?>

调用函数

1
2
3
4
5
6
7
<?php
$site = new Site();
$site->setUrl("www.baidu.com");
$site->getUrl();
$site->setTitle("百度");
$site->getTitle();
?>

构造函数

构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。

实例

1
2
3
4
5
6
7
8
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
$runoob = new Site('www.runoob.com', '菜鸟教程');
$runoob->getUrl();
$runoob->getTitle();
# 可以在构造函数中初始化对象成员变量赋初始值,不需要再调用 setTitle 和 setUrl 方法了

析构函数

析构函数是一种特殊的方法。主要用来在对象被销毁时执行一些清理工作。
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class MyDestructableClass {
function __construct() {
print "构造函数\n";
$this->name = "MyDestructableClass";
}

function __destruct() {
print "销毁 " . $this->name . "\n";
}
}

$obj = new MyDestructableClass();
?>

输出结果:

1
2
构造函数
销毁 MyDestructableClass

继承

PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:

1
2
3
class Child extends Parent {
// 代码部分
}

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php 
// 子类扩展站点类别
class Child_Site extends Site {
var $category;

function setCate($par){
$this->category = $par;
}

function getCate(){
echo $this->category . PHP_EOL;
}
}
#Child_Site 类继承了 Site 类,并扩展了功能
?>

方法重写

如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

1
2
3
4
5
6
7
8
9
function getUrl() {
echo $this->url . PHP_EOL;
return $this->url;
}

function getTitle(){
echo $this->title . PHP_EOL;
return $this->title;
}

方法的访问控制

方法 访问控制 描述
public 公共 所有对象都可以访问
protected 受保护 子类和父类可以访问
private 私有 只有当前类可以访问
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
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';

function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}

$obj = new MyClass();
echo $obj->public; // 这行能被正常执行
echo $obj->protected; // 这行会产生一个致命错误
echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private

?>