avatar

php学习一 —— 基本语法

参考书籍《细说PHP》

第一个php脚本程序

将.php文件放在web服务器根目录下,访问web服务器URL/xxx.php,本地访问http://localhost/xxx.php.

调用函数phpinfo()可以看到系统相关信息、预定义变量,以及已经加载的php模块和配置信息

php语言标记

将php代码嵌入html中的位置

可以将php代码段嵌入到html的任意地方

当php遇到结束符 “?>” 时,简单地将后面的内容原样输出,只到遇到下一个开始标记位置

在一个文件中的不同位置使用多个php标记时,这些标记之间的语法是一个整体

对于输出打断文本而言,脱离php的解析模式,比php的echo和print效率更高

解读开始和结束标记

⭐<?php ?>⭐
和<? ?>
当在html页面中嵌入纯变量时,也可以使用<?=$variablename ?>

<script language=”php”></script> (PHP7以前版本支持)
<% %> (PHP7以前版本支持)

除非有特殊需求,否则使用<?php ?>,对于只包含php代码的文件,结束标识符最好不要存在,防止末尾被意外地注入空白符号

指令分隔符“分号”

使用;

程序最后一行,即?>前,可以不用分号

程序注释

多行:/* */

单行://和#

多行注释无法嵌套多行注释,其它可以嵌套

单行注释只对php内容有效,//?>之后的html代码将被显示出来

在程序中使用空白处理

空格、Tab、换行被php引擎忽略

代码规范:

  1. 使用两个空行
    • 一个源文件的两个代码片段之间
    • 两个类的声明之间
  2. 使用一个空行
    • 两个函数声明之间
    • 函数内的局部变量和函数的第一条语句之间
    • 块注释或单行注释之前
  3. 使用空格增加代码缩进提高可读性
    • 关键字与括号之间,注意函数名和左括号之间不能有空格
    • 函数参数列表的逗号后
    • 算式的操作符和运算符之间,二进制运算和一元运算除外
    • for语句中的逗号后
    • 强制类型转换语句中的强制类型的右括号与表达式之间应该用逗号隔开,并添加空格

变量

建议所有用到数据的地方,先将数据赋值给一个变量

变量的声明

<?php
$a = 100;
$b = "string";
$c = true;
$d = 99.99;

$key1 = $a; //声明变量$key1,将$a的值赋给$key1
$key2 = $b;

$a = $b = $c = $d = "value"; //同时声明多个变量,并附上相同的值

变量的作用域:

  1. 大部分不是在函数中声明的变量,可以在一个页面的所有php模式下使用,包含include和require引入的文件
  2. 如果使用了Cookie和Session,可以在多个页面中使用
<?php
$var = ''; //声明变量$var并赋值空
if(empty($var)){ //true,因为$var为空值
echo "$var is either 0 or not set at all";
}

if(!isset($var)){ //false,$var已经设置
echo "$var is not set at all";
}

unset($var); //销毁$var,释放内容

if(isset($var)){ //false,$var已经销毁
echo "this var is set so i will print"
}

如果empty()的参数是非零或者非空的值,则返回false

“”、0、“0”、NULL、FALSE、array()、$var及任何没有属性的对象都被认为是空的

如果参数为空,则返回true

如果函数isset()的参数存在,则返回TRUE,否则返回FALSE

若参数是一个被设置成NULL的变量或已使用unset()释放,将返回FALSE

NULL字节(”\0”)不等同于PHP的NULL常数,

推荐使用!empty($var)的方式判断一个变量存在且不为空

变量的命名

变量名严格区别大小写

内置结构和关键字及用户自定义的类名不区分大小写,如echo、while、class名称、function名称

字母或下划线开头

PHP常用关键字
and or xor if else for
foreach while do switch case break
continue default as elseif declare endif
endfor endforeach endwhile endswitch enddeclare array
static const class extends new exception
global function exit die echo print
eval isset unset return defien defined
include include_once require require_once cfunction use
var Public private protected implements interface
extends abstract clone try catch throw

可变变量

<?php
$hi = "hello"; //声明一个普通变量$hi
$$hi = "world"; //声明一个可变变量$$hi,
//$hi的值是hello,相当于声明$hello的值是“world”
echo "$hi $hello\n"; //输出hello world
echo "$hi ${$hi}\n"; //输出hello world
echo "$hi $$hi\n"; //输出hello $hello

