PHP学习记录2

PHP if...else...elseif 语句.

在 PHP 中,我们可以使用以下条件语句:

·    if 语句 - 如果指定条件为真,则执行代码

·    if...else 语句 - 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码

·    if...elseif....else 语句 - 选择若干段代码块之一来执行

·    switch 语句 - 语句多个代码块之一来执行

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $sun=150;
 if($sun>200){
     echo "满足条件1";
 }elseif($sun<180){
     echo "满足条件2";
 }else{
     echo "都不满足条件";
 }
 ?>

 

switch...case的语法结构如下:

switch (expr)

{

    case expr1:

        statement;

        break; 

    case expr2:

        statement;

        break; 

    ……

    default:

        statement;

}

 

switch 语句类似于具有同一个表达式的一系列 if 语句

每个case会依次判断,expr与expr1..n是否相等,如果相等则执行对应的statement,如果最后有break,则执行完成后跳出switch语句

default是在所有case都无法满足的情况下默认执行的操作

注意事项:

1.不要在case 后面写成分号,后面是冒号:

2.不要在case后面写判断区间,如($foo > 20 或者 $foo == 30)

3.switch里面在变量最好是 整型,字符串,因为布尔判断更适合if...else..

4.如果把每个case里的break去掉,那么每个case里的代码块会依次都执行到

5.switch语句可以不写default,但是作为好的习惯,建议保留default语句

 

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $dir='north';
 switch ($dir) {
     case 'west':
         echo '西';
         break;
     case 'east':
         echo '东';
         break;
     case 'north':
         echo '北';
         break;
     case 'sourth':
         echo '南';
         break;
     default:
         echo '未知';
         break;
 }

 

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 //得到今天是星期几的英文简称
 $day = date('D');
 
 switch($day){
     //拿学校举例,我们让星期一、二、三是校长日
     case 'Mon':
     case 'Tue':
     case 'Wed':
         echo '校长日';
         break;
     case 'Thu':
         echo '星期四';
         break;
     case 'Fri':
         echo '星期五';
         break;
     default:
         echo '周末,周末过的比周一到周五还要累<br />';
 }

 

 

数组

数组可以存入多个不同类型的数据,是一个复合数据类型。

我们可以使用array()来初始化数组,每个数组元素之间使用逗号分隔  

在PHP5.4版本之后,数组的初始化更为简洁,用中括号 [] 来初始化

我们来创建一个简单的数组

<?php
header("Content-type:text/html;charset=utf-8"); //设置编码
$array=array(100,1.34,true,"PHP中文网",);
echo '<pre>';//<pre>pre 元素可定义预格式化的文本。被包围在 pre //元素中的文本通常会保留空格和换行符。
var_dump($array);
echo '<pre/>';
?>

 

 

 

我们对着程序运行的结果看一下:

1.    array(size = 4) 说明里面有4个元素

2.    0 => int 100我们知道int是整型的意思,100是一个整型的数值。那前面的0,1,2,3和=>代表什么意思呢?

3.    最新前的0,1,2,3代表的是值的读取标识号,我们称之为下标或者键(英文:key)

4.    => 是一个符号标准叫法叫作:键值对应符。因此,以后再看到 0=> int 1 可以这样来说。 下标访问符0对应整型的1。

5.    我们还称数组里面的键值对为元素,元素就是键值对的组合。

通过上例,我们就完成了数组其中的一种声明方式:索引数组的声明。所谓索引数组:就是下标全为整型的数组。

 

索引数组若不强制声明他的下标,他的下标是从0开始的。(我们的第一个数组的值:只有不断努力才能博得未来。这个值的下标为0)。

2.    如果我指定过下标他的下标就为我指定的值。如下标为5,10和下标为19的,都是我指定过的值。

3.    若某个值(如php.cn),强制指定了下标(下标为10)。在它后面加上的值(PHP学院),不指定下标的话。他们的下标增

长规律为最大值+1。

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $kele = array(5=>'只有不断努力才能博得未来',10 => 'php.cn', 'PHP中文网' ,'好好学习哦',  19 => '去PHP中文网学习PHP');
 //打印显示$kele
 echo '<pre>';
 var_dump($kele);
 echo '</pre>';
 ?>

 

 

 

关联数组

索引数组适当的变一下形就出现了关联数组。只要数组里面有一个为字符串的数组,就为关联数组。

那我们来声明一下关联数组。跟索引数组的声明方式完成一样。不过不同的是,必须要指定字符串的下标和必须要使用键值对应符。

