php中的类型和变量

变量

php规定变量名称的前面必须加上美元符号($),而且不管是变量还是常量,标识符都是区别大小写的,这有别于php关键字。

php的变量名不能用数字开头,通常以大小写字母或下划线开头,不过也可以使用其它字符,比如汉字。

php中除了自定义的变量外,还有大量的预定义变量,比如$_SERVER/$_ENV/$_COOKIE/$_GET/$_POST/$_FILES/$php_errormsg/$_REQUEST/$_SESSION/$GLOBALS等。

定义变量时直接赋值即可,php中没有关键字用于定义变量:

$var = 3;

$var = true;


在php中,读取一个未赋值(未定义)的变量是合法的:

$a .= 'b';
var_dump($a);   // string(1) "b"
var_dump($b);   // NULL
在本例中,变量$a在未定义的情况下便与字符串'b'进行接连,结果是$a在被连接之前被解析为空字符串。

未初始化的变量具有其类型的默认值 - 布尔类型的变量默认值是FALSE,整形和浮点型变量默认值是零,字符串型变量默认值是空字符串,数组变量的默认值是空数组。


在php中,一般的变量都具有全局作用域,在函数外部定义一个变量时,这个变量不仅可以在所有的文件中使用,而且可以在导入的文件中使用,也就是说,变量没有文件作用域。

var_dump($x);   // NULL
$x = 4;
var_dump($x);   // int(4)

print_ok();     // ok

function print_ok()
{
  echo "ok";
}

在函数内部的变量都属于局部变量,除非使用global进行声明:

$a = '1';
$b = '2';

function varSet()
{
  global $b;

  $a = '100';    // $a为局部变量
  $b = '200';    // $b为全局变量
}

function varEcho()
{
  global $a, $b;

  echo $a, " ", $b;  // 1 200
}
varSet();
varEcho();

注意,global并不是只用于函数内部,如果一个文件被包含进一个函数,那么这个文件中也可能会用到global。

// 被包含文件 inc.php
<?PHP
namespace MyNS{
  $x = 4;
  $y = 5;
  global $x, $y;

  function getSite()
  {
    global $x, $y;
    return "($x, $y)";
  }
}

// 执行文件
<?php
namespace MyCode
{
  function req() {
    require "inc.php";
  } 
  req();
  
  $x = 40;
  $y = 50;
  echo \MyNS\getSite();  // (40, 50)
}


也可以直接通过$GLOBALS[]数组访问全局变量

$a = '1';
$b = '2';

function varSet()
{
  $GLOBALS['a'] = '100';
  $GLOBALS['b'] = '200';
}
varSet();
echo $a, " ", $b;  // 100 200

global和$GLOBALS不仅可以用来访问全局变量,还可以用来向全局作用域添加变量。同时,全局变量不受命名空间管理,所有命名空间下的全局变量都可以通过$GLOBALS[]读写和增删。

function test(){
    global $a;

    $a = 3;
    $GLOBALS['b'] = 4;
}

echo $a;   // 变量未定义
echo $b;   // 变量未定义
test();
echo $a;   // 输出3
echo $b;   // 输出4
// 被导入文件 inc.php
<?PHP
namespace MyNS{
  $x = 4;
  $y = 5;

  function setDat()
  {
    unset($GLOBALS['x']);
    $GLOBALS['z'] = 6;
  }
}

// 执行文件
<?php
namespace MyCode
{
  include "inc.php";

  \myns\setDat();
  unset($y);
  var_dump(isset($x));  // bool(false)
  var_dump(isset($y));  // bool(false)
  var_dump($z);         // int(6)
}

可变变量

定义变量时,变量名也可以来自另一个变量的值,例如:

$str = "name";

$$str = 3;

这时,$name的值为3。

$a = 'b';
$$a = 'c';
$$$a = 'd';
var_dump($c);   // string(1) "d"

在使用数组时,可变变量有时候需要一点特殊的处理

$a = 'vara';
$b = 'arr';
$arr = ['a', 'b'];
echo $$b[1];      // b
echo ${$b}[1];    // b     与第一个输出语句等效,花括号是可选的
echo ${$arr[1]};  // arr   这里的花括号是必须的

可见,为了清晰地定界变量名称的边界,有时候必须使用花括号,类似的情况还包括:属性位于数组中,或者属性名包含有多个部分或者属性名包含有非法字符时。另外,这里的花括号是不能用圆括号来代替的。


