PHP入门 – 基础语法、变量范围及类型、常量等

PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。

1.PHP的起始与结束标记:<?php 和 ?>,如示例

<?php 
echo "this is test"; 
?>

2.注释:单行注释用 // ,多行注释用 /* */

<?php
echo "this is test"; //这是单行注释
/*
这是多行注释
这是多行注释
*/
echo "this is test";
?>

3.变量:PHP中变量以 $ 符号后面加变量名来表示,变量名由字母或下划线开头,后面跟任意的字母、数字或下划线,同时区分大小写。(注意 $this是个特殊的变量,不能被赋值)

<?php 
$a2 = "xiaofan";  //合法变量
$2a = "xiaofan";  //非法变量
?>

另一种方式给变量赋值:引用赋值,在将要赋值的变量前加一个 & 符号

<?php
$a = "xiaofan";
$b = &$a;  //通过 $b 引用 $a
echo $b;  //会输出 xiaofan

$b = "xiaofan's blog";  //给 $b 赋值会同时改变$a里面的值
echo $a;  //会输出 xiaofan's blog
?>

注意:虽然PHP的变量并不需要初始化,但是给变量初始化是个好习惯。

4.变量范围:变量范围也就是变量的作用域,指的是在脚本的一次生命周期内变量的有效范围。

PHP的变量作用域可以分为:超全局变量全局变量局部变量静态变量

4.1超全局变量:是在全部作用域都始终可以使用的内置变量,这些变量是

$GLOBALS

$_SERVER

$_GET

$_POST

$_FILES

$_REQUEST

$_SESSION

$_COOKIE

$_ENV

4.2全局变量:声明的变量不在 class, function语言结构内部就是全局变量。如果想在 class, function语言结构内部使用,需要使用关键词 global 或者超全局变量 $GLOBALS

<?php
$a = 1;
$b = 2;
function Sum(){
  global $a, $b;  //使用global调用全局变量
  $b = $a + $b;
}
Sum();
echo $b;  //会显示结果为 3 
?>

使用超全局变量 $GLOBALS 同样可以实现上面的功能

<?php
$a = 1;
$b = 2;
function Sum(){
  $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"];  //使用超全局变量$GLOBALS调用全局变量
}
Sum();
echo $b;  //会显示结果为 3 
?>

区别:global与$GLOBALS之间的区别是什么?

$GLOBALS['var']是外部的全局变量$var本身;

global $var是外部全局变量$var的同名引用或指针;

<?php
$var1 = 1;
$var2 = 2;
function test(){
  $GLOBALS['var2'] = &$GLOBALS['var1'];
}
test();
echo $var2;  //结果显示为 1
?>
<?php 
$var1 = 1;
$var2 = 2;
function test(){
  global $var1, $var2;
  $var2 = &$var1;
  echo $var2;  //结果显示为 1
  $var1 = "xiaofan's blog";
}
test();
echo $var2;  //结果显示为 2
echo $var1;  //结果显示为 xiaofan's blog
?>

test()函数中的$var1,$var2都是局部变量,只不过是加了global关键字后,分别引用指向全局变量$var1,$var2了,当 $var2 = &$var1; 时,局部变量$var2不再指向全局变量$var2,而重新指向全局变量$var1,换句话来说,局部变量$var2的改变,不会再影响到全局变量$var2,而会影响到重新指向的全局变量$var1。

4.3局部变量:在 class, function结构语句内部声明的变量

<?php
function test(){
  $a = 1;
}
echo $a;  //不会显示任何内容
?>

4.4静态变量:在 function 中使用关键字 static 声明的变量,静态变量只在局部函数中存在,但当程序执行离开此作用域时,其值并不会丢失,会保留到整个脚本执行结束。

<?php
function test1(){
  $a = 1;
  echo $a;
  $a++; 
}
test1(); //结果为 1
test1(); //结果仍然为 1

function test2(){
  static $a = 1;
  echo $a;
  $a++;
}
test2();  //结果为 1
test2();  //结果为 2
?>

