随便看看 PHP

最后更新:
阅读次数:

第一次接触 PHP 是在一年前折腾 WordPress 时。现在是因为项目所需,并且需要用 PHP 操作数据库,所以再稍微深入地学习学习 PHP 的语法,方便开发。

学习路线: 先简单过一遍 菜鸟教程上的 PHP 教程,然后有选择性地再过一遍 PHP 官方文档(PHP 手册)

数据类型(9 种原始类型)

Boolean 布尔类型

  • TRUEFALSE不区分大小写,即 true 和 TrUe 是一个值)

Integer 整型

Float 浮点型

String 字符串类型

在 PHP 中,一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。这意味着 PHP 只能支持 256 的字符集,因此不支持 Unicode 。

  • 无法在单引号括住的字符串中直接使用变量或特殊的转义序列(比如换行\n
  • 在双引号括住的字符串中可以直接使用变量,但是有些注意事项,看下面代码
<?php
$str = 'abc';

echo "$strdef\n"; // 啥也不输出
echo "$str def\n"; // abc def
echo "{$str}def\n"; // abcdef
echo "{ $str}def\n"; // { abc}def
echo "${str}def\n"; // abcdef (这个像 ES6 里的模板字符串)
?>
  • 字符串可以被当作数组通过索引来访问相应的字符
<?php
$str = 'abcd';
echo $str[1]; // b
echo $str{2}; // c
?>
  • php 中使用小数点 . 来连接两个字符串

Array 数组

PHP 中的数组实际上是一个有序映射。而映射是一种把 values 关联到 keys 的类型。所以 PHP 中的数组可以代表其他编程语言中的很多数据类型,比如 真正的数组、列表、字典、集合等。

<?php
// 定义一个数值数组
$arr = array(1,2,'aa');

// 定义一个简单的关联数组
$arr = array(
"name" => "percy",
"age" => 22
);

// 自 PHP 5.4 起,可以使用 [] 来代替 array()
$arr = [1,2,'aa'];
$arr = [
"name" => "percy",
"age" => 22
];
?>
  • 虽说 PHP 的数组很叼,但是其数组的键也只能是一个 integer 或是一个 string,不能是数组或对象。
<?php
$arr = [
"name" => "percy",
"age" => 22
];

echo $arr['name']; // percy
echo $arr{'name'}; // percy
?>

Object 对象

  • php 中的对象可就和 js 中的对象的意思就不大一样了,PHP 中的对象是指实例化一个类后所创建的东西叫做对象。

Resource 资源类型

资源 resource 是一种特殊变量,它保存了到外部资源的一个引用。

待定。。

NULL

特殊的 NULL 值表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。

Callback / Callable 类型(待定)

数据类型转换

  • 强制类型转换(很像 C 语言里的类型转换)
<?php
$a = 123;
$b = "12.3aaa";

$a = (string)$a;
$b = (float)$b;

echo $a; // '123'
echo $b; // 12.3

(int)$b; // 12
(bool)$b; // true
unset($b); // NULL
?>
  • 使用内置函数进行类型转换
<?php
$a = '12.2asd';
echo boolval($a); // true
echo intval($a); // 12
echo floatval($a); // 12.2
echo strval($a); // 12.2asd
?>

变量相关

PHP 中的变量用一个美元符号 $ 后面跟变量名来表示。变量名是区分大小写的。

  • 命名规则: /[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,这里用正则表达式表示,可以看出来,PHP 中的变量名可以是中文。(厉害了~)
<?php
$中国 = "China";
echo $中国; // China
?>

虽说可以用中文,但是不建议使用,鬼知道用到后面时会不会出现中文乱码等让人烦心的问题。(PHP 业内人士对使用中文变量名是怎样的态度就不得而知了)

注意: $this 是一个特殊的变量,它不能被赋值。

  • 除过普通的按值赋值外,PHP 还支持引用赋值
<?php
$a = "我爱烤串";
$b = &$a; // 引用赋值

echo $a,$b; // 我爱烤串我爱烤串

$a = "So sad~";

echo $a,$b; // So sad~So sad~
?>

global 和 static 关键字

  • 函数内使用全局变量需用 global 关键字声明
<?php
$global_pi = 3.14;

function test()
{
global $global_pi;
echo $global_pi;

// 要是不写上面的语句,也可以直接使用 $GLOBALS 访问全局变量
// echo $GLOBALS['global_pi'];
}
test(); // 3.14
?>
  • 用 static 关键字声明函数作用域中的静态变量
<?php
function test()
{
static $count = 0;
$count++;
echo $count;
}
test(); // 1
test(); // 2
test(); // 3
?>

可变变量

  • 可变变量(就是在原变量前再加一个 $ 符号,实际上是把原变量的值当做了当前变量的变量名)
<?php
$a = 'b';
$$a = 'hello';

echo $a; // b
echo $$a; // hello
echo $b; // hello
?>

超级全局变量

  • $GLOBALS: 数组,包含所有的全局变量

  • $_SERVER: 数组,包含服务器和执行环境的一些信息

  • $_GET: 数组,接收客户端通过 GET 方法发送过来的数据

  • $_POST: 数组,接收客户端通过 POST 方法发送过来的数据

  • $_COOKIE: 数组,接收 HTTP 请求之间传递的 cookie

  • $_REQUEST: 数组,包含了 $_GET$_POST$_COOKIE 中的数据

  • $_FILES: 数组,接收客户端上传的文件

  • $_SESSION: 数组,接收或存储 session 变量

常用的处理变量的函数

  • string gettype($variable): 返回变量的类型

  • bool print_r($variable): 打印易于理解的变量信息

<?php
$str = ['a','b','c'];
echo $str; // Array
print($str); // Array
print_r($str);
// Array
// (
// [0] => a
// [1] => b
// [2] => c
// )
?>
  • void var_dump($variable): 打印变量的相关信息
<?php
var_dump(12.3); // float(12.3)
var_dump('abc'); // string(3) "abc"

var_dump([1,2,'a']);
// array(3) {
// [0]=> int(1)
// [1]=> int(2)
// [2]=> string(1) "a"
// }
?>
  • bool isset($variable): 判断给定的变量是否设置,如果 $variable 存在并且值不是 NULL 则返回 TRUE,否则返回 FALSE。

  • void unset($variable): 释放或销毁指定的变量

常量

  • 定义 PHP 的常量,注意 PHP 中的常量没有 $ 符号
<?php
// 使用 define(name, value) 进行定义常量
define('PI', 3.14);
echo PI; // 3.14

// 使用 const 关键字进行声明常量
const COUNT = 333;
echo COUNT; // 333
?>
  • 魔术常量,就是一些在 PHP 中预定义的常量(前后均为两个下划线)
    • __LINE__: 返回当前代码所在的行号
    • __FILE__: 返回当前代码所在文件的绝对路径(包括文件名)
    • __DIR__: 返回当前代码所在文件的绝对路径(不包括文件名)
    • __FUNCTION__: 返回当前代码函数的函数名
    • __CLASS__: 返回当前代码所在类的类名
    • __NAMESPACE__: 返回当前代码所在的命名空间

运算符

  • 2 ** 3 = 8,幂运算符
  • 引用赋值:$b = &$a
  • PHP 中有递增或递减运算符 $a++$a--
  • PHP 中的逻辑运算符:andor(或&&||
  • .:连接两个字符串
  • +:联合两个数组(若有相同键名的话,第二个不会覆盖第一个)
<?php
$a = [1,2,3];
$b = ['a','b','c','d'];

print_r($a+$b);
// Array
// (
// [0] => 1
// [1] => 2
// [2] => 3
// [3] => d
// )
?>

流程控制

  • PHP 中的多重条件选择语句时 if( ){ }elseif( ){ }else{ }注意是 elseif
  • 流程控制的替代写法(endif;,endwhile;,endfor;,endforeach; 以及 endswitch;)
// 传统写法
<?php if($page == "home"){ ?>
<div id="home">Home Page</div>
<?php } ?>

// 替代写法
<?php if($page == "home"): ?>
<div id="home">Home Page</div>
<?php endif; ?>
  • foreach 用来遍历数组或对象
// 语法如下
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement
  • include、require 语句: 用来引入其他 PHP 文件

函数

PHP 函数的定义方式和 js 都像。传参也和 js 类似,只不过 PHP 可以传递引用 function func(&$a){}

这一块儿没啥好说的,主要是 PHP 有很多很多内置函数。

PHP 面向对象编程

不细说了,PHP 在面向对象上的很多语法和 Java 挺像的。下面写了段代码来阐明概念。(一码解千愁~)

<?php
// php 面向对象编程

class Father
{
// 成员变量
var $language = 'Chinese';
var $sex = 'man';

// 私有常量
private const MATH_PI = 3.1415926;

// 成员方法
function isMan()
{
return 'yes, a man';
}

function who()
{
echo 'I am father~'."\n";
}

public function getPI()
{
return self::Math_PI;
}
}

// 类 Son 继承自类 Father
// 注意,php 不支持多重继承
class Son extends Father
{
// 成员变量,要用 var 进行声明
var $language = 'Chinese & English';

// 构造函数,用来初始化对象
// 统一使用 __construct 来命名一个构造函数
function __construct($name, $age)
{
// 变量 $this 代表自身的对象
$this->name = $name;
$this->age = $age;
}

// 析构函数,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数
// 统一使用 __destruct 来命名一个析构函数
function __destruct()
{
echo "调用了析构函数~\n";
}


// 成员函数
function getName()
{
return $this->name;
}
function setName($newName)
{
$this->name = $newName;
}

// 方法重写,重写父类的方法
function who()
{
echo 'I am son~'."\n";
}
}

// 实例化类,形成一个对象
$son = new Son('jack', 22);

// 调用子类的属性方法
echo $son->language."\n";
echo $son->getName()."\n";

// 调用子类继承的属性方法
echo $son->sex."\n";
echo $son->isMan()."\n";

// 实例调用类的共有属性时,注意不要加 $ 符号
echo $son->$language."\n"; // 调用失败


// php 访问控制(若未声明访问控制关键字,则默认为 public)
// public(公有):公有的类成员可以在任何地方被访问
// protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问
// private(私有):私有的类成员则只能被其定义所在的类访问


/** 下面也是 php 面向对象的一部分内容,很多知识点类似 Java **/

// 接口 interface
// 类使用关键字 implements 来实现一个接口
// 类中的常量 const PI = '3.14';
// 抽象类
// 声明类属性或方法为 static(静态),就可以不实例化类而直接访问
// final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。
?>

异常处理

  • try{throw...}catch(){}finally{}
<?php
try {
$a = 12;
$b = 0;
if ($b == 0) {
throw new Exception('Division by zero.');
}
echo $a/$b;
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}finally{
echo "this is finally statement\n";
}
?>

以上。。。(本文涉及到的 PHP 内置函数较少,后面会补一些常用的内置函数)