静态变量

在函数内部可以将局部变量定义成静态变量:

static $var = 3;

注意,静态变量的声明是在编译时进行解析的,所以静态变量只能用常量初始化(或常量表达式,如:1+2),不能使用变量或其他表达式:

define('NAME', 'Ann');
$age = 3;

function f1() {
  return 2;
}

function fun()
{
  global $age;

//static $var1 = f1();  // 出错
//static $var2 = $age;  // 出错
  static $var3 = 4+3;   // 正确
  static $var4 = NAME;  // 正确
}


引用赋值

引用赋值相当于给变量起一个别名,这样多个变量将代表一个相同的实体。


$a = 3;

$b = &$a;

$c = "a";

$d = &$$c;


注意,对于对象类型,不需要使用引用赋值语法,一般的赋值实际上就是实现为引用赋值,相反,如果不想进行引用赋值,得使用clone关键字。另外,new运算的结果也不能再使用&来得到一个引用,否则运算出错,因为new运算符是自动返回一个引用的。


超全局变量

这是一套附加的预定数组,这些数组变量包含了来自 web 服务器(如果可用),运行环境,和用户输入的数据。这些数组非常特别,它们在全局范围内自动生效,因此通常被称为自动全局变量或者超全局变量。

超全局变量是PHP内置的一类全局可用变量,在任何地方都可直接访问,甚至在函数中也无须global声明。

注意,超级全局变量不能被用作函数或类方法中的可变变量。

$GLOBALS - 一个数组,包含了全部可用的全局变量,变量名就是键名,在函数内部除了用global声明全局变量外,也可以通过本数组来访问

$_SERVER - 一个数组,包含由服务器提供的多种信息,诸如头信息、路径、脚本路径等

$_GET - HTTP的Get方法相关信息

$_POST - HTTP中Post方法相关信息

$_FILES - 文件上传相关信息

$_COOKIE - cookie相关信息

$_SESSION - session相关信息

$_REQUEST - 包含了cookie、get、post 相关信息

$_ENV - 系统环境变量


判定变量的几个函数

isset(),变量不是null时结果为true

unset(),清除变量的值,使之成为null

empty(),变量的值为空时返回true,如0、0.0、""、"0"、null、false、 var $var;(在类内声明但尚未设置值的变量)、空数组。


数据类型

php中的数据类型为弱类型(动态类型),数据在使用之前无须声明类型,而且变量的类型也可以在程序运行过程中动态改变。

类型包括以下9种:

整数、浮点数、布尔(true/false)、字符串、NULL(null)、资源、数组、对象、可调用

其中,整型值(integer),浮点数值(float),字符串值(string)和布尔值(boolean)是四种标量类型(标量值不能拆分为更小的单元,明显数组就不是标量)。数组和对象属于复合类型。注意,这两种类型也可以赋值给变量或者从函数返回。

浮点数并无float和double之分,两者都是指浮点类型。


gettype()函数可以得到参数的类型字符串

$a = 2;
$b = 5.6;
$c = "abc";
$d = true;
$e = null;
$f = array(2,3,4);

echo gettype($a),"\n";  // integer
echo gettype($b),"\n";  // double
echo gettype($c),"\n";  // string
echo gettype($d),"\n";  // boolean
echo gettype($e),"\n";  // NULL
echo gettype($f),"\n";  // array

凡是尚未设置值的变量、值被赋值为常数 NULL 的变量或值被 unset() 函数清除的变量均会被视为NULL。

资源类型代表的是一种特殊值,用来表示 php 程序的外部资源,例如数据库、文件、图形图像等,这种类型通常是在调用函数存取外部资源时自动建立的(即由相关函数返回一个资源值)。

一般来说,我们并不需要手动释放资源,PHP Zend Engine 会自动管理除了数据库之外的所有资源,当某一个资源不再使用时,只需要将表示该资源的变量设为NULL即可。


类型判断

php中提供了大量的函数用于判定变量类型,这些函数都返回一个布尔值:

is_int()/is_integer()/is_long()

is_float()/is_double()/is_real()

is_bool()

is_string()

is_null()

is_resource()

is_array()

is_object()

is_numeric()(是否为数字或数字字符串)

is_scalar()(是否为标量,标量指的是整数、浮点数、布尔值或字符串,其他的像数组、对象等则不是标量)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值