PHP语言

PHP 语言(超文本预处理器)

可嵌入 html 中,目标是允许 web 开发人员快速编写动态网页(可交互网页)

运算符

算术运算符

赋值运算符

递增/递减运算符

比较运算符

逻辑运算符

数组运算符

三元运算符

太空船运算符

类型比较

松散比较

严格比较

超全局变量

$GLOBALS

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。

PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。

PHP $_SERVER

$_SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。

$_SERVER[‘PHP_SELF’]返回当前执行脚本的文件名。
$_SERVER[‘GATEWAY_INTERFACE’]返回服务器使用的 CGI 规范的版本。
$_SERVER[‘SERVER_ADDR’]返回当前运行脚本所在的服务器的 IP 地址。
$_SERVER[‘SERVER_NAME’]返回当前运行脚本所在的服务器的主机名(比如 www.w3school.com.cn)。
$_SERVER[‘SERVER_SOFTWARE’]返回服务器标识字符串(比如 Apache/2.2.24)。
$_SERVER[‘SERVER_PROTOCOL’]返回请求页面时通信协议的名称和版本(例如,“HTTP/1.0”)。
$_SERVER[‘REQUEST_METHOD’]返回访问页面使用的请求方法(例如 POST)。
$_SERVER[‘REQUEST_TIME’]返回请求开始时的时间戳(例如 1577687494)。
$_SERVER[‘QUERY_STRING’]返回查询字符串,如果是通过查询字符串访问此页面。
$_SERVER[‘HTTP_ACCEPT’]返回来自当前请求的请求头。
$_SERVER[‘HTTP_ACCEPT_CHARSET’]返回来自当前请求的 Accept_Charset 头( 例如 utf-8, ISO-8859-1)
$_SERVER[‘HTTP_HOST’]返回来自当前请求的 Host 头。
$_SERVER[‘HTTP_REFERER’]返回当前页面的完整 URL(不可靠,因为不是所有用户代理都支持)。
$_SERVER[‘HTTPS’]是否通过安全 HTTP 协议查询脚本。
$_SERVER[‘REMOTE_ADDR’]返回浏览当前页面的用户的 IP 地址。
$_SERVER[‘REMOTE_HOST’]返回浏览当前页面的用户的主机名。
$_SERVER[‘REMOTE_PORT’]返回用户机器上连接到 Web 服务器所使用的端口号。
$_SERVER[‘SCRIPT_FILENAME’]返回当前执行脚本的绝对路径。
$_SERVER[‘SERVER_ADMIN’]该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。
$_SERVER[‘SERVER_PORT’]Web 服务器使用的端口。默认值为 “80”。
$_SERVER[‘SERVER_SIGNATURE’]返回服务器版本和虚拟主机名。
$_SERVER[‘PATH_TRANSLATED’]当前脚本所在文件系统(非文档根目录)的基本路径。
$_SERVER[‘SCRIPT_NAME’]返回当前脚本的路径。
$_SERVER[‘SCRIPT_URI’]返回当前页面的 URI。

PHP $_REQUEST

PHP $_REQUEST 用于收集 HTML 表单提交的数据(get 和 post 方式都可以接收)

PHP $_POST

PHP P O S T 广泛用于收集提交 m e t h o d = " p o s t " 的 H T M L 表单后的表单数据。 _POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。 POST广泛用于收集提交method="post"HTML表单后的表单数据。_POST 也常用于传递变量

PHP $_GET

PHP $_GET 也可用于收集提交 HTML 表单 (method =" get ") 之后的表单数据。

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

魔术方法(类似函数)

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

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

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

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

LINE

文件中的当前行号

FILE

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

DIR

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

FUNCTION

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

CLASS

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

文件包含

include 和 require 语句

在 PHP 中,您可以在服务器执行 PHP 文件之前在该文件中插入一个文件的内容。

include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码。

include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:

  • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。

  • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。

    代码示例:

  • <?php include 'header.php'; ?>
    

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。

包含文件省去了大量的工作。这意味着您可以为所有网页创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。

注:包含语句包含的文件最终会议主文件的格式打开(如包含一个txt文件,主文件为php,则txt会转化会php格式打开)