运行结果image-20200526205949977

变量的引用赋值

$a=&$b php C++
b是a的别名
其中一个的值改变会导致另外一个改变
将$b的引用赋值给$a 地址指针
释放其中一个 解除a、b的值关联关系,只释放一个 两个都释放

变量的类型

image-20200526213837647

<?php
$str="hello world";
var_dump($str);//直接输出变量的类型和值

布尔型

被认为是FALSE的值

  • FALSE
  • 0、0.0
  • “\0”、”0”
  • 没有成员变量的数组
  • 没有单元的对象(仅限php4)
  • 特殊类型NULL、尚未设定的变量
<?php
var_dump((bool) "");//false,“”的布尔值是false

整型

<?php
$int = 1234;
$int = -123;
$int = 0123;
$int = 0x1A;
$int = 0b1111;//二进制
<?php
echo PHP_INT_SIZE; //int占四个字节,8
echo PHP_INT_MAX; //int最大值,9223372036854775807
echo PHP_INT_MIN; //int最小值,-9223372036854775808

php没有无符号整数,超出范围后会被解释为float(这点和其它编译器有出入)

eg.

<?php
var_dump((int) 9223372036854775810);

输出为int(-9223372036854775808)

浮点型

<?php
$float = 1.234;
$float = 1.2e3;
$float = 7E-10;

字符串

php字符串没有长度限制

单引号

<?php
//这是一个使用单引号引起来的简单字符串
echo 'this is a simple string';

this is a simple string

<?php
//在单引号中如果需要在包含单引号,需要使用转义字符“\”
echo 'this is a \'simple\' string';

this is a ‘simple’ string

<?php
//只能将反斜杠转义输出一个反斜杠,其它输出都是无效的
echo 'this \n is \r a \t simple string\\';

this \n is \r a \t simple string\

<?php
$str = 100;
//将变量名原样输出,不会在单引号中解析这个变量
echo 'this is a simple $str string';

this is a simple $str string

双引号

  • 可以使用更多特殊字符的转义序列
  • 可以解析变量、数值组、或者对象属性的方法
  • 用花括号括起表达式
转义字符 含义
\n 换行符
\r 回车符
\t 水平制表符
\\ 反斜线
\$ 美元符号
\“ 双引号
\[0-7]{1,3} 正则,匹配一个用八进制符号表示的字符
\x[0-9A-Fa-f]{1,2} 正则,匹配一个用十六进制符号表示的字符
\u{xxxxx} 声明unicode字符(php7引入)
<?php
$beer = 'heineken';
//可以解析,'在变量名中是无效的
echo "$beer's taste is great";
?>

heineken’s taste is great

<?php
//不可以解析,s在变量名中有效
echo "he drank some $beers";
?>

he drank some

<?php
//使用{}包含,可以将变量分离出来解析
echo "He drank some ${beer}s";
?>

He drank some heinekens

<?php
//可以解析,{}的另一种用法
echo "he drank some {$beer}s";
?>

he drank some heinekens

解析unicode,php7开始支持

<?php
echo "u\{4f5c} u\{8005} u\{5f88} u\{5e05}";

定界符<<<

  • 定界符的命名规则和变量相同

  • 通常用于从文件或者数据库中打断地输出文档

  • 转义和变量解析同双引号

<?php
\$string = <<<EOT
xxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxxx
EOT;
//结束标识必须从行的第一列开始,且后面不能有除分号外的其它字符
//EOT也课换为其它命名
echo \$string;


//解析变量、字符转义
$name = 'MNname';
echo <<<EOT
my name is $name. I am printing a "string" \n.
\tNow, i am printing some new line \n\r.
\tthis should print a capital 'A'
EOT;
image-20200528171648075
<?php //定界符不能用来初始化类成员
//不可以这么写!!!!!!!
class foo{
public $bar = <<<EOT
bar
EOT;
}

开始边界符字符串名称两边加上单引号和双引号(”EOT”),作用类似于单引号\双引号字符串

不加双引号时,作用同双引号

echo <<<"EOT"
xxxxxxxxxx \x41
EOT;

数组

PHP的数组实际上是一张有序图

