php基础入门篇学习笔记

背景、概述   早在Sql注入横行的前几年,字符串转化为整数就已经被列为每个web程序必备的操作了。web程序将get或post来的id、整数等值强制经过转化函数转化为整数,过滤掉危险字符,尽可能降低系统本身被Sql注入的可能性。
  现如今,虽然Sql注入已经逐渐淡出历史舞台,但是,为了保证web程序的正常运行,减少出错概率,更好的保证用的满意度,我们同样需要将用户的不正确输入转化为我们所需要的。
转化方式
  在PHP中,我们可以使用3种方式将字符串转化为整数。
1.强制类型转换方式   强制类型转换方式,就是“在要转换的变量之前加上用括号括起来的目标类型”(摘自PHP手册“类型戏法”节)的方式。
复制代码 代码如下:

php支持的基本数据类型:
Integer:整数
Float(Double,双精度值):浮点数,表示所有实数
String:字符串
Boolean:布尔值,true/false
Array:保存具有相同类型的多个数据项
Object:对象,保存类的实例
NULL:没有被赋值、已经被重置或被赋值为特殊值NULL的变量
特定的内置函数(例如数据库函数)将返回resource类型的变量

$foo = “1”; // $foo 是字符串类型
$bar = (int)$foo; // $bar 是整型
?>

四种标量类型:

  对于整型来说,强制转换类型名称为int或者integer。
2.内置函数方式   内置函数方式,就是使用PHP的内置函数intval进行变量的转换操作。
复制代码 代码如下:

string(字符串)
integer(整型)
float(浮点型,也作 double )
boolean(布尔型)
两种复合类型:

$foo = “1”; // $foo 是字符串类型
$bar = intval($foo); // $bar 是整型
?>

array(数组)
object(对象)
两种特殊类型:

  intval函数的格式为:   int intval(mixed $var [, int $base]); (摘自PHP手册)
  虽然PHP手册中明确指出,intval()不能用于array和object的转换。但是经过我测试,转换array的时候不会出任何问题,转换值为1,而不是想象中的0。恐怕是因为在PHP内部,array类型的变量也被认为是非零值得缘故吧。转换object的时候,PHP会给出如下的
notice:
  Object of class xxxx could not be converted to int in xxxxx.php on
line xx
  转换值同样为1。
3.格式化字符串方式
  格式化字符串方式,是利用sprintf的%d格式化指定的变量,以达到类型转换的目的。
复制代码 代码如下:

resource(资源)
NULL(空)
查看变量类型
通过 gettype() 函数可以方便的查看某个变量的类型:

澳门新葡萄京娱乐场,$foo = “1”; // $foo 是字符串类型
$bar = sprintf(“%d”, $foo); // $bar 是字符串类型
?>

 代码如下

  严格意义上讲sprintf的转换结果还是string型,因此它不应该算是字符串转化为整数的方式。但是经过他处理之后的字符串值确实已经成为了“被强制转化为字符串类型的整数”。
实际测试
  上面介绍了PHP中,将字符串转化为整数的3种方式。对于一般的程序员来说,看到这里就算结束了,下面的部分是针对变态程序员的。
1.基本功能测试   设定以下数组:
复制代码 代码如下:

<?php
$var_bool = TRUE;     // a boolean
$var_str  = “foo”;     // a string
$var_int  = 12;      // an integer

$a[] = “1”;
$a[] = “a1”;
$a[] = “1a”;
$a[] = “1a2”;
$a[] = “0”;
$a[] = array(‘4’,2);
$a[] = “2.3”;
$a[] = “-1”;
$a[] = new Directory();
?>

echo gettype($var_bool);    // 输出 boolean
echo gettype($var_str);     // 输出 string
echo gettype($var_int);     // 输出 integer
?>

  使用三种方式依次转化上面给出的数组中的元素,查看转换情况。程序源代码如下:
复制代码 代码如下:

提示
由于历史原因,如果是 float 类型数据,gettype() 函数返回的是
double,而不是 float 。
如果想查看某个表达式的值和类型,请使用用 var_dump() 函数。
判断变量类型
如果想通过判断变量类型来确定下一步逻辑动作,不要使用 gettype() ,而使用
is_type 系列函数:

$a[] = “1”;
$a[] = “a1”;
$a[] = “1a”;
$a[] = “1a2”;
$a[] = “0”;
$a[] = array(‘4’,2);
$a[] = “2.3”;
$a[] = “-1”;
$a[] = new Directory();
// int
print “(int)
“;
foreach($a as $v)
{
var_dump((int)$v);
print “
“;
}
// intval
print “intval();
“;
foreach($a as $v)
{
var_dump(intval($v));
print “
“;
}
// sprintf
print “sprintf();
“;
foreach($a as $v)
{
var_dump(sprintf(“%d”, $v));
print “
“;
}
?>

 代码如下

  程序的最终运行结果如下(已经去掉转换object时出现的notice):
(int)
int(1)
int(0)
int(1)
int(1)
int(0)
int(1)
int(2)
int(-1)
int(1)
intval();
int(1)
int(0)
int(1)
int(1)
int(0)
int(1)
int(2)
int(-1)
int(1)
sprintf();
string(1) “1”
string(1) “0”
string(1) “1”
string(1) “1”
string(1) “0”
string(1) “1”
string(1) “2”
string(2) “-1”
string(1) “1”
  由此可以看出,三种转换的结果是完全一样的。那么从功能上讲,3种方式都可以胜任转换工作,那么接下来的工作就是看哪一种效率更高了。
2.性能测试
  被测试字符串是我们在注入工作中可能会使用到的一种:
复制代码 代码如下:

<?php
$var_int  = 12;

$foo = “1′;Select * …”;
?>
  获取时间点的函数如下(用于获取测试起始点和结束点,以计算消耗时间):

// 如果 $var_int 是 int 类型,这进行加法
if (is_int($var_int)) {
    $var_int = $var_int+4;
}
echo $var_int;  // 输出 16
?>

**
* Simple function to replicate PHP 5 behaviour
*/
function microtime_float()
{
list($usec, $sec) = explode(” “, microtime());
return ((float)$usec + (float)$sec);
}
?>

NULL和resource都代表外部资源,例如数据库连接
基本上不能直接操作一个resource变量,但是通常它们都将被函数返回,而且必须作为参数传递给其他函数。

  (摘自PHP手册microtime()函数节)
  测试过程是使用每种方式转换变量$foo
1000000次(100万次),并将各自的消耗时间输出,总共进行三组测试,尽可能降低误差。测试程序如下:
复制代码 代码如下:

在php中,变量的类型是由赋给变量的值确定的。(动态类型语言)
PHP可以在任何时间根据保存在变量中的值来确定变量的类型,也就是具有在任何时间透明地改变变量类型的功能。
PHP将“自动地”获得输入的数据类型,一旦从变量中检索变量值,它将返回具有相同数据类型的数据。
养成习惯:常量名称都是由大写字母组成的。这样容易区分变量和常量。
常量和变量之间的一个重要不同点在于引用一个常量的时候,它前面并没有$符号。
常量和变量的另一个差异在于常量只可以保存布尔值、整数、浮点数或字符串数据,这些类型都是标量数据。

function microtime_float()
{
list($usec, $sec) = explode(” “, microtime());
return ((float)$usec + (float)$sec);
}
$foo = “1′;Select * …”;

变量类型变化(juggling)
PHP不需要(或者说不支持)在声名变量明确他的变量类型;一个变量的类型是由这个变量被使用的前后关系来决定的,也就是说,如果你给一个变量var赋了
一个字符串的值,var就变成了字符串变量。如果你再将一个整数赋值给var,他又变成了一个整数型变量。
一个PHP自动转化变量类型的例子是加法的操作符’+’。如果任何一个操作数都是双精度数,那么所有的操作数被当作双精度数求值,并且结果也是双精度数。
否则,操作数将被认为是整数,结果也将会是整数。注意这并不影响每个操作数本身的变量类型,唯一的变化就是操作数在计算的过程中被如何处理。
$foo  =  “0”;  //  $foo  是一个字符串  ,值是“0”(ASCII  48)