文件上传

创建一个文件上传表单

  • 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。
  • 标签的 type=“file” 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。

**注释:**允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。

通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。

第一个参数是表单的 input name,第二个下标可以是 “name”、“type”、“size”、“tmp_name” 或 “error”。如下所示:

  • $_FILES[“file”][“name”] - 上传文件的名称
  • $_FILES[“file”][“type”] - 上传文件的类型
  • $_FILES[“file”][“size”] - 上传文件的大小,以字节计
  • $_FILES[“file”][“tmp_name”] - 存储在服务器的文件的临时副本的名称
  • $_FILES[“file”][“error”] - 由文件上传导致的错误代码

这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关允许哪些用户上传文件的限制。

代码示例:

<!-- 基础语法 -->
<?php
$a = 100;
function fun($x,$ y)
{
echo($x+$ y);
}

function fun1()
{
    global $a;//在函数内部要访问全局变量需要加 global 关键字
    echo($a);
}
//声明定义函数关键字:function

echo "<h1> hello world </h1>";
//可以使用 html 中的标签

$name =" hello ";
//变量声明加$,若未初始化,则默认未 0 或空(不需要声明变量类型)
//变量分为局部/全局(global)/静态(static)

$id =" yyf ";
echo($name);
echo("<br>");
//换行符是字符

echo($name." ".$ id);//也可拼接多个字符
//字符串的拼接

echo("<br>");
echo(" my name is $name ");
echo("<br>");
echo('my name is $name');
//单引号和双引号区别
//双引号可识别变量,单引号全部当成字符

echo("<br>");
fun(2,3);
echo("<br>");
fun1();

const COUNT = 50;
//常量的定义用 const 关键字且名字一般为大写,常量为全局变量
//常量需要被函数访问时,不需要加 global 关键字
echo("<br>");
echo(COUNT);
echo("<br>");

var_dump($name);
//调试函数(无返回值)可显示变量类型和字节数

$t = true;
if(is_bool($t))
{
    echo("我是布尔类型");
}
//is_bool 函数可用来检测是否为 bool 值
//0 或空为 false,其余为 true

echo("<br>");
$str =<<< EOT
$name $ id
EOT;
echo($str);

echo("<br>");
$str1 =<<< EOP
<h1> yyf </h1>
<div> <a> 这是一个连接 </a> </div>
EOP;
echo($str1);
//字符串定义的三种类型: 单引号,双引号,heredoc 结构形式
//在 heredoc 类型中变量不需要拼接符来连接
// <<< 为 heredoc 的标识符,后要跟开始符,开始符和结束符要保持一致

// echo("<br>")
// $st =<<<'EOF'
// $name $ id
// EOF;
// echo($st);

//newdoc 与 heredoc 类型相似,但用了单引号,不能识别变量

echo("<br>");
$arr =[1,2,3," my "];
var_dump($arr);
echo("<br>");
echo($arr[3]);
echo("<br>");
$arr[3]=" your ";
echo($arr[3]);
//数组用法与 c 类似但元素不必为同一类型
unset($arr[3]);
echo("<br>");
var_dump($arr);
//unset 函数用于删除指定变量的函数

class person
{
    var $count = 1;//类属性
    function getcount()
    {
        echo($this->count);//$ this 为指向当前对象的指针
    }
}
$per = new person;
//类用 class 来实例化,先实例化再来用对象
//类似 c 的结构体
echo("<br>");
echo($per->count);//此处类似c结构体指针访问成员的操作,且因成员为属性,故不必加$
echo("<br>");
$per-> getcount();//类似于调用函数

$stu = 100;
unset($stu);
echo("<br>");
var_dump($stu);
//php 中的特殊类型:NULL 表示为空
//在三种情况下一个变量被认为是 NULL
//1.被赋值为 NULL 2.尚未被赋值 3.被 unset()销毁的变量
echo("<br>");
echo("hello"."world");
//.为连接字符串的符号

$arr_1 =[" a "=>" my love "," b "=> 12];
$arr_2 =[" c "=>" you are "," d "=> 15];//数组的另一种形式," a "," b " 等代表键名,后用 => 接实际的值
$arr_3=$ arr_1+$arr_2;//数组的结合用加号
echo("<br>");
var_dump($arr_3);