<?php
 $arr=[            //用[]创建数组
     'name'=>'Tom',
     'age'=>'18',
     'gender'=>'male'
 ];
 echo "<pre>";
 var_dump($arr) ;
 echo"</pre>"
 ?>

我们通过实验知道:

1.    声明关联数组是 键名 => 值

2.    在关联数组可以有索引数组的元素


数组是我们最常用到的类型,那如何计算某个一维数组的个数呢。其实我们可以用到我们之前学过的数学函数里面的一个:count()

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

 

<?php
$name=Array('tom','andy','jack');
$namae=Array('tom','andy','jack',Array('1','a'));
echo count($name);//3
echo '<br>'.count($namae);//4
?>

 

 

用for循环遍历索引数组

遍历二字,从字面解释就是一个接一个全读访问一次,显示出来。

因为for循环是一个单纯的计数型循环,而索引数组的下标为整型的数值。因此,我们可以通过for循环来遍历索引数组。

<?php
 $arr=Array('tom','andy','jack');
 $arrlength=count($arr);
 for($x=0;$x<$arrlength;$x++){
     echo $arr[$x];
     echo  "<br/>";
 }
 
 ?>

 

那么问题来了:

那关联数组怎么办? 如果索引数组的下标不连续怎么办?

这就要用到我们下面所学的知识了。

foreach的基本语法

有一个布尔型循环是专门用来循环数组的。这个循环的基本语法就是foreach基本语法

foreach( 要循环的数组变量 as [键变量 =>] 值变量){

    //循环的内容

}

这是一个固定用法,将要循环的数组放进去。

as 是一个固定的关键字

后面的键变量是可选的,随意定义一个变量,每次循环的时候,foreach这个语法会把键取出来赋值到键变量里面

后面的值变量是必填的。每次循环的时候,会把值放到值变量里面。

<?php
 $arr=[
     'name'=>'Tom',
     'age'=>'18',
     'gender'=>'male'
 ];
 foreach($arr as $k=>$v){
     echo $k.": ".$v."<br />";
 //其实就是把arr数组中的每个键赋值给k,再把每个值赋值给v
/*

1.    每次循环的时候,把下标赋值给了变量$key,把值的变量赋值给了变量$value

2.    循环一次读一次键和值。读到最后,发现没有可以读取的数组元素后,停止循环遍历数据。

*/
}; ?>

对于关联数组

<?php
 header("Content-type:text/html;charset=utf-8");    //设置编码
 $data = array(
     0 => '中国',
     100 => '美国',
     20 => '韩国',
     300 => '德国',
 );
  
 foreach($data as $k => $v){
 
     echo $k . '------' . $v .'<br />';
 
 }
 ?>

 

 按照foreach的结果推理与刚刚做的关联数组的结果是一样的。

不同的是不连续的索引数组。每读一次数组的元素,将当次循环的下标赋值给了变量$k,值赋值给了变量$v。每读将键和值输

出,然后显示出来。循环一次向后移动一次下标。读取至最后,退出执行。

 

 

 

 

PHP 数组排序

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

升序:从小到大的顺序进行排序,如果是英文单词,那么按字母A-Za-z的顺序排序,如果是数字,那么按数字的大小进行排序。

降序:与升序相反

 

数组排序函数

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

 

sort()函数

 

 注:sort大多是用来排序数字索引数组的,如果把一个关联数组放到sort里排序,那么数组的键会丢失

 

 

 

PHP 循环 - While 循环

 

PHP 循环

 

在您编写代码时,经常需要反复运行同一代码块。我们可以使用循环来执行这样的任务,而不是在脚本中添加若干几乎相等的代码行。

 

在 PHP 中,我们有以下循环语句:

 

·    while - 只要指定条件为真,则循环代码块

 

·    do...while - 先执行一次代码块,然后只要指定条件为真则重复循环

 

·    for - 循环代码块指定次数

 

·    foreach - 遍历数组中的每个元素并循环代码块

 


 

PHP while 循环

 

 while是一个布尔型循环,while(布尔判断)的值为true就执行大括号括起来的代码。如果为假就停出去,执行后续代码。

PHP do...while 循环

 do...while与while的区别是,它们的值的检查时机不同。

do-while 不论while判断是否成立,先执行一次代码代码块循环语句,保证会执行一次(表达式的真值在每次循环结束后检查)。

然而我们上面的while循环会检查布尔判断区域,成立则执行。不成立则不执行。

 

 

PHP 循环 - For 循环

 

For 循环

 

