PHP基础

写在前面

简单过一下php的基础语法,记录下与其他语言不同的地方,相同的就直接略过了。

PHP标记风格

<?php 代码 ?>
官方推荐风格
<? 代码 ?>
短标记风格,需配置文件php.ini中开启short+open_tag
<% 代码 %>
ASP风格,需配置文件php.ini中开启asp_tags
<script language=”php”> 代码 </script>
JavaScript标记的风格,这种风格在任何情况下都可以使用。

变量

变量声明

变量类型

PHP 支持 10 种原始数据类型。

四种标量类型:

  • bool(布尔型)
  • int(整型)
  • float(浮点型)
  • string(字符串)

四种复合类型:

  • array(数组)
  • object(对象)
  • callable(可调用)
  • iterable(可迭代)

最后是两种特殊类型:

  • resource(资源)
  • NULL(无类型)

如果想查看某个表达式的值和类型,用 var_dump() 函数。

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来(字符 ')。

要表达一个单引号自身,需在它的前面加个反斜线(\)来转义。要表达一个反斜线自身,则用两个反斜线(\\)。其它任何方式的反斜线都会被当成反斜线本身:也就是说如果想使用其它转义序列例如 \r 或者 \n,并不代表任何特殊含义,就单纯是这两个字符本身。

// 可以录入多行
echo 'You can also have embedded newlines in
strings this way as it is
okay to do';

// 输出: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// 输出: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

双引号

如果字符串是包围在双引号(")中, PHP 将对以下特殊的字符进行解析:

序列 含义
\n 换行(ASCII 字符集中的 LF 或 0x0A (10))
\r 回车(ASCII 字符集中的 CR 或 0x0D (13))
\t 水平制表符(ASCII 字符集中的 HT 或 0x09 (9))
\v 垂直制表符(ASCII 字符集中的 VT 或 0x0B (11))
\e Escape(ASCII 字符集中的 ESC 或 0x1B (27))
\f 换页(ASCII 字符集中的 FF 或 0x0C (12))
\\ 反斜线
\$ 美元标记
\" 双引号
\[0-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符,which silently overflows to fit in a byte (e.g. "\400" === "\000")
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
\u{[0-9A-Fa-f]+} 匹配正则表达式的字符序列是 unicode 码位, 该码位能作为 UTF-8 的表达方式输出字符串

例如

<?php
echo "Hello World! \n Hello World!";
?>
  
  //输出
  Hello World! 
 Hello World!

数组

可以用 array() 语言结构来新建一个数组array。它接受任意数量用逗号分隔的 键(key) => 值(value) 对。可以用短数组语法 [] 替代 array()

<?php
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 使用短数组语法
$array = [
    "foo" => "bar",
    "bar" => "foo",
];
?>

数组操作符

implode()和explode()

implode

explode

全局变量

自定义常量

boolean define(string name,mixed value[, bool case_insensitive])
当case_insensitive为true时,常量名不区分大小写

面向对象

魔术方法

__wakeup() //使用unserialize时触发
__sleep() //使用serialize时触发
__destruct() //对象被销毁时触发
__call() //在对象上下文中调用不可访问的方法时触发
__callStatic() //在静态上下文中调用不可访问的方法时触发
__get() //用于从不可访问的属性读取数据
__set() //用于将数据写入不可访问的属性
__isset() //在不可访问的属性上调用isset()或empty()触发
__unset() //在不可访问的属性上使用unset()时触发
__toString() //把类当作字符串使用时触发,file_exists()判断也会触发
__invoke() //当脚本尝试将对象调用为函数时触发

构造函数 __construct,类实例化时调用,构造函数可以有参数

这狗函数__destruct,对象被销毁时调用,不可以有参数

parent关键字:使用parent::关键字访问父类

其他魔术方法

__clone方法会重写clone,当使用clone时,不仅会复制变量,还会执行__clone里面的代码

__autoload()方法会在第一次引用一个类时调用该方法,可以通过定义这个函数来启用类的自动加载

__get/ __set用于处理类内未定义的属性或者处理私有属性

__call

调用流程如下:

$this->a() ==> 当前类a方法 ==> 父类a方法 ==> 当前类__call方法 ==> 父类__call方法

如果触发__call方法,那么a,即方法名,会作为__call的方法的第一个参数,而参数列表会作为__call的方法第二个参数。

来看到代码

function __destruct(){
    $this->a->b();
}

其他

-> 符号用来调用某个对象中的属性或方法,如$this->name $this->setName()
@ 可以屏蔽错误信息,如常见的@eval
const 定义类属性
&$tmp   指向$tmp的引用,类似于指针