PHP 数组

数组能够在单个变量中存储多个值:

数组是什么

数组是一个能在变量中存储多个值的特殊变量

在 PHP中,array()函数用于创建数组:

array();

在PHP中,有三种类型的数组:

数值数组-带有数字ID键的数组

关联数组 - 带有指定的键的数组 每个键关联一个值

多为数组 包含一个或多个数组的数组

PHP 数值数组

这里有两种创建数值数组的方法:

自动分配ID键(ID键总是从0开始):

$cars=array('volvo','bmw','toyota');

人工分配ID键

$cars[0]="Volvo";

获取数组的长度 - count()函数

count() 函数用于返回数组的长度(元素的数量):

遍历数值数组

遍历并打印数值数组中的所有值,您可以使用for循环,如下所示:

实例

<?php

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

foreach($age as $x=>$x_value)

{

  echo "Key=" . $x . ", Value=" .  $x_value;

  echo "<br>";

}

?>

PHP 关联数组

关联数组是使用您分配给数组的指定的键的数组。

PHP 数组排序

数组中的元素可以按字母或数字顺序进行降序或升序排列。

PHP - 数组排序函数

在本章中,我们将介绍下列PHP数组排序函数:

sort() - 对数组进行升序排序

rsort() - 对数组进行降序排序

asort() - 根据关联数组的值,对数组进行升序排列

ksort() - 根据关联数组的键,对数组进行升序排列

arsort() - 根据关联数组的值,对数组进行降序排列

krsort() - 根据关联数组的键,对数组进行降序排列

sort() - 对数组进行升序排列

下面的实例将$cars数组中的元素按照字母升序排列:

实例

<?php

$cars=array("Volvo","BMW","Toyota");

sort($cars);

print_r($cars);

?>

下面的实例将$numbers数组中的元素按照数字升序排列:

实例

<?php 

$numbers=array(4,6,2,22,11);

sort($numbers);

printf_r($numbers);

rsort() - 对数组进行降序排列

下面的实例将$cars 数组中的元素按照字母降序排列:

实例

<?php

$numbers=array(4,6,22,11);

rsort($numbers);

print_r($numbers);

?>

asort() - 根据数据的值,对数据进行升序排列

下面的实例根据数组的值,对关联数组进行升序排列:

实例

<?php 

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

asort($age);

print_r($age);

ksort() - 根据数组的键,对数组进行升序排列

下面的实例根据数组的键,对关联数组进行升序排列:

实例

<?php

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

ksort($age);

print_r($age);

?>

arsort() - 根据数组的值,对数组进行降序排序

下面的实例根据数组的值,对关联数组进行降序排序:

实例

<?php

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

arsort($age);

print_r($age);

?>

krsort() - 根据数组的键,对数组进行过降序排列

实例

<?php

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");

krsort($age);

print_r($age);

?>

PHP 超级全局变量

超级全局变量在PHP 4.1.0 之后被启用,是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。

PHP 超级全局变量

PHP中预定了几个超级全局变量(superglobals),这意味着他们在一个脚本的全部作用域都可用。你不需要特殊说明,就可以在函数及类中使用。

PHP 超级全局变量列表:

$GLOBALS

$_SERVER

$_REQUEST

$_POST

$_GET

$_FILES

$_ENV

$_COOKIE

$_SESSION

本章节我们将讲解几个常用的超级全局变量,其余变量我们在接下俩几个章节会介绍到。

PHP  $GLOBALS

$GLOBALS是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。

$GLOBAL 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

以下实例介绍了如何使用超级全局变量$GLOBALS;

实例

<?php

$x = 75;

$y = 25;

function addition()

{

  $GLOBALS['Z'] = $GLOBALS['x'] + $GLOBALS['y'];

}

addition();

echo $z;

?>

以上实例中z是一个$GLOBALS数组中的超级全局变量,给变量同样可以在函数外访问。

PHP $_SERVER

$_SERVER 是一个包含了诸如头信息(header),路径(path),以及脚本位置(script location) 等等信息的数组。这个数组中的项目由Web服务器创建。

不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列出来的项目。

以下实例中展示了如何使用$_SERVER中的元素:

实例

<?php

echo $_SERVER['PHP_SELF'];

echo "<br>";

echo $_SERVER['SERVER_NAME'];

echo "<br>";

echo $_SERVER['HTTP_HOST'];

echo '<br>';

echo $_SERVER['HTTP_REFERER'];

echo '<br>';