for 循环是 PHP 中的一种计数型循环,它的语法比较数活多变。

 

 

 


 

语法

 

for(表达式1,表达式2,表达式3){

 

     需要执行的代码

 

}

 

 ·   表达式1 是初始化赋值,可以同时赋值多个代码。

 

·   表达示2 在每次循环开始前求值。如果值为 TRUE,则继续循环,执行嵌套的循环语句。如果值为 FALSE,则终止循环。

 

·   表达示3 在每次循环之后被求值。

 

PHP 全局变量 - 超全局变量

超全局变量 在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。

PHP 全局变量 - 超全局变量

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global 

$变量名; 就可以访问它们。

PHP 超级全局变量列表:

 

·   $GLOBALS

·   $_SERVER

·   $_REQUEST

·   $_POST

·   $_GET

·   $_FILES

·   $_ENV

·   $_COOKIE

·   $_SESSION

 

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

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。

 

<?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['PHP_SELF']

当前执行脚本的文件名,与 document root 有关。例如,在地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将得到 /test.php/foo.bar。__FILE__ 常量包含当前(例如包含)文件的完整路径和文件名。 从 PHP 4.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']

请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496)
$_SERVER['QUERY_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['SERVER_ADMIN']

该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@php.cn)

 

 

$_SERVER['SERVER_PORT']

Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
$_SERVER['SERVER_SIGNATURE'] 包含了服务器版本和虚拟主机名的字符串。

 

$_SERVER['PATH_TRANSLATED']

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

 

 

$_SERVER['SCRIPT_NAME']

包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 常量包含当前脚本(例如包含文件)的完整路径和文件名。

 

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

 

<html>
 <body>
 
 <form 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>

 

实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_REQUEST 来收集表单中的input 字段数据:

 

在输入框里输入数据,提交查询

小提示:action:我们可以给他指定提交到某个文件下,例如action="app.php",

上面 的例子因为我们不想在创建一个php文件,所以这段话<?php echo

 $_SERVER['PHP_SELF'];?>的意思是提交到自己的页面

 

$_POST 变量用于收集来自 method="post" 的表单中的值

使用超级全局变量 $_POST 来收集表单中的 input 字段数据:

 

<html>
 <body>
 <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
     Name: <input type="text" name="name">
     Age  :<input type="text" name="age">
     <input type="submit">
 </form>
 <?php
 $name = $_POST['name'];
 $age=$_POST['age'];
 echo $name ."<br/>";
 echo $age;
 ?>
 
 </body>
 </html>

 

 

PHP $_GET 同样被广泛应用于收集表单数据

在HTML form标签的指定该属性:"method="get"。 从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送的信息量也有限制(最多 100 个字符)。

 

 

PHP 魔术变量

 

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

 

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

 

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

__LINE__

文件中的当前行号。

 

 

 

 

    __FILE__

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

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

 

 

 

    __DIR__

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

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

 

 

    __FUNCTION__

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

 

    __CLASS__

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

 

    __TRAIT__

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

 

    __METHOD__

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

 

    __NAMESPACE__

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

 

PHP 命名空间(namespace)

PHP 命名空间(namespace)是在PHP 5.3中加入的

 

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目

录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目

录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 

foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间、

 


 

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

 

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

 

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

 

定义命名空间

 

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

 

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

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

单个文件中定义多个命名空间。建议使用下面的大括号形式的语法。

 

<?php
declare(encoding='UTF-8'); //定义多个命名空间和不包含在命名空间中的代码 namespace MyProject {
const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } namespace AnotherProject { const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } } ?>

 

将全局的非命名空间中的代码与命名空间中的代码组合在一起,只能使用大括号形式的语法。全局代码必须用一个不带名称的 namespace 语句加上大括号括起来,例如:

 

 

 

<?php
namespace MyProject {

const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */  }
}

namespace { // 全局代码
session_start();
$a = MyProject\connect();
echo MyProject\Connection::start();
}
?>

子命名空间

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

<?php
namespace MyProject\Sub\Level;  //声明分层次的单个命名空间

const CONNECT_OK = 1;
class Connection { /* ... */ }
function Connect() { /* ... */  }

?>

上面的例子创建了常量 MyProject\Sub\Level\CONNECT_OK,类 MyProject\Sub\Level\Connection 和函数 MyProject\Sub\Level\Connect。

命名空间使用

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。

  3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

posted @ 2021-10-13 17:22  网安小白CE  阅读(40)  评论(0编辑  收藏  举报
Live2D