PHP 是一门弱类型语言
PHP 会根据变量的值,自动把变量转换为正确的数据类型。
在强类型的编程语言中,我们必须在使用变量前先声明(定义)变量的类型和名称。
PHP变量的作用域
PHP 有四种不同的变量作用域:
- local
- global
- static
- parameter
局部和全局作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问:
<?php
$x=5; // 全局变量
function myTest()
{
$y=10; // 局部变量
echo "<p>测试变量在函数内部:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
}
myTest();
echo "<p>测试变量在函数外部:<p>";
echo "变量 x 为: $x";
echo "<br>";
echo "变量 y 为: $y";
?>
在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:
<?php
$x=5;
$y=10;
function myTest()
{
global $x,$y;
$y=$x+$y;
}
myTest();
echo $y; // 输出 15
?>
PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}
myTest();
echo $y;
?>
Static 作用域
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除,可以使用 static关键字
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
参数作用域
参数是通过调用代码将值传递给函数的局部变量。
参数是在参数列表中声明的,作为函数声明的一部分:
<?php function myTest($x) { echo $x; } myTest(5); ?>
PHP echo 和 print 语句
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。
echo 和 print 都是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo() print print()。
对象
在 PHP 中,对象必须声明。
首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。
数组排序
PHP - 数组排序函数
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_COOKIE
- $_FILES
- $_ENV
- $_SESSION
$GLOBAL 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;
$_REQUEST 用于收集HTML表单提交的数据。
$_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
$_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。
$_GET 也可以收集URL中发送的数据。
魔术变量
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
- _LINE__
文件中的当前行号。 - FILE
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。 - DIR
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。 - FUNCTION
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。 - CLASS 类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 FooBar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。
- TRAIT Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。Trait 名包括其被声明的作用区域(例如 FooBar)。从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
- METHOD 类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
- NAMESPACE 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。
命名空间
PHP 命名空间(namespace)是在PHP 5.3中加入的,在PHP当中有着相当重要的意义。
PHP 命名空间可以解决以下两类问题:
- 用户代码与PHP内部的类/函数/常量之间的名字冲突。
- 创建别名(或简短)的名称,提高源代码的可读性。
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
命名空间使用
PHP 命名空间中的类名可以通过三种方式引用:
-
非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。~~无命名空间前缀的引用,默认在当前命名空间查找,然后到全局命名空间找
-
限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo(); 或 subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo。 ~~带相对命名空间前缀的(类似相对路径)引用,自动在开头添加调用代码所处的命名空间
-
完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo(); 或 currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo。~~带绝对命名空间前缀的引用(类似绝对路径) 引用路径已明确 不用查找
关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。
使用命名空间:后备全局函数/常量
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。
- 类名称总是解析到当前命名空间中的名称(找不到就报错咯)。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称
- 函数和常量来说,如果当前命名空间中不存在该函数或常量,PHP 会退而使用全局空间中的函数或常量。
全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。
Filesystem 函数
- basename() 返回路径中的文件名部分。
- chgrp() 改变文件组。
- chmod() 改变文件模式。
- chown() 改变文件所有者。
- clearstatcache() 清除文件状态缓存。
- copy() 复制文件。
- delete() 参见 unlink() 或 unset()
- dirname() 返回路径中的目录名称部分。
- disk_free_space() 返回目录的可用空间。
- disk_total_space() 返回一个目录的磁盘总容量。
- diskfreespace() disk_free_space() 的别名。
- fclose() 关闭打开的文件。
- feof() 测试文件指针是否到了文件末尾。
- fflush() 向打开的文件刷新缓冲输出。
- fgetc() 从打开的文件中返回字符。
- fgetcsv() 从打开的文件中解析一行,校验 CSV 字段。
- fgets() 从打开的文件中返回一行。
- fgetss() 从打开的文件中返回一行,并过滤掉 HTML 和 PHP 标签。
- file() 把文件读入一个数组中。
- file_exists() 检查文件或目录是否存在。
- file_get_contents() 把文件读入字符串。~~获取文件内容
- file_put_contents() 把字符串写入文件。~~写入文件内容
- fileatime() 返回文件的上次访问时间。
- filectime() 返回文件的上次修改时间。
- filegroup() 返回文件的组 ID。
- fileinode() 返回文件的 inode 编号。
- filemtime() 返回文件内容的上次修改时间。
- fileowner() 返回文件的用户 ID (所有者)。
- fileperms() 返回文件的权限。
- filesize() 返回文件大小。
- filetype() 返回文件类型。
- flock() 锁定或释放文件。
- fnmatch() 根据指定的模式来匹配文件名或字符串。
- fopen() 打开一个文件或 URL。
- fpassthru() 从打开的文件中读数据,直到文件末尾(EOF),并向输出缓冲写结果。
- fputcsv() 把行格式化为 CSV 并写入一个打开的文件中。
- fputs() fwrite() 的别名。
- fread() 读取打开的文件。
- fscanf() 根据指定的格式对输入进行解析。
- fseek() 在打开的文件中定位。
- fstat() 返回关于一个打开的文件的信息。
- ftell() 返回在打开文件中的当前位置。
- ftruncate() 把打开文件截断到指定的长度。
- fwrite() 写入打开的文件。
- glob() 返回一个包含匹配指定模式的文件名/目录的数组。
- is_dir() 判断文件是否是一个目录。
- is_executable() 判断文件是否可执行。
- is_file() 判断文件是否是常规的文件。
- is_link() 判断文件是否是连接。
- is_readable() 判断文件是否可读。
- is_uploaded_file() 判断文件是否是通过 HTTP POST 上传的。
- is_writable() 判断文件是否可写。
- is_writeable() is_writable() 的别名。
- lchgrp() 改变符号连接的组所有权。
- lchown() 改变符号连接的用户所有权。
- link() 创建一个硬连接。
- linkinfo() 返回有关一个硬连接的信息。
- lstat() 返回关于文件或符号连接的信息。
- mkdir() 创建目录。
- move_uploaded_file() 把上传的文件移动到新位置。
- parse_ini_file() 解析一个配置文件。
- parse_ini_string() 解析一个配置字符串。
- pathinfo() 返回关于文件路径的信息。
- pclose() 关闭由 popen() 打开的进程。
- popen() 打开一个进程。
- readfile() 读取一个文件,并写入到输出缓冲。
- readlink() 返回符号连接的目标。
- realpath() 返回绝对路径名。
- realpath_cache_get() 返回高速缓存条目。
- realpath_cache_size() 返回高速缓存大小。
- rename() 重命名文件或目录。
- rewind() 倒回文件指针的位置。
- rmdir() 删除空的目录。
- set_file_buffer() 设置已打开文件的缓冲大小。
- stat() 返回关于文件的信息。
- symlink() 创建符号连接。
- tempnam() 创建唯一的临时文件。
- tmpfile() 创建唯一的临时文件。
- touch() 设置文件的访问和修改时间。
- umask() 改变文件的文件权限。
- unlink() 删除文件。
PHP JSON
- json_encode 对变量进行 JSON 编码
- json_decode 对 JSON 格式的字符串进行解码,转换为 PHP 变量
- json_last_error 返回最后发生的错误
参数
string json_encode ( $value [, $options = 0 ] )
value: 要编码的值。该函数只对 UTF-8 编码的数据有效。
options:由以下常量组成的二进制掩码:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
参数
json_string: 待解码的 JSON 字符串,必须是 UTF-8 编码数据
assoc: 当该参数为 TRUE 时,将返回数组,FALSE 时返回对象。
depth: 整数类型的参数,它指定递归深度
options: 二进制掩码,目前只支持 JSON_BIGINT_AS_STRING 。