echo("<br>");
if(4 > 5)
{
    echo("wrong!");
}
else
{
    echo("right!");
}
//if else 语句与 c 相同
echo("<br>");
$f_u = 60;
switch($f_u)
{
    case $f_u >= 60:
        echo("成绩及格");
        break;
    case $f_u < 60:
        echo("成绩不及格");
        break;
    default: echo("wrong!"); break;
}
//swith 语句结构与 c 相同 但 case 后可跟范围判断
//do while,while,for 循环与 c 完全相同

echo("<br>");
$gu_shi =[
    "枯藤老树昏鸦",
    "小桥流水人家",
    "古道西风瘦马",
    "夕阳西下",
    "断肠人在天涯"
];
foreach($gu_shi as $ value)//第一个参数表示数组,第二个参数表示数组中元素的值
{
    echo($value."< br >");
}
echo("<br>");
$shu_zu =[1,2,3,4,5,6,7];
foreach($shu_zu as $ value)//可都用$value 来表示数组中元素的值
{
    echo($value."< br >");
}
//foreach 语句专用于遍历数组
//break, continue 等语句与 c 相同
// foreach 语法结构提供了遍历数组的简单方式。foreach 仅能够应用于数组和对象,如果尝试应用于其他数据类型的变量,或者未初始化的变量将发出错误信息。有两种语法:

// foreach (iterable_expression as $value)
//     statement
// foreach (iterable_expression as $key => $ value)
//     statement
// 第一种格式遍历给定的 iterable_expression 迭代器。每次循环中,当前单元的值被赋给 $value。

// 第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key。即 key 可以代表键名

$aa = 31;
$bb = 65;
$cc;
function addtion()
{
    $GLOBALS["cc"]=$ GLOBALS ["aa"]+$GLOBALS[" bb "];
}
addtion();
echo($cc);
//post 和 get 传值的区别:
//get 传值是 URL 明文传值(前端传的参数和值在?后面)
//post 传值不通过 URL 方式,不显示
phpinfo();
//函数作用:用来测试网站是否能执行 php, 查看 php 配置信息


?>
<!-- 前端代码 -->

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <meta http-equiv="X-UA-Compatible" content="IE=edge">

  <meta name="viewport" content="width=device-width, initial-scale=1.0">

 <title> Document </title>

</head>

<body>

 <form action="index.php" method="post" enctype="multipart/form-data">

  <label for="file"> 文件名:</label>

  <input type="file" name="file" id="file"> </br>

  <!-- type为file表示文件 -->

  <input type="submit" name="submit" value="提交">

 </form>

</body>

</html>
<!-- 后端代码 -->

<?php

$file=$_FILES ["file"];

$allowedexts =[" gif "," jpeg "," jpg "," png "];//白名单

$temp=explode(".",$_FILES ["file"]["name"]);//用.来分割字符串,将字符串变为数组

//第一个参数为分割界限(标准),第二个参数为字符串

var_dump($temp);

echo("</br>");

$extension=end($ temp);//end 函数用于取出数组的最后一个元素

echo($extension);

echo("</br>");

if((($file["type"]=="image/gif")||($ file ["type"]=="image/jpeg")||

($file["type"]=="image/jpg")||($ file ["type"]=="image/png"))

&&($file["size"]<204800)&&(in_array($ extension,$allowedexts)))//小于 200kb

//对上传的文件进行限制

{

echo("上传文件成功"."</br>");

echo("上传文件名:".$file[" name "]."</br >");

echo("文件类型:".$file[" name "]."</br >");

echo("文件大小:".$file[" name "]."</br >");

echo("文件临时存储的位置:".$file[" name "]."</br >");// 下次电脑重启时文件自动消失

}

else

{

echo("你上传的文件不符合要求");

}

?>

PHP的各种 I/O流 以及用法

php://协议

首先,我们来说一下一个php提供的协议:“php://”

大家可以翻开php手册,搜索一下

php://是php内置的一个类url操作的协议,它运行我们访问php各种I/O流,至于什么是I/O流,举个例子:

echo “hello world”; 这个字符串会经过php的处理,最后输出到用户端/控制台,而这个就是"hello world"就是 输出的 流,程序把这个字符串处理成一串串的二进制,输出到了用户端/控制台,这样的字符串就叫做输出流

同理,用户发起一个post请求,将数据传给服务器,服务器接收,这样的字符串就叫做输入流

好了,该协议的用法先放着,我们来看看php的各种I/O流

STDIN 输入流

STDIN输入流为 php的标准输入流,一般是指键盘输入到程序缓冲区的数据 在php中,主要是指在php-cli运行模式下,用户使用键盘输入到控制台的数据,例如:(注意,需要使用php-cli模式)

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 18-10-20
 * Time: 下午 5: 20
 */
echo "请输入你的名字:\n";
$stdin = fopen(" php://stdin ",'r');
$data = fgets($ stdin);
echo "{$data}大哥, 你好啊!";

img

可看到,上面使用了php://stdin 协议,打开了一个标准输入的操作句柄,然后可读取用户在控制台输入的数据

上面的代码也可写成:

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 18-10-20
 * Time: 下午 5: 20
 */
echo "请输入你的名字:\n";
$data = trim(fgets(STDIN));
echo "{$data}大哥, 你好啊!";

STDIN常量是一个已经打开的stdin流,可节省几行代码,也可节省小部分打开stdin的性能

当然,值得注意的点是:

  1. php://stdin打开的其实是STDIN常量已经打开的复制,所以就算关闭了php://stdin,也是关闭的复制,STDIN已打开的不会被关闭

  2. php://stdin是只读的

  3. 请直接使用STDIN常量,而不使用php://stdin

  4. 使用fgets读取,只能读取一行数据(检测到回车就返回),可以使用stream_get_contents 控制读取数量,用于一次性读取包含换行的输入数据

STDOUT输出流

STDOUT和STDIN正好相反,是标准输出流,它将运行php将字符串默认输出到控制台(可使用freopen重定向到文件),例如:(注意,使用php-cli模式运行)

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 18-10-20
 * Time: 下午 5: 20
 */
$stdout = fopen(" php://stdout ",'w');
fwrite($stdout," 这是输出 1\n ");
echo "这是输出 2\n";
fwrite(STDOUT, "这是输出 3\n");

img

和stdin注意点一样,这里不复制了,但需要加上一条:

在php-cli模式中,作用和echo相同,但是实现方式不一样

STDERR 标准错误

STRERR 标准错误和STDOUT差不多,都是将字符串默认打印到控制台(可使用freopen重定向到文件),但是这个是打印错误用的,区分就是STDERR会将打印的字符串变成红色(需要终端支持)

例如:(注意,使用php-cli模式运行)

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 18-10-20
 * Time: 下午 5: 20
 */
$stderr = fopen(" php://stderr ",'w');
fwrite($stderr," 这是输出 1\n ");
echo "这是输出 2\n";
fwrite(STDERR, "这是输出 3\n");
$a=$ b;

img

从上面的STDOUT注意点到这里可以发现,STDERR和echo语句的输出顺序是不相同的,个人猜测是echo的缓冲区和STDERR不相同

php://input

从这里开始,就和上面的3个程序标准I/O流关系不大啦,咱们继续往下看,该部分参考:http://www.nowamagic.net/academy/detail/12220520,有时间可详细阅读,本文只做功能简单介绍

php://input 是个可以访问请求的原始数据的只读流。

通俗来讲:php://input可接收用户请求过来的原始数据流(大多数时候作用于POST请求),例如:(需要使用web方式请求)

服务端代码:

<?php
$data = file_get_contents(" php://input ",'r');
echo "下面是 php://input\n";
var_dump($data);
echo 1;
echo "下面是 POST:\n";
var_dump($_POST);

客户端请求代码:

<?php
/**
 * Created by PhpStorm.
 * User: tioncico
 * Date: 18-10-27
 * Time: 下午 11: 06
 */