以上的例子说明,静态变量只被初始化赋值一次,其值一直保留可以实现递归

5.数据类型:PHP支持8种原始数据类型,分别是:boolean(布尔型)integer(整型)float(浮点型)string(字符串)array(数组)object(对象)resource(资源)NULL(无类型)

变量的类型通常不是由程序员设定的,而是由PHP根据该变量使用的上下文在运行时决定的。

注意double(双精度)与float(浮点型)是相同的,由于历史原因,这两个名称同时存在。

如果想同时查看某个变量的值和类型,可以使用var_dump()函数。只查看变量的类型,可以使用gettype()函数。判断变量的类型,可以使用is_type函数。

<?php 
$a = 123;
$b = "xiaofan";
var_dump($a);  //结果为 int(123) 数据类型和值都会显示出来
echo gettype($b);  //结果为 string 只显示变量的类型

if(is_string($b)){
  echo "String: $b";  //is_string函数判断$b的数据类型,返回值为布尔类型
}
?>

如果要将一个变量强制转为某类型,可以使用强制转换或settype()函数。

允许的类型强制转换有:

(int), (integer) - 转换为整型 integer

(bool), (boolean) - 转换为布尔型 boolean

(float), (double), (real) - 转换为浮点型 float

(string) - 转换为字符串 string

(array) - 转换为数组 array

(object) - 转换为对象 object

(resource) - 转换为资源 resource

(NULL) - 转换为 NULL(PHP5)

<?php
$a = 10;  //变量a为整型
$b = "$a";  //把变量a放在双引号内同样可以转换为字符串
$c = (string)$a; //变量c为字符串
?>

5.1 boolean(布尔型):只有两种取值,分别是TRUE和FALSE,不区分大小写

<?php 
$a = TRUE;  //为变量a指定布尔值为TURE;
?>

要将一个值转换为布尔型,使用(bool)或(boolean)。同时,以下值在转换为布尔值时被认为 FALSE:

布尔值 FALSE本身

整型值 0

浮点值 0.0

空字符串  "" 或字符串 "0"

不含任何元素的数组

特殊类型 NULL (包含尚未赋值的变量)

5.2 integer (整型):可以使用十进制、十六进制、八进制或二进制表示,前面可以加上可选符号(+ 或 -)代表数值的正负。要表达八进制,数字前加 0 ;要表达十六进制,数字前加0x;要表达二进制,数字前加0b。

<?php 
$a = 1234;  //十进制数
$a = -1234;  //负数
$a = 0123;  //八进制数(等于十进制数 83)
$a = 0x1A; //十六进制数(等于十进制数 26)
?>

整型值是有范围的,跟平台有关,对于32位系统而言范围是 -2147483648(负的2的32次方)到 2147483648(2的32次方),PHP不支持无符号的整数。如果超出范围则变成浮点型。

强制转换为整型,可以使用(int) 或 (integer) ;或者使用函数intval()。

从布尔型转换为整型:FALSE将产出为0,TRUE产出为1;

从浮点型转换为整型:将向下取整,如果浮点数超出整数范围,则会出现不可预料的结果。

5.3 float(浮点型),也叫双精度数 double 或者实数 real。

比较浮点数:浮点数精度有限,浮点数不会精确到最后一位,因为也不能比较两个浮点数是否相同。不过有个迂回的办法,要测试浮点数是否相等,可以使用最小误差值(也就是计算中能接受的最小差别值)。

<?php
$a = 1.2345688;
$b = 1.2345605;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon){  //abs函数是取两个数值的绝对值
  echo "true";  //结果会显示true;
}
?>

5.4 string(字符串):是由一系列的字符组成,其中每个字符等同于一个字节。

一个字符串可以有两种方式表达: ''(单引号)、""(双引号)。单引号的效率比双引号更快,但是如果你的字符串中含有变量或者转义字符,就必须使用双引号。

单引号:定义一个字符串最简单的方式,单引号中的 \n \r等不会被转移。