echo $_SERVER['HTTP_USER_AGENT'];

echo '<br>';

echo $_SERVER['SCRIPT_NAME'];

?>

下标列出了所有$_SERVER变量中的重要元素

$_SERVER['PHP_SELF']

当前执行脚本的文件名,与document root 有关。例如,在地址为 http://example.com/test.php/boo.bar 的脚本中使用$_SERVER['PHP_SELF']

将得到 /test.php/foo.bar 。 __FILE__ 常量包含当前(例如包含)文件的完整路径和文件名。从PHP4.3.0版本开始,如果PHP以命令行模式运行,

这个变量将包含脚本名。之前的版本该变量不可用。

$_SERVER['GATeway_INTERFACE']
服务器使用的 CGI 规范的版本 ; 例如 , "CGI/1.1"。

$_SERVER['SERVER_ADDR'] 

当前运行脚本所在的服务器的IP地址。

$_SERVER['SERVER_NAME'] 当前运行脚本所在的服务器的主机名。如果脚本运行与虚拟主机中,该名称是由那个虚拟主机所设置的值决定。

(如:www.php.cn)

$_SERVER['SERVER_SOFTWARE'] 服务器标识字符串,在响应请求时的头信息中给出。(如:Apache/2.2.24)

$_SERVER['SERVER_PROTOCOL'] 请求页面时通信协议的名称和版本。例如, "HTTP/1.0"。

$_SERVER['REQUEST_METHOD'] 访问页面使用的请求方法: 例如 "GET" "HEAD" "POST"  "PUT"

$_SERVER['REQUEST_TIME']  请求开始时的时间戳,从PHP5.1.0 起开始。

$_SERVER['QEERY_STRING'] query string (查询字符串),如果有的话,通过它进行页面访问。

$_SERVER['HTTP_ACCEPT']  当前请求头中Accept:项的内容,如果存在的话。

$_SERVER['HTTP_ACCEPT_CHARSET'] 当前请求头中Accept_Charset:项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8".

$_SERVER['HTTP_HOST']  当前请求头中Host:项的内容,如果存在的话。

$_SERVER['HTTP_REFERER']  引导用户代理到当前页的前一页的地址(如果存在)。由user agent设置决定。并不是所有的用户代理都会设置该项,

有的还提供了修改HTTP_REFERER的功能。简言之,该值并不可信。

$_SERVER['HTTPS']   如果脚本是通过HTTPS协议被访问,则被设为一个非空的值。

$_SERVER['REMOTE_ADDR']  浏览当前页面的用户的IP地址。

$_SERVER['REMOTE_HOST'] 浏览当前页面的用户的主机名。DNS反向解析不依赖于用户的REMOTE_ADDR。

$_SERVER['REMOTE_PORT'] 用户机器上链接到Web服务器所使用的端口号。

$_SERVER['SCRIPT_FILENAME']  当前执行脚本的绝对路径。

$_SERVER['SERVER_ADMIN'] 该值指明了Apache服务器配置文件中的SERVER_ADMIN参数。如果脚本运行在一个虚拟主机上,

则该值是那个虚拟主机的值。

$_SERVER['SERVER_SIGNATURE']  包含了服务器版本和虚拟主机名的字符串。

$_SERVER['PATH_TRANSLATED']  当前脚本所在文件系统(非文档根目录)的基本路径.这是在服务器进行虚拟到真实路径的映像后的结果

$_SERVER['SERIPT_NAME']  包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__常量包含当前脚本(例如包含

文件)的完整路径和文件名。

$_SERVER['SCRIPT_URI'] URI用来指定要访问的页面 例如 "/".

PHP $_REQUEST

PHP $_REQUEST 用于收集HTML表单提交的数据。

以下实例显示了一个输入字段(input) 及提交按钮(submit)的表单(form).当用户通过点击 "Submit" 按钮提交表单数据时,表单数据将

发送至<form>标签中action属性中指定的脚本文件。在这个实例中,在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP

文件来处理该数据,你可以修改指定的脚本文件名。然后,我们可以使用超级全局变量$_REQUEST来收集表单中的input字段数据;

实例

<html>

<body>

<from method="post" action="<?php echo $_SERVER['PHP_SELF']?>">

Name:<input type="text" name="fname">

<input type="submit">

</form>

<?php

$name = $_REQUEST['fname'];

echo $name;

?>

</body>

</html>

PHP $_POST

PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=post".

PHP $_GET