function send_post($url, $ post_data) {

    $postdata = http_build_query($ post_data);
    $options = array(
        'http' => array(
            'method' => 'POST',
            'header' => 'Content-type: application/x-www-form-urlencoded',
            'content' => $postdata,
            'timeout' => 15 * 60 // 超时时间(单位: s)
        )
    );
    $context = stream_context_create($ options);
    $result = file_get_contents($ url, false, $context);
    return $result;
}

//使用方法
$post_data = array(
    'username' => 'tioncico',
    'password' => '123456'
);
$data = send_post('http://test.cn', $ post_data);
var_dump($data);

img

php://output

php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。可以说功能和echo 一样(可以在web和php-cli使用)

<?php
file_put_contents("php://output", "仙士可最帅");

img

img

php://fd

php://fd 允许直接访问指定的文件描述符。 例如 php://fd/3 引用了文件描述符

在linux中,一切皆文件,当启动系统时,先会启动STDIN标准输入(文件描述符0),之后是STDOUT文件描述符1,STDERR文件描述符2 使用php://fd,可直接调用该文件:

<?php
$stdin = fopen(" php://fd/0 ",'r');
$data = fgets($ stdin);
echo " 这是 STDIN 输入的:{$data}\n ";
file_put_contents("php://fd/2", "这是 STDERR\n");
file_put_contents("php://fd/1", "这是 STDOUT\n");

img

php://memory 和 php://temp

php://memory 和 php://temp 是一个类似文件 包装器的数据流,允许读写临时数据。 两者的唯一区别是 php://memory 总是把数据储存在内存中, 而 php://temp 会在内存量达到预定义的限制后(默认是 2MB)存入临时文件中。 临时文件位置的决定和 sys_get_temp_dir() 的方式一致。 php://temp 的内存限制可通过添加 /maxmemory:NN 来控制,NN 是以字节为单位、保留在内存的最大数据量,超过则使用临时文件。例如:

<?php
// Set the limit to 5 MB.
$fiveMBs = 5 * 1024 * 1024;
$temp_f = fopen("php://temp/maxmemory:$ fiveMBs ", 'r+');//maxmemory 可以调整存储空间大小
fputs($temp_f, " hello, 仙士可, 我是 temp 的数据\n ");
rewind($temp_f);//由于写入数据时, 指针已经到了末尾, 需要重置指针才能读取到数据
echo stream_get_contents($temp_f);
$fiveMBs = 5 * 1024 * 1024;
$memory_f = fopen(" php://memory ", 'r+');//maxmemory 可以调整存储空间大小
fputs($memory_f, " hello, 仙士可, 我是 memory 的数据\n\n ");
rewind($memory_f);//由于写入数据时, 指针已经到了末尾, 需要重置指针才能读取到数据
echo stream_get_contents($memory_f);

img

注意:关闭文件之后数据将无法读取

php://filter

php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

php://filter 目标使用以下的参数作为它路径的一部分。 复合过滤链能够在一个路径上指定。详细使用这些参数可以参考具体范例。

名称描述
resource=<要过滤的数据流>这个参数是必须的。它指定了你要筛选过滤的数据流。
read=<读链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
write=<写链的筛选列表>该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
<;两个链的筛选列表>任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。
可选项
属性支持
受限于 allow_url_fopenNo
受限于 allow_url_include仅 php://input、 php://stdin、 php://memory 和 php://temp。
允许读取仅 php://stdin、 php://input、 php://fd、 php://memory 和 php://temp。
允许写入仅 php://stdout、 php://stderr、 php://output、 php://fd、 php://memory 和 php://temp。
允许追加仅 php://stdout、 php://stderr、 php://output、 php://fd、 php://memory 和 php://temp(等于写入)
允许同时读写仅 php://fd、 php://memory 和 php://temp。
支持 stat()仅 php://memory 和 php://temp。
支持 unlink()No
支持 rename()No
支持 mkdir()No
支持 rmdir()No
仅仅支持 stream_select()php://stdin、 php://stdout、 php://stderr、 php://fd 和 php://temp。
<?php
/* 这会以大写字母输出 www.example.com 的全部内容 */
readfile("php://filter/read = string.toupper/resource = http://www.example.com");

/* 这会和以上所做的一样,但还会用 ROT13 加密。 */
readfile("php://filter/read = string.toupper|string.rot13/resource = http://www.example.com");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值