f10@t's blog

PHP学习--变量

字数统计: 3.2k阅读时长: 12 min
2018/11/08

在正式学习渗透测试前还是补补坑吧

一些了解

  维基百科对PHP的定义: > PHP: Hypertext Preprocessor (or simply PHP) is a server-side scripting language designed for Web development, and also used as a general-purpose programming language.`

  即:PHP(Hypertext Preprocessor), 它的名字意为:超文本预处理器。它的起源初期主要用于统计自己网站的访问者,后来用c语言进行了重新编写,拥有了自己的访问文件和数据库功能。PHP是一种生成动态网页的工具。与其他的制作技术相比,它的优点是学习简单,易于掌握,数据库连接方便,兼容性和扩展性强。可以进行面向对象编程。它是嵌入HTML文件的一种脚本语言,也是当前因特网中最为流行的脚本语言,它只需要很少的编程知识和技能,就能用PHP建立一个真正交互的Web站点。PHP可以结合HTML语言共同使用,与HTML之间具有很好的兼容性,使用者可以直接在脚本代码中加入HTML标签,或者在HTML标签中加入脚本代码,从而更好地实现页面控制,并提供更加丰富的功能。   (以上来自ctrl+v)   我自己的认识的话。首先从它本身来说,他是基于C语言开发的,所以对有C语言基础的人也比较友好,其次它具有面向对象编程的特点------但不能说它是一门面向对象的语言,因为它没有封装等的类实现。其次从功能来说,我自己了解的程度就是PHP是实现让用户和后台交互的一门语言,包括访问指定页面、获取查询的数据。除此之外PHP也可用于构建网站框架等等。    ### 语法规则 #### 基础语法   1. 标志:PHP脚本以<?php开始,?>结束,如:

1
2
3
<?php
//php代码
?>
文件默认扩展名为.php。   2. 使用:PHP文件通常包含HTML标签和一些PHP脚本代码。如:
1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html>
<body>

<h1>This is a test</h1>

<?php
echo "Hello World";//可以看出与C语句以分号结尾的习惯相同
?>
  3. 注释:与C语言相同,即:单行注释//注释文本,多行注释\*注释文本*\

变量

  PHP变量是具有面向对象编程特点的,即我们可以将变量理解为一模一样的“容器”,只不过他们里面装的东西类型不一样,所以类型区别而已。   1. 定义变量:所有变量的定义都以$开头,其后跟变量的名称。关于变量名称,必须以下划线或字母开头。且只能包括字母数字及下划线,字母的话是区别大小写的,即:&a&A是两个变量。注意不能包含空格。   2. 创建变量:注意这里我们的变量是不用声明类型的。

1
2
3
$a = "Hi";
$b = 5;
$c = 5.5;
  这里需要说明不需要声明类型的原因:PHP是弱类型语言。,当然python、Javascript都是弱类型语言。   关于弱类型语言: > In computer programming, programming languages are often colloquially classified as to whether the language's type system makes it strongly typed or weakly typed (loosely typed). Generally, a strongly typed language has stricter typing rules at compile time, which implies that errors and exceptions are more likely to happen during compilation. Most of these rules affect variable assignment, return values and function calling. On the other hand, a weakly typed language has looser typing rules and may produce unpredictable results or may perform implicit type conversion at runtime. A different but related concept is latent typing.

  那么弱类型有什么好处呢?直觉就是简单,直接复制,是什么类型会自动处理,完全的逻辑设计。所以使用弱类型会减少我们的开发时间,使代码更简洁。当然,也有坏处,类型不确定导致的不可预料的混乱,不像C语言等面向过程的强类语言,1就是1,绝对不会是"1"。

变量作用域

  PHP有四种不同的作用域:local、global、stastic、parameter。   1. 局部和全局作用域:与C语言一样,变量加上global关键词后脚本的任何一个地方都可以访问这个变量,local关键词默认是不用写的,比如C语言,定义在函数里的变量,main()函数是不能访问的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
<?php
$x=5;
$y=10;

function myTest()
{
global $x,$y; //全局变量,函数内可访问
$y=$x+$y;
}

myTest();
echo $y; //输出应该为15而不是10
?>
  结果:   如果我们这么写:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$x=5;
$y=10;

function myTest()
{
global $x;
echo $x;
echo $y;
}

myTest();
?>
  结果就会变为这样:   x正常输出、y变量提示未定义。即x为全局变量、y为局部变量。这就是global关键词的作用:让函数内可以读取函数外的变量值。      2. Static作用域   比如上面的function mytest(),如果我在里面再定义一个局部变量,这个函数执行完以后局部变量是会消失的,同C语言一样的道理。       那么怎么做到不让他消失呢,这就是Static作用域的作用。与上面一样,加个Static关键词就行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
function fun1()
{
$a = 10;
static $b = 20;
$a++;
$b++;
echo "$a ";
echo $b;
echo "<br>";
}


fun1();
fun1();
fun1();
?>
  结果   我们调用了三次函数,可以看出,\(a的值没有变,也就是说三次调用\)a一直是创建、删除、创建、删除...的状态,所以值没有变,但是$b是静态的所以保留了上次的结果没有变。   注意:虽然是静态的、但不意味他是全局的,外部是不能访问的。      3. parameter(参数)作用域   说白了就是可以调用传过来的参数。
1
2
3
4
5
6
7
8
<?php

function fun($x)
{
echo $x;
}

fun(5);
  输出自然也就是5了。

变量类型

  PHP一共支持八种数据类型,包括4种标量类型,即boolean(布尔型),integer(整形),float/double(浮点型)和string(字符串类型);两种复合类型,即array(数组),和object(对象);两种特殊类型,resource(资源)与bull。   4种标量类型这里不做赘述,与C语言相同。 ##### array数组类型:    数组是一组数据的集合,它把一系列数据组织起来,形成一个可操作的整体。数组中可以包括很多数据,如标量数据、数组、对象、资源以及php中支持的其他语法结构 。数组中的每个数据称为一个元素,元素包括索引(键名)和值两个部分。元素的索引可由数字或字符串组成,元素的值可以是多种数据类型。   PHP中使用array()函数来构建一个数组。PHP的数组共有三种:   1. 数值数组:   数值数组即带有数字ID键的数组。所谓ID其实就是数组的下标。有两种方式创建数值数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//数值型数组
//自动分配ID
$a = array(1,True,1.0,"string");
var_dump ($a);

echo "<br>";

//手动分配ID
$b[0]=1;
$b[1]=False;
$b[2]=1.1;
$b[3]="string";
var_dump($b)
?>
  结果:   2. 关联数组:关联数组是使用分配给数组的指定的键的数组。这个倒是感觉跟python的字典有类似的地方。仍然是两种定义方式。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//关联型数组
//第一种
$c = array("a"=>1,"b"=>True,"c"=>1.00001,"d"=>"string");
var_dump($c);

echo "<br>";

//第二种
$d["a"]=1;
$d["b"]=True;
$d["c"]=1.00001;
$d["d"]="string";
var_dump($d);
?>
  结果:   3. 多维数组:   与C语言中的比如a[10][10]等的二维数组类似,PHP中数组的内中不只上面的内容,也可是数组,即数组套数组,以此可以构造二维、三维数组。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//我们采用自动分配ID的方式
$sites = array
(
"php"=>array //即$sites["php"]
(
"php中文网", //即$sites["php"][0]
"http://www.php.cn"
),
"google"=>array
(
"Google 搜索",
"http://www.google.com"
),
"taobao"=>array
(
"淘宝",
"http://www.taobao.com"
)
);
print("<pre>"); // 格式化输出数组
print_r($sites);
print("</pre>");

echo "<br>";

//我们可以查看里面的内容
echo $sites["taobao"][0];
  结果:    ##### object对象类型   这个就有面向对象的概念了,与python这点事相同的。我们使用class来声明一个类队想,这里的对象可以包含一些方法和属性。如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
class Car
{
var $color;
function Car($color) {
$this->color = $color;
}
function what_color() {
return $this->color;
}
}

function print_vars($obj) {
foreach (get_object_vars($obj) as $prop => $val) { //get_object_vars:返回由对象属性组成的关联数组
echo " $prop = $val
";
}
}

//实例化一个类对象
$herbie = new Car("blue");

//返回由对象属性组成的关联数组
print_vars($herbie);
echo "<br>";
echo $herbie->what_color(); //调用方法时使用`->`即可

?>
  下面这张图就很形象的说明了object和class的关系:      首先我们定义了一个类,叫Car,它有一个属性color,其次他还有两个方法,方法car($color)会将实例化的对象的color属性赋值为$color的值,方法what_color()则返回示例的color属性。   结果:      关于PHP对象我会专门做一次总结,这里大概介绍。    ##### 两种特殊类型   1. 资源类型(resources):   资源数据类型是PHP4引进的。资源是一种特殊的变量类型,保存了到外部资源的一个引用:如打开文件、数据库连接、图形画布区域等。资源是通过专门的函数来建立和使用的。     如:
1
2
3
4
5
<?php
$fp = fopen("flag.txt", "r");
var_dump($fp);
fclose($fp);
?>
  跟C语言操作文件的函数还是有相同的地方的。   结果:   数字3:表示资源ID为5。stream:资源类型名称。      2. 空值类型(NULL):   NULL值表示变量没有值。数据类型值为NULL。由NULL值可以判断一个变量是否为空,也可以通过设置变量值为NULL 来清空变量数据。如:
1
2
3
4
5
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>
  输出NULL。    #### 补充:可变变量   可变变量的意思就是他的变量名时可以动态设置的。如:
1
2
3
4
5
$hi = "hello";
$$hi = "world"; //两个$$即可创造一个可变变量的变量

echo $hello; //输出world
echo $($hi); //输出world
  可以理解为将world字符串赋值给了hello变量。即$\(hi和\)hello是等价的   #### 常量   上面我们介绍了变量,这里再介绍一下常量。   常量和变量都是PHP的储存单元,但名称、作用域和声明方式都有所不同,下面是两者的区别:   1. 常量前面没有$符号。   2. 常量只能用define()来定义,而非赋值语句。   3. 常量可以不受作用域的限制,脚本任何地方都还可以定义和使用   4. 常量从定义之后就不能够被重新定义或取消定义,直到脚本结束。   5. 常量的值只能是上面的四种标量类型,即:布尔型、整数型、浮点型、字符型。   定义格式如下:       boolean define(string name,mixed value[,bool case_insensitive]);       第一个参数为常量名称,第二个为值或表达式,第三个可选,TRUE时为不区分大小写,False区分大小写,默认False。
1
2
define("CONSTANT", 100);
ehco a; //输出100
##### PHP中的预定义常量和魔术常量   1. 预定义常量为一些系统常量,如PHP_OS常量值为执行PHP解析的操作系统名称,如:UNIX或WINNT等.PHP_VERSION为当前PHP服务器版本,DIRECTORY_SEPARATOR是根据操作系统决定的目录分隔符,PATH_SEPARATOR为环境变量的目录分隔符。等等。如:

  2. PHP中共有5个魔术常量:__FILE__, __LINE__, __FUNCTION__ ,__CLASS__, __METHOD__。   它们分别意为:当前文件名、当前行数、当前的函数名、当前的类名、当前的对象的方法名。

  这里做一个演示:

1
2
3
4
5
6
7
<?php
echo "当前操作系统为:" . PHP_OS . "<br>";
echo "当前PHP版本为:" . PHP_VERSION . "<br>";
echo "当前文件名为:" . __FILE__ . "<br>";
echo "当前行号为:" . __LINE__ . "<br>";
echo "该系统环境分隔符为" . PATH_SEPARATOR . "<br>";
echo "该系统目录分隔符为" . DIRECTORY_SEPARATOR;
  返回结果:

CATALOG
  1. 1. 一些了解
    1. 1.1. 变量
    2. 1.2. 变量作用域
    3. 1.3. 变量类型