PHP $_GET 同样被广泛应用于收集表单数据,在HTML form 标签的指定该属性:"method"="get"

$_GET 也可以收集URL中发送的数据。

假定我们有一个包含参数的超链接HTML页面:

假定我们有一个包含参数的超链接HTML页面:

<html>

  <body>

    <a href="test_get.php?subject=PHP&web=php.cn">Test $GET</a>

  </body>

</html>

当用户点击链接 "Test $GET",参数 "subject" 和 "web" 将发送至 "test_get.php",你可以在 "test_get.php"文件中使用$_GET变量来获取这些数据。

以下实例显示了 "test_get.php" 文件的代码:

实例

<html>

  <body>

    <?php

      echo  "Study " . $_GET['subject'] . " at " . $_GET[‘web’];

    ?>

  </body>

</html>

 

PHP While 循环

循环执行代码块指定的次数,或者当指定的条件为真时循环执行代码块。

PHP 循环

在您编写代码时,您经常需要让相同的代码块一次又一次的重复运行。我们可以在代码中使用循环语句来完成这个任务。

在PHP中,提供了下列循环语句:

while - 只要指定的条件成立,则循环执行代码块

do....while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环

for - 循环执行代码块指定的次数

foreach - 根据数组中每个元素来循环代码块

while 循环

while 循环将重复执行代码块,直到指定的条件不成立。

语法

while(条件)

{

  要执行的代码:

}

实例

下面的实例首先设置变量i的值为  1($i=1;).

然后,只要i小于或者等于5,while循环将继续运行。循环每运行一次,i就会递增1;

$i =1;

while($i<=5)

{

  echo "The number is " . $i . "<br>";

  $i++;

}

do...while 语句

do...while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。

语法

do

{

  要执行的代码:

}while(条件);

实例 ....

for 循环

for 循环用于您预先知道脚本需要运行的次数的情况。

语法

for(初始值;条件;递增)

{

  要执行的代码;

}

参数:

初始值:只要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。

条件:循环执行的限制条件。如果为TRUE ,则循环继续。如果为FALSE,则循环结束。

增量:上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔).

实例

下面的实例定义一个初始值为 i=1的循环。只要变量i小于或者等于5,循环将继续运行。循环没运行一次,变量i就会递增1:

for($i=1;$i<=5;$i++)

{

  echo "The number is " . $i . "<br>";

}

foreach 循环

foreach 循环用于遍历数组。

Syntax

foreach($array as $value)

{

  要执行代码;

}

没进行一次循环,当前数组元素的值就会被赋值给$value变量(数组指针会逐一的移动),在进行下一次循环时,您将看到数组中的

下一个值。

下面的实例演示了一个输出给定数组的值的循环:

$x=array("one","two","three");

foreach($x as $value)

{

  echo $value . "<br>";

}

PHP 函数

PHP的真正威力源自于它的函数。

在PHP中,提供了超过1000个内建的函数。

创建PHP函数

函数是通过调用函数来执行的。

语法

function functionName()

{

  要执行的代码:

}

PHP 函数准则:

函数的名称应该提示出它的功能

函数名称以字母或下划线开头(不能以数字开头)

实例

一个简单的函数,在其被调用时输出我的名称

<?php

function writeName()

{

  echo "Kai Jim Refsnes";

}

writeName();

?>

PHP 函数 - 添加参数

为了给发函数添加更多的功能,我们可以添加参数。参数类似变量。

参数就在函数名称后面有一个括号内指定。

实例1

...

PHP魔术变量

PHP 向它运行的任何脚本提供了大量的预定有常量。

不过很多常量都是由不同的扩展库定义的,只有加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量他们的值随着他们在代码中的位置改变而改变。

例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:

__LINE__

文件中的当前行号。

实例:

<?php

  echo '这是第'  . __LINE__ . "行";

?>

__FILE__

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

自PHP4.0.2起,__FILE__ 总是包含一个绝对路径(如果是符号链接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

他等价于dirname(__FILE__).除非是根目录,否则目录中名不包括末尾的斜杠。(PHP5.3.0中新增)

__FUNCTION__

函数名称(PHP4.3.0新加)。自PHP5起常量返回该函数被定义的名字(区分大小写).在PHP4中该值总是小写字母的。

__CLASS__ 

类的名称(PHP 4.3.0 新加) 自PHP5起本常量返回该类被定义的名字(区分大小写)

在PHP4中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar).注意自PHP5.4起 __CLASS__对 trait 也起作用,