// (int)
$fStart = microtime_float();
for($i=0;$i<1000000;$i++)
{
$bar = (int)$foo;
}
$fEnd = microtime_float();
print “(int):” . ($fEnd – $fStart) . “s
“;
// intval()
$fStart = microtime_float();
for($i=0;$i<1000000;$i++)
{
$bar = intval($foo);
}
$fEnd = microtime_float();
print “intval():” . ($fEnd – $fStart) . “s
“;
// sprintf()
$fStart = microtime_float();
for($i=0;$i<1000000;$i++)
{
$bar = sprintf(“%d”, $foo);
}
$fEnd = microtime_float();
print “sprintf():” . ($fEnd – $fStart) . “s
“;
?>

PHP代码

  最终的测试结果:
(int):0.67205619812012s
intval():1.1603000164032s
sprintf():2.1068270206451s
(int):0.66051411628723s
intval():1.1493890285492s
sprintf():2.1008238792419s
(int):0.66878795623779s
intval():1.1613430976868s
sprintf():2.0976209640503s

 代码如下

  虽然这个测试有点变态(谁会连续转换100w次的整数?),但是由此可以看出,使用强制类型转换将字符串转化为整数速度是最快的。
总结
  使用强制类型转换方式将字符串转化为整数是最直接的转化方式之一(可以直接获得整型的变量值)。从代码可读性角度上讲,sprintf方式代码比较长,而且其结果有可能还需要再次进行强制类型转换,而intval函数是典型的面向过程式转换,强制类型转换则比较直接的将“我要转化”这个思想传递给阅读者。从效率上讲,强制类型转换方式也是最快速的转化方式。因此,对于经常进行转化工作的程序员,我推荐使用这种方式。

$foo  =  “0”;  //  $foo  是一个字符串  ,值是“0”(ASCII  48)     
$foo++;  //  $foo  是一个字符串,值是“1”(ASCII  49)     
$foo  +=  1;  //  $foo  现在是一个整数(2)了     
$foo  =  $foo  +  1.3;  //  $foo  现在是一个双精度数(3.3)了     
$foo  =  5  +  “10  Little  Piggies”;  //  $foo  是一个整数  (15)     
$foo  =  5  +  “10  Small  Pigs”;  //  $foo  是一个整数  (15)  

如果你觉得上面例子中最后两个表达式看起来有点奇怪的话,请看
“字符串的转化”部分。
如果你希望强制一个变量被当作某种固定的类型来计算,请看
“类型强制(casting)”
一节。如果你希望转变一个变量的类型,请看函数“settype()”的说明。
 确定一个变量的类型
因为PHP自己决定变量的类型并且一般按照需要转化他们,一个特定的变量的类型不是在任何时间都非常明显。PHP包括一些函数可以找出这个变量的类型。这
些函数是gettype(), is_long(), is_double(), is_string(), is_array(),
和 is_object().
类型强制(type casting)
在PHP中类型强制同在C语言中大抵相似:将需要的类型的种类写在要强制的变量的前面的圆括号中。
 

PHP代码

 代码如下

$foo  =  10;  //  $foo  是一个整数    
$bar  =  (double)  $foo;  //  $bar  是一个双精度数   

以下的强制方式是允许的: (int), (integer) – 强制成整数 (real), (double),
(float) – 强制成双精度数 (string) – 强制成字符串 (array) – 强制成数组
(object) – 强制成对象 注意在圆括号中允许制表符(tabs)和空格(spaces)
,因此下面的语句是等价的: $foo = (int) $bar; $foo = ( int ) $bar;
字符串转化
当一个字符串被当作数字型的值来计算时,他的结果和类型如下面所述的决定。
如果这个字符串含有字符’.’,’e’,或者’E’,则被当作双精度类型变量来处理,否则当作是整数。
这个字符串的值由词首部分决定。如果这个字符串以任何有效的数字的数据开始,那么这个数字数据就是这个字符串参加运算的值。否则,值为零(zero)。有
效的数字数据是遵循下面的这些标记的,跟随在一个或多个数字后面(可以包含小数点),跟随在一个可选的指数后面。指数是由一个或多个数字跟在’e’或
’E’后面构成的。
 

