PHP学习笔记
前言
PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。
php是什么?
- php是在服务器上执行
- PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
- PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
PHP可以干什么?
- 生成动态页面内容
- 创建、打开、读取、写入、关闭服务器上的文件(和脚本功能类似?)
- 收集表单数据(存放在哪里?)
- 发送和接收 cookies
- 添加、删除、修改您的数据库中的数据
- 限制用户访问您的网站上的一些页面
- 加密数据
- 可以输出图像、PDF 文件,甚至 Flash 电影。还可以输出任意的文本,比如 XHTML 和 XML。
语法
打印:PHP的打印有echo(与linux相同)和print是在浏览器输出文本的基础指令。
变量: 是用于存储信息的容器,如$x。
<?php
$x=5;
$y=6;
$z=$x+$y;
echo $z;
?>
要点:
- 变量以 $ 符号开始
- 变量名不能包含空格,区分大小写,只能包含字母数字字符以及下划线,必须以字母或者下划线字符开始。
- php不用提前声明变量,它在第一次被赋值时被创建,所以不用区分类型。
<?php
$txt="Hello world!";
$x=5;
$y=10.5;
?>
php变量的作用域
php的作用域时脚本中变量可被引用/使用的部分,有四种
- local
- global
- static
- parameter
详细介绍:
global
函数外部定义的变量,拥有全局作用域。除了函数全局变量可以被脚本中的任何部分访问,要在函数中访问全局变量,要在函数中访问一个全局变量,需要使用global关键字。
<?php
$x = 5; //全局变量
function myTest()
{
$y = 10;//局部变量
echo "$x";
echo"<br>";
echo"$y";
}
myTest();
echo:"$x";
echo:"$y";
?>
$x在函数外声明,是全局变量,y是局部变量。函数将会输入变量y的值,但不可以输出x的值。如果在函数中访问一个全局变量,需要使用global关键字。如
<?php
$x = 5;
$y = 10;
function myTest()
{
global $x, $y;
$y = $x + $y;
myTest();
echo $y;
?>
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++;
echo PHP_EOL;//换行
}
myTest();
myTest();
myTest();
?>
每次调用该函数时,该变量将会保留着函数前一次被调用时的值,该变量仍然是函数的局部变量。
参数作用域
参数是通过调用代码将值传递给函数的局部变量。
参数是在参数列表中声明的,作为函数声明的一部分
echo和print:
*区别:*echo可以输出多个字符串,且输出速度较快;print只可输出一个字符串,且返回值为1。
*echo:*使用时可以加括号:echo()或不加括号:echo。
实列一:
<?php
echo "<h2>PHP 很有趣!</h2>";
echo "Hello world!<br>";
echo "我要学 PHP!<br>";
echo "这是一个", "字符串,", "使用了", "多个", "参数。";
?>
实列二:
<?php
$t1="study php";
$t2="veritasal.com";
$cars=arry("Volvo", "BMW", "Toyota");
echo $t1;
echo "<br>"
echo "study in $t2";
echo"<br>"
echo "my car :{$cars[0]}";
?>
print语句:
类似的
<?php
$txt1="学习 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");
print $txt1;
print "<br>";
print "在 $txt2 学习 PHP ";
print "<br>";
print "我车的品牌是 {$cars[0]}";
?>
PHP EOF(heredoc)
PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。
使用方法:
- 后接分号
- EOF可以用其他字符代替,须保持结束标识符和开始表示符一致。
- 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
- 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
- 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
示例:
<?php
echo <<<EOF
<h1>my first head</h>
<p1>my first Paragraph</p1>
EOF;
?>
tips:
- 以 <<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。
- 开始标记和结束标记相同,比如常用大写的 EOT、EOD、EOF 来表示,但是不只限于那几个(也可以用:JSON、HTML等),只要保证开始标记和结束标记不在正文中出现即可。
- 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在 heredoc 中,变量不需要用连接符 . 或 , 来拼接,如下:
<?php
$a= <<<EOF
"abc"$name
"123"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
数据类型
类型:
- 整型
- 字符串
- 浮点型, PHP var_dump() 函数返回变量的数据类型和值
<?php
$x = 10.365;
var_dump($x);
echo "<br>";
$x = 2.4e3;
var_dump($x);
echo "<br>";
$x = 8E-5;
var_dump($x);
?>
- 布尔型
<?php
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
- 数组
<?php
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
6.对象,对象数据类型也可以用于存储数据,但是,对象必须声明。
使用方法: class关键字声明类对象。类是可以包含属性和方法的结构。在类中定义数据类型,然后在实例化的类中使用数据类型。
<?php
class Car
{
var $color;
function __construct($color="green") {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}
?>
7.NULL 值
NULL 值表示变量没有值,NULL 是数据类型为 NULL 的值,NULL 值指明一个变量是否为空值, 同样可用于数据空值和NULL值的区别,可以通过设置变量值为 NULL 来清空变量数据 。
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
类型比较
- 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
- 严格比较:用三个等号 === 比较,除了比较值,也比较类型。
<?php
if(42 == "42") {
echo '1、值相等';
}
echo PHP_EOL; // 换行符
if(42 === "42") {
echo '2、类型相等';
} else {
echo '3、不相等';
}
?>
接下来比较一下0, false、null:
<?php
echo '0 == false: ';
var_dump(0 == false);
echo '0 === false: ';
var_dump(0 === false);
echo PHP_EOL;
echo '0 == null: ';
var_dump(0 == null);
echo '0 === null: ';
var_dump(0 === null);
echo PHP_EOL;
echo 'false == null: ';
var_dump(false == null);
echo 'false === null: ';
var_dump(false === null);
echo PHP_EOL;
echo '"0" == false: ';
var_dump("0" == false);
echo '"0" === false: ';
var_dump("0" === false);
echo PHP_EOL;
echo '"0" == null: ';
var_dump("0" == null);
echo '"0" === null: ';
var_dump("0" === null);
echo PHP_EOL;
echo '"" == false: ';
var_dump("" == false);
echo '"" === false: ';
var_dump("" === false);
echo PHP_EOL;
echo '"" == null: ';
var_dump("" == null);
echo '"" === null: ';
var_dump("" === null);
?>
得到结果如下:
0 == false: bool(true)
0 === false: bool(false)
0 == null: bool(true)
0 === null: bool(false)
false == null: bool(true)
false === null: bool(false)
"0" == false: bool(true)
"0" === false: bool(false)
"0" == null: bool(false)
"0" === null: bool(false)
"" == false: bool(true)
"" === false: bool(false)
"" == null: bool(true)
"" === null: bool(false)
因此,可以得到: 0 松散等于false, null;“0”松散等于false,完全不等于null;“”松散等于false, null, false松散等于null。
常量
常量是一个简单值的标识符。该值在脚本中不能改变。
一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符),且在脚本任何地方都可以使用。
设置常量,使用 define() 函数:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
其中
name:必选,常量名称
value:必选,常量值
case insensitive:可选,若为true,则该常量大小写不敏感,默认敏感。
eg.
<?php
// 区分大小写的常量名
define("GREETING", "欢迎访问 Veritasal.top");
echo GREETING; // 输出 "欢迎访问 Veritasal.top"
echo '<br>';
define("GREETING", "欢迎访问 Veritasal.top", true);
echo greeting; // 输出 "欢迎访问 Veritasal.top"
?>
字符串
PHP 并置运算符:在 PHP 中,只有一个字符串运算符。
并置运算符 (.) 用于把两个字符串值连接起来。
eg.
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
输出:Hello world! What a nice day!
两个函数:
strlen():
<?php
echo strlen("Hello world!");
?>
strpos():用于在字符串内查找一个字符或一段指定的文本。如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。
下面的实例在字符串 “Hello world!” 中查找文本 “world”:
<?php
echo strpos("Hello world!","world");
?>
上面的代码将输出:6
因为在上面的实例中,字符串 “world” 的位置是 6。之所以是 6 而不是 7 的原因是,字符串中第一个字符的位置是 0,而不是 1。
运算符 | 名称 | 描述 |
---|---|---|
x <> y (x != y) | 不等于 | 如果 x 不等于 y,则返回 true |
x !== y | 绝对不等于 | 如果 x 不等于 y,或它们类型不相同,则返回 true |
x and y (x && y) | ||
x or y | ||
x xor y | 异或 | 如果 x 和 y 有且仅有一个为 true,则返回 true |
PHP_EOL 是一个换行符,兼容更大平台。
NULL 合并运算符 ??(PHP7+)
<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
?>
组合比较符(PHP7+)
PHP7+ 支持组合比较符(combined comparison operator)也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较
$c = $a <=> $b;
- 如果 $a > $b, 则 $c 的值为 1。
- 如果 $a == $b, 则 $c 的值为 0。
- 如果 $a < $b, 则 $c 的值为 -1。
数组
有两种创建数值数组的方法:
自动分配 ID 键:
$cars=array("Volvo","BMW","Toyota");
人工分配 ID 键:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
获取数组的长度 - count() 函数
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>
遍历数值数组
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
PHP 关联数组(类似python中的字典?)
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
or
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
随后可以在脚本中使用指定的键:
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>
遍历关联数组(与用法java类似)
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
数组排序函数
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
写一个实列,其他类似:
<?php
$cars=array("Volvo","BMW","Toyota");
sort($cars);
?>
超级全局变量
在一个脚本的全部作用域中都可用。 不需要特别说明,可以在函数及类中使用。
有如下几种:
$GLOBALS:
是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。包含了全部变量的全局组合数组。变量的名字就是数组的键。
<?php
$x = 75;
$y = 25;
function addition()
{
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
addition();
echo $z;
?>
$_SERVER:
包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
$_REQUEST:
PHP $_REQUEST 用于收集HTML表单提交的数据。
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
$_POST:
用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。
以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 “Submit” 按钮提交表单数据时, 表单数据将发送至标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量来收集表单中的 input 字段数据
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_POST['fname'];
echo $name;
?>
</body>
</html>
$_POST :
PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。
$_GET PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。也可以收集URL中发送的数据。
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
函数
函数名称以字母或下划线开头,通过调用函数来执行,其他语法和其他语言类似
魔术常量
PHP 向它运行的任何脚本提供了大量的预定义常量。正如PHP也预定义了一些全局变量。
不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。
有八个魔术常量它们的值随着它们在代码中的位置改变而改变。
LINE:
文件中的当前行号
<?php
echo '这是第 " ' . __LINE__ . ' " 行';
?>
结果:这是第 “ 2 ” 行
FILE:
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径
DIR:
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)
FUNCTION:
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
CLASS:
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。
在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。
TRAIT:
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。
Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。
METHOD:
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
NAMESPACE:
当前命名空间的名称(区分大小写)。
PHP 命名空间(PHP 5.3)
——有点像java中包的概念
命名空间有什么用呢?
- 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
- 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
定义:
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
<?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
...
在同一个文件中定义不同的命名空间代码
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
namespace AnotherProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
-----------------------------------------------------
或
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace AnotherProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
?>
在单个文件中定义多个命名空间时,建议使用第二种
而将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来
<?php
namespace MyProject {
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
}
namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>
在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
子命名空间
与目录和文件的关系很像
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */ }
?>
上面的例子创建了
常量: MyProject\Sub\Level\CONNECT_OK
类:MyProject\Sub\Level\Connection
函数 :MyProject\Sub\Level\Connect
使用
- 非限定名称,或不包含前缀的类名称,例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。如果使用 foo的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。
- 限定名称,或包含前缀的名称,例如 $a = new subnamespace\foo(); 或 subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为currentnamespace\subnamespace\foo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。
- 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。
注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。
在命名空间内部访问全局类、函数和常量:
使用命名空间:别名/导入
有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。别名是通过操作符 use 来实现的.
使用命名空间:后备全局函数/常量
在一个命名空间中,当 PHP 遇到一个非限定的类、函数或常量名称时,它使用不同的优先策略来解析该名称。类名称总是解析到当前命名空间中的名称。因此在访问系统内部或不包含在命名空间中的类名称时,必须使用完全限定名称,
全局空间
如果没有定义任何命名空间,所有的类与函数的定义都是在全局空间,与 PHP 引入命名空间概念前一样。在名称前加上前缀 \ 表示该名称是全局空间中的名称,即使该名称位于其它的命名空间中时也是如此。