<?php
/*
array(
key1 => value1,
key2 => value2
....
)
key可以是integer或者string
value可以是任意值
*/
$arr = array("foo" => "bar",12 => true);
print_r($arr); //print_r()函数检查数组内的全部内容
echo $arr["foo"]; //通过数组下标访问单个数据
echo $arr[12];

print_r()输出:

Array
(
[foo] => bar
[12] => 1
)

对象

<?php
class Person{
var $name;

function say(){
echo "Doing foo."
}
}

$p = new Person;//用new语句实例化类Person的对象放在变量$p中

$p->name="TOM";
$p->say();

资源

资源类型的变量保存了到外部资源的一个引用

资源是通过专门的函数来建立和使用的

使用类型变量包含:打开的文件、数据库连接、图形画布区域等的特殊句柄,并由程序员创建使用和释放

在下面的实例中,使用相应的函数创建不同的资源变量,如果创建成功,则返回资源引用赋给变量;如果创建失败,则返回布尔型false

<?php
//使用fopen()函数以写的方式打开本目录下的info.txt文件,返回文件资源赋给变量$file_handle
$file_handle = fopen("info.txt","w");
var_dump($file_handle);//输出$resource(3) of type (stream)

//使用opendir()函数打开目录,返回目录资源
$dir_hanle = opendir("C:\\WINDOWS\\Fonts");
var_dump($dir_handle);//输出$resource(4) of type (stream)

//使用mysql_connect()连接本地的MySql,返回连接资源
$link_mysql = mysql_connect("localhost","root","123456");
var_dump($link_mysql);//输出$resource(5) of type (mysql link)

//使用imagecreate()创建一个100*50像素的画板,返回图像资源
$im_handle = imagecreate(100,50);
var_dump($im_handle);//输出$resource(6) of type (gd)

//使用xml_parser_create()创建XML解析器资源
$xml_parser = xml_parser_create();
var_dump($xml_parser);//输出$resource(7) of type (xml)

NULL

NULL不区分大小写

以下被认为是NULL

  • 直接赋值为NULL
  • 声明的变量未赋值
  • 被unset()函数销毁的变量

伪类型

  • mixed:说明一个参数可以接受多种不同的类型
  • number:说明一个参数可以是integer或float
  • callback

类型转换

自动转换&强制转换

自动类型转换

向长度增加方向进行

bool&null&string -> integer/float

int -> float

string转化字符串的数字部分,”123abc”-> (int)123,“123.45abc” -> (float) 123.45

<?
$foo = "100page"; //string
$foo += 2; //int,102
$foo = $foo + 1.3; //float,103.3
$foo = null + "10 little piggies"; //int,10
$foo = 5 + "10.05 yuan" //float,15.05

强制类型转换

类似于C++,

  • (int),(bool),(float),(string),(array),(object),没有改变变量本身的类型

  • <?php
        //没有改变变量本身的类型
        $str = "123.45abc";
        $int = intval($str);
        $flo = floatval($str);
        $str = strval(123.45);//“123.45”
    <!--25-->
  • PHP7废除16进制字符串,原先“0xA”被识别为10,而新版被识别为0

变量类型的测试函数

  • is_bool($var)
  • is_int(), is_integer(), is_long()
  • is_float(), is_double(), is_real()
  • is_string()
  • is_array() 判断是否为数组
  • is_object()
  • is_resource
  • is_null()
  • is_scalar()判断是否是标量——整数、浮点数、布尔型、字符串
  • is_numeric() 判断是否有任何类型的数字或数字字符串
  • is_callable() 判断是否是有效的函数名

常量

只能是标量数据

常量名前不要加$

常量一旦定义后就不能重新定义或者取消定义,直到脚本运行结束自动释放

<?php
define("CON_INT",100);
echo CON_INT;//获取常量值
constant(CON_INT);//动态获得常量值
get_defined_constants();//获得所有已定义的常量列表
//const和define定义数组
const ARR=['a','b'];
define("BRR",['a','b']);

define 和 const 比较

const用于类成员常量和全局常量,但是不能在条件语句中定义常量

<?php//const编译时更快
if(true)
const FOO='BAR';//无效,cosnt不可以在条件语句中使用
if(true)
define("FOO",'CAR')//可以

const只能用于普通变量名

<?php
const FOO='BAR';

for ($i = 0;$i<32;++$i)
define('YDMA_'.$i,1+$i);
echo YDMA_

系统中的预定义常量