当用在trait方法中,__CLASS__是调用trait方法的类的名字。

__TRAIT__

Trait的名字(PHP5.4.0新加) 自PHP5.4.0起,PHP实现了代码复用的一个方法,称为 traits.

Trait 名包含其被声明的作用区域(例如 Foo\Bar)。

从基类继承的成员被插入的SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为MyHelloWorld 类中定义的方法一致。优先

顺序是当前类中的方法会覆盖trait方法,而trait方法又覆盖了基类中的方法。

__METHOD__

类的方法名(PHP5.0.0 新加).返回该方法被定义的名字(区分大小写)。

PHP 命名空间

PHP 命名空间(namespace)是在PHP5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。不过在PHP当中还是有着

相当重要的意义。

PHP 命名空间可以解决以下两类问题:

1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

定义命名空间

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

命名空间通过关键字 namespace 来声明。如果一个文件中包含命名空间,它必须在其他所有代码之前声明命名空间。语法格式如下;

在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的declare语句。所有非PHP代码包括空白符都不能出现在命名空间的声明之前。

子命名空间

与目录和文件的关系很像,PHP命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

namespace MyProject\Sub\level;

命名空间使用

PHP命名空间中的类名可以通过三种方式引用:

1. 非限定名称,或不包括前缀的类名称,例如 $a=new foo();或 foo:staticmethod();。如果当前命名空间是 currentnamespace,

foo将被解析为currentnamespace\foo. 如果使用foo的代码是全局的,不包含在任何命名空间中的代码,则foo会被解析为foo.

警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。

2.限定名称,或包含前缀的名称,例如 $a=new subnamespace\foo();或subnamespace\foo::staticmethod(); 如果当前的命名空间是

currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo. 如果使用foo的代码是全局的,不包含在任何命名空间中的代码,

foo会被解析为subnamespace\foo.

__NAMESPACE__

当前命名空间的名称(区分大小写).此常量是在编译时定义的(PHP5.3.0新增)

3.完全限定名称,或包含了全局前缀操作符的名称,例如,$a=new \currentnamespace\foo();或

\currentnamespace\foo::staticmethod();.在这种情况下,foo总是被解析为代码中的文字名(literalname)curentnamespace\foo.

命名空间和动态语言特征

PHP 命名空间的实现收到其他语言自身的动态特征的影响。因此,如果要将下面的代码转换到命名空间中,动态访问元素。

namespace 关键字和__NAMESPACE__ 常量

PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namesapce关键字。

常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包含在任何命名空间中的代码,它包含一个空的字符串。

__NAMESPACE__ 实例,在命名空间中的代码

使用命名空间:别名/导入

PHP 命名空间支持 有两种使用别名或导入方式:为类名称使用别名,或为命名空间名称使用别名。注意PHP不支持导入函数或常量

在PHP中,别名是通过操作符use来实现的,下面是一个使用所有可能的三种导入方式的例子:

名称解析遵循下列规则:

1. 对完全限定名称的函数,类和常量的调用在编译时解析。例如 new \A\B 解析为类 A\B

2.所有的非限定名称和限定名称(非完全限定名称)根据当前的导入规则在编译时进行转换。例如,如果命名空间 A\B\C 被导入为

C, 那么对 C\D\e() 会被转换为 A\B\C\D\e().

4. 非限定类名根据当前的导入规则在编译时转换(用全名代替短的导入名称)。例如 如果命名空间 A\B\C 导入为C ,则new C()

被转换为 new A\B\C().

5.在命名空间内部(例如A\B),对非限定名称的函数调用是在运行时解析的。例如对函数 foo() 的调用时这样解析的:

1. 在当前命名空间中查找名为 A\B\foo()的函数

2. 尝试查找并调用全局(global) 空间中的函数foo().

6. 在命名空间(例如A/B)内部对非限定名称或限定名称类(非完全限定名称)的调用是在运行时解析的。下面是调用  

new C() 及 new D\E() 的解析过程; new C() 的解析:new D\E()的解析:为了引用全局命名空间中的全局类,必须使用完全限定名称

new \C().

1.在类名称前面加上当前命名空间名称变成A\B\D\E 然后查找该类。

2.尝试自动装载类 A\B\D\E.

3. 在当前命名空间中查找A\B\C类。

4.尝试自动装载类A\B\C.

 

posted @ 2018-02-07 13:31  zhangsima  阅读(137)  评论(0编辑  收藏  举报