PHP代码

 代码如下

$foo  =  1  +  “10.5”;  //  $foo  是双精度数  (11.5)     
$foo  =  1  +  “-1.3e3”;  //  $foo  是双精度数(-1299)     
$foo  =  1  +  “bob-1.3e3”;  //  $foo  是整数  (1)     
$foo  =  1  +  “bob3”;  //  $foo  是整数  (1)     
$foo  =  1  +  “10  Small  Pigs”;  //  $foo  是整数  (11)   
$foo  =  1  +  “10  Little  Piggies”;  //  $foo  是整数  (11);     
//  这个字符串包括字符’e’  

标识符

操作符:
1)赋值操作符:=

2)算术操作符:+,-,*,/,%(取模)

3)连接操作符:. ,无论操作数是什么,都当成String,结果返回String

4)合计赋值操作符(Combined Assignment Operators):+=,*=,/=,-=,%=,.=

5)自动增减操作符(Automatically Incrementing and Decrementing):

(1)$variable+=1 ⇔$variable++;$variable-=1
⇔$variable-,跟c语言一样,先做其他操作,后++或-

(2)++$variable,-$variable,先++或-,再做其他操作

6)比较操作符:

= =(左边等于右边),!=(左边不等于右边),
= = =(左边等于右边,且数据类型相同),
>=,>,<,<=

7)逻辑操作符:|| or,&&
and,xor(当左右两边有且只有一个是true,返回true),!

一个参考表

运算符(Arithmetic Operators)

Operator
符号
Description
描述
Example
案例
Result
结果
+ Addition
加号
x=2
x+2
4
Subtraction
减号
x=2
5-x
3
* Multiplication
乘号
x=4
x*5
20
/ Division
除号
15/5
5/2
3
2.5
% Modulus (division remainder)
求模(余数)
5%2
10%8
10%2
1
2
0
++ Increment
自加
x=5
x++
x=6
Decrement
自减
x=5
x–
x=4

Assignment Operators
分配符(Assignment Operators)

Operator
符号
Example
案例
Is The Same As
等同于
= x=y x=y
+= x+=y x=x+y
-= x-=y x=x-y
*= x*=y x=x*y
/= x/=y x=x/y
%= x%=y x=x%y

Comparison Operators
比较符(Comparison Operators)

Operator
符号
Description
具体描述
Example
案例
== is equal to
等于
5==8 返回 false
!= is not equal
不等于
5!=8 返回  true
> is greater than
大于
5>8 返回  false
< is less than
小于
5<8 返回  true
>= is greater than or equal to
大于等于
5>=8 返回  false
<= is less than or equal to
小于等于
5<=8 返回  true

Logical Operators
逻辑判断符(Logical Operators)

Operator
符号
Description
描述
Example
案例
&& and
x=6
y=3

(x < 10 && y > 1) 返回 true

|| or
x=6
y=3

(x==5 || y==5) 返回 false

! not
x=6
y=3

!(x==y)返回true

其他操作符:

三元操作符、错误抑制操作符、执行操作符、数组操作符、类型操作符

运算符”?”前的表达式

如果一个包含二元运算符的表达式出现在三元运算符” ? :
“的”?”之前,那么应该给表达式添上一对圆括号。例如:
(x >= 0) ? x : -x;

下面我们来看一个简单的?号表达式实例

 代码如下

<?

$a=1;

echo $a?’true’:’false’;

输出结果为 trur;

再看

if( $a )

{

   echo ‘true’;

}

else

{

   echo ‘false’;

}

发表评论

电子邮件地址不会被公开。 必填项已用*标注