常量名 常量值 说明
PHP_OS UNIX或WINNT等 执行PHP解析的操作系统名称
PHP_VERSION 7.1.9等 当前PHP服务器的版本
TRUE TRUE
FALSE FALSE
NULL NULL
DIRECTORY_SEPARATOR \或/
PATH_SEPARATOR ;或: 更具操作系统决定环境变量的目录列表分割符
E_ERROR 1 错误
E_WARNING 2 警告
E_PARSE 3 解析错误,由程序解析器报告
E_NOTICE 4 非关键的错误,例如变量未初始化
M_PI 3.1415926535898

魔术常量

常量名 常量值 说明
_FILE_ 当前的文件名
_LINE_ 当前行数
_FUNCTION_ 当前函数名
_CLASS_ 当前类名 在哪个类中使用就代表哪个类的类名
_METHOD_ 当前对象的方法名 在哪个对象的方法中使用就代表这个方法名
<?php
echo PHP_OS."<br>";
echo PHP_VERSION."<br>";
echo __FILE__."<br>";
echo __LINE__."<br>";
echo __line__."<br>";

image-20200603174636486

运算符

+、-、、/、++、–、*

==和C不同的地方==

<?php
$i = 'a';
for($n = 0;$n < 52;$n++)
{
echo ++$i."\n";
}

输出:b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af ag ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba

字符串运算

连接:“.”

赋值运算

$x.=”3”

代表$x=​$x.”3”

其余同其他语言

比较运算符

运算符 描述 说明 示例
=== 全等于 在==的基础上添加“类型相同” $a===$b
!== 非全等于 操作数不相等或类型不同
<> / != 不等于
<=> 太空船运算符/组合比较运算符 当左边小于、等于、大于右边时,
分别返回-1,0,1(==可用于字符串比较==)
$a<=>$b
?? NULL合并操作符 从左往右第一个存在切不为NULL的操作数
如果都没有定义切不为NULL则返回NULL
$a ?? $b ?? $c
<?php
//下面两条语句等价
$username = $_GET['user'] ?? 'nobody';
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

逻辑运算符

短路

and、&&

or、||

not、!

xor

位运算符

同C++

$a &= $b 等价于 $a = $a & $b

$a >>=$b 等价于 $a = $a>>$b

其他运算符

运算符 描述 示例
?:
`` 执行运算符
@ 错误空值运算符,忽略表达式产生的错误信息 @表达式
=> 数组加标指定符 键=>值
-> 对象成员访问
instanceof 类型运算符,用来测定一个给定的对象是否来自指定的对象类 对象instanceof类名
<?php
$output = 'ls-la';//使用``执行服务器操作系统的命令,讲结果赋值给$output
echo "<pre> $output </pre>";

$my_file = @file("non_existent_file");
@$num = 100/0;
//使用头发送函数前面不能有任何输出,空格、空行都不行,否则会产生警告
@header("Location: http://www.brophp.com");

运算符优先级

级别(从高到低) 运算符
2 [
3 ++,–
4 !,~,-,(int),(float),(string),(array),(object),@
5 *,/,%
6 +,-
7 <<,>>
8 <,<=,>,>=
9 ==,!=,===,!==,<>,<=>
10 &
11 ^
12 |
13 &&
14 ||
15 ??
16 ?:
17 =,+=,-=,*=,/=,.=,%=,&=,|=,^=,<<=,>>= (结合方向:从右到左)
18 and
19 xor
20 or
21 ,

容易混淆的特殊值

1代表true

0代表false

表达式 gettype() empty() is_null() isset() boolean():if($x)
$x=”” string 1 0 1 0
$x=null null 1 1 0 0
$x is undefined null 1 1 0 0
var $x null 1 1 0 0
$x=array() array 1 0 1 0
$x=false boolean 1 0 1 0
$x=true boolean 0 0 1 1
$x=1 integer 0 0 1 1
$x=42 integer 0 0 1 1
$x=0 integer 1 0 1 0
$x=-1 integer 0 0 1 1
$x=”1” string 0 0 1 1
$x=”0” string 1 0 1 0
$x=”-1” string 0 0 1 1
$x=”php” string 0 0 1 1
$x=”true” string 0 0 1 1
$x=”false” string 0 0 1 1
Author: Michelle19l
Link: https://gitee.com/michelle19l/michelle19l/2020/05/26/php/php1/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