<?php
echo 'This will not expend: \n  a newline'; 
//结果显示为 This will not expend: \n  a newline,不会转义\n
?>

双引号:会对一些特殊字符进行解析转移,同时也能解析变量。

\n  换行

\r  回车

\t  水平制表符

\v  垂直制表符

\e  escape

\f  换页

\\  反斜线

\$  美元符

\"  双引号

\[1-7]{1,3}  符合该正则表达式序列的是一个以八进制方式来表达的字符

\x[0-9A-Fa-f]{1,2}  符合该正则表达式序列的是一个以十六进制方式来表达的字符

变量解析:当字符串用双引号结构,其中的变量将会被解析。语法规则分为简单规则和复杂规则。

  • 简单规则:是最常用和方便的规则,它可以用最少的代码在一个string中嵌入一个变量、一个array的值或一个object对象的属性。当PHP解析器遇到一个 $ 符号时,它会组合尽可能多的标识以形成一个合法的变量名。数组索引要用 ](方括号)来表示索引的结束,对象属性则与变量规则相同。数组的索引不能带引号,如果必须用,只能用复杂规则{}。
<?php
$juice = 'apple';
echo "He drank some $juice juice.";  //解析变量$juice,结果为 He drank some apple juce.

echo "He drank some juice made of $juices."  
//由于解析器会组合尽可能多的标识,因此解析不到变量$juices,结果为 He drank some juice made of .
?>
<?php
$name = Tom;
echo "$name's a policeman.";  //解析到的变量是$name,不会是$name's。因为's并不符合变量规则
//结果显示为 Tom's a policeman.
?>
<?php
$juices = array("apple", "orange", "a" => "banana");
echo "He drank some $juices[0] juice.";  //正确显示
echo "He drank some $juices[a] juice.";  //正确显示
echo "He drank some juice made of $juices[1]s.";  //由于数组索引是以]结束,这里同样正确显示
?>
<?php
class name{
  public $name1 = Tom;
  public $name2 = Jim;
  public $name3 = Andy;
}
$name = new name();
echo "$name->name1 is a policeman.";  //正确显示
echo "$name->name2's a policeman.";  //正确显示
echo "$name->name3s is a policeman."  //错误,无法找到变量$name->name3s
?>
  • 复杂规则:最显著的标志就是使用 {}(花括号)包围的表达式。可以使用复杂的表达式。由于 { 无法被转移,变量的 $ 必须紧挨着 { 才会被识别
<?php
$a = 'pen';
echo "This is a {$a}";  //正确解析,显示结果是 This is a pen
echo "This is a { $a}";  //由于{和$之前有空格,显示结果是 This is a { pen}
echo "This is a ${a}";  //正确解析,显示结果是 This is a pen

$arr1 = array("key1" => "a", "key2" => "b");
echo "This is a {$arr1['key']}";  //只有{}内才能正确解析带''(引号)的键名

$arr2 = array("key1" => "a", "key2" => array(a, b, c));
echo "This is a {$arr2[key2][1]}";  //正确解析二位数组,结果是 This is a b
echo "This is a $arr2[key2][1]";  //无法解析,结果是This is a Array[1]

echo "I'm xiaofan\n";  //\n会被转义成换行 只能在Unix平台会换行
echo "This is my blog\n";
?>

字符串可以用 . (点)运算符连接起来。

强制转换为字符串:使用(string)强制转换为字符串,或用 strval()函数。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echoprint 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。

布尔型FALSE转换为字符串为空字符串""

布尔型TRUE转换为字符串为"1"

布尔型和字符串可以相互转换

整数或浮点数也转换为字面样式的 string 字符串

数组总是转换为字符串"Array"

资源型总是转换为字符串"Resource id #1"

NULL转换为空字符串""

字符串转为数值:如果字符串中没有'.'、'e'或'E'并且数值在整型范围内,则会转换为一个integer(整数),其他情况则会转换为float(浮点数)。该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。

<?php
$a = 1 + "10.1";  //结果为浮点数 11.1
$b = 1 + "-1.3e3";  //结果为浮点数 -1299
$c = 1 + "10adfg";  //结果为整数11
$d = 1+ "afa10";  //结果为整型1
?>

5.5 array(数组):PHP的数组实际上是一个有序映射,把键(key)映射到值(value)。使用array()定义数组 array( "key" => "value", ... )。

<?php
$array = array(
  "key1" => "value1",
  "key2" => "value2"
);

//PHP5.4版本后可以使用[]定义数组
$array1 = [
 "key1" => "value1",
 "key2" => "value2"
]
?>

key可以是 integer 或 string ,value可以是任意类型。key会有以下的强制转换

包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。

浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8

布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0

Null 会被转换为空字符串,即键名 null 实际会被储存为 ""

数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type

如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。

<?php
$array = array(
  1 => "a",
  "1" => "b",  //字符串"1"会转换为整数1
  1.5 => "c",  //浮点数1.5会转换为整数1
  TRUE => "d"  //布尔型TRUE会转换为整数1
);
var_dump($array);
?>

key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。

unset()函数删除数组中某个键,但不会重建索引。如果想重建索引可以使用函数array_values()。

为什么$foo[bar]是错误的?

应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么呢?可能在老的脚本中见过如下语法:

<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// etc
?> 

这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。

强制转换为数组:对于任意 integerfloatstringbooleanresource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValuearray($scalarValue) 完全一样。

5.6 object(对象):要创建一个新的object对象,需要new实例化一个类。

5.7 resource(资源):资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。

5.8 NULL:表示一个变量没有值。

以下情况一个变量被认为是NULL

变量被赋值为 NULL

尚未被赋值的变量

unset()的变量

判断数据类型的函数

is_bool()  判断是否为布尔型

is_int() 、is_integer()或 is_long() 判断是否为整型

is_float()、is_double()或 is_real()  判断是否为浮点型

is_string()  判断是否为字符串

is_array()  判断是否为数组

is_object() 判断是否为对象

is_resource()  判断是否为资源

is_null()  判断是否为NULL

is_scalar()  判断是否为标量(标量即是包含boolean integer float string)

is_numeric()  判断是否为任何类型的数字或数字字符串

is_callable()   判断是否是有效的函数名

6.常量:合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。

使用define()函数定义常量,一个常量一旦被定义,就不能被改变或者取消定义。

bool define(string name, mixed value [, bool case_insensitive]),解释:返回布尔值,定义的第一个值是常量名,第二个值是变量的值(必须是标量),第三个值可选是定义是否对大小写敏感(TRUE是不敏感,FALSE是敏感),默认是FALSE敏感

<?php
define("USERNAME", "root");  //常用定义常量方法
define("Password", "pw123", TRUE);  //常量名对大小写不敏感的常量
echo USERNAME;
echo password;
echo constant("USERNAME");
var_dump(get_defined_constants());
?>

注意可以使用constant()函数获取常量的值,使用get_defined_constants()获取所有已定义的常量列表。

常量与变量的区别

常量前面没有 $ 符号

常量只能用 define()函数定义,不能用赋值语句

常量不用理会变量的作用域,可以在任何地方定义和访问

常量一旦被定义,就不能被修改或取消定义

常量的值只能是标量

注意:常量还可以用 const 定义。在php5.4以上,const可以在类的内部和类的外部都可以定义常量,define()仅在类外部使用。

预定义常量:PHP提供有大量的预定义常量。以下有八个魔术常量它们的值会随着所处代码的位置改变而改变。

__LINE__  当前代码所处的行号,不区分大小写

__FILE__  当前代码文本所处的完整路径(包含文本本身),不区分大小写

__DIR__  当前代码文本所处的目录,不区分大小写

__FUNCTION__  返回该函数被定义的名字,区分大小写

__CLASS__  返回该类被定义的名字,区分大小写

__TRAIT__  Trait的名字,区分大小写

__METHOD__  类的方法名,区分大小写

__NAMESPACE__  当前namespace的名字,区分大小写

 

 

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