php学习(一)

PHP基础

PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言。

PHP 是什么?

  • PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
  • PHP 脚本在服务器上执行。
  • PHP 可免费下载使用。

php基础框架与语法

php基础框架:

//文件扩展名为 .php
<? php
//php code
?>

PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码,下面将输出hello world

<!DOCTYPE HTML>
<html>
    <title>
        PHP
    </title>
    <body>
        <h1>PHP learn!</h1>>
        <?php
        echo "Hello World!";
        ?>
    </body>
</html>

image-20220731143704691

php变量

  • 变量以 $ 符号开始,后面跟着变量的名称
  • 变量名必须以字母或者下划线字符开始
  • 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
  • 变量名不能包含空格
  • 变量名是区分大小写的($y $Y 是两个不同的变量)
<?php
$a = 1;
$b = 2;
$c = $a + $b;
echo $c;
?>
//会打印3

php变量作用域:

  • local
  • global
  • static
  • parameter
<?php
    $a = 1;
$c = 0;
function Test(){
    $b = 10;
    global $a,$c;
    $c = $b + $a;
    //    echo $c;
    static $d = 12;
    echo $d++ ."</br>";
}
Test();
Test();
Test();
echo "c为::".$c;
?>

image-20220731160308897

php5 的 echo 与 print

echo 和 print 区别:

  • echo - 可以输出一个或多个字符串
  • print - 只允许输出一个字符串,返回值总为 1
  • 提示:echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。

echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()。

print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()。

<?php
$a = 1;
$c = 0;
echo $a + $c;
echo "<br/>";       //换行
echo ($a + $c);
echo ("<br/>");     //换行
print($a + $c);
print("<br/>");     //换行
print $a + $c;
print "<br/>";      //换行
?>
//输出1111

PHP EOF(heredoc)

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。

使用概述:

  • 必须后接分号,否则编译通不过。
  • EOF** 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
  • 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。**
  • 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
  • 当内容需要内嵌引号(单引号或双引号)时,不需要加转义符,本身对单双引号转义,此处相当与q和qq的用法。
<?php
$name="h13k";
$a= <<<EOF
        "name:"$name
        "attack!!!"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>
//输出"name:"h13k "attack!!!"

PHP数据类型

  • String(字符串)
  • Integer(整型)
  • Float(浮点型)
  • Boolean(布尔型)
  • Array(数组)
  • Object(对象)
  • NULL(空值)
  • Resource(资源类型)
<?php
$string = "Hello World!";
$integer = 123456789;
$float = 12345.6789;
$bool = True;
$array = array("web", "pwn", "reverse", "misc", "crypto", 1, 2, 3, 4, 5);

class ACM
{
    var $algorithm;

    function __construct($algorithm = "basic")
    {
        $this->algorithm = $algorithm;
    }

    function how_to_learn_acm()
    {
        return $this->algorithm;
    }
}

$NULL = null;
var_dump($string);
echo "<br/>";
var_dump($integer);
echo "<br/>";
var_dump($float);
echo "<br/>";
var_dump($bool);
echo "<br/>";
var_dump($array);
echo "<br/>";
?>
//string(12) "Hello World!"
//int(123456789)
//float(12345.6789)
//bool(true)
//array(10) { [0]=> string(3) "web" [1]=> string(3) "pwn" [2]=> string(7) "reverse" [3]=> string(4) "misc" [4]=> string(6) "crypto" [5]=> int(1) [6]=> int(2) [7]=> int(3) [8]=> int(4) [9]=> int(5) }

PHP类型比较

  • 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
  • 严格比较:用三个等号 ===比较,除了比较值,也比较类型。

image-20220731171104479

image-20220731171401620

image-20220731171426171

image-20220731171440560

image-20220731171452629

ctf中的php弱类型比较以及相关漏洞

  • 字符串和数字比较,字符串会被转换成数字0。

    • admin”==0  //true
  • 混合字符串转换成数字,看字符串的第一个。

    • '1admin' == 1
      '2admin' == 2
  • 字符串开头以xex开头,x代表数字。会被转换成科学计数法。

    • x*10^x的形式。
    '2e2'=2*10^2=200
    "-2e2"=-2*10^2 "0e2"=0*10^2=0 
    "hh-2e2"=0
    "1hh-2e2"=1

应用举例:

if (md5($Username) != md5($password)) {$logined = false;}
==>md5('240610708') == md5('QNKCDZO')
<?php
var_dump(‘0e45511255’ == ‘0e1455155’);
var_dump(‘0e45511255’ == ‘0’);
?>
//bool(true) bool(true)
0e开头的md5和原值:
s878926199a ==> 0e545993274517709034328855841020
s155964671a ==> 0e342768416822451524974117254469
s214587387a ==> 0e848240448830537924465865611904
s214587387a ==> 0e848240448830537924465865611904
s878926199a ==> 0e545993274517709034328855841020
s1091221200a ==> 0e940624217856561557816327384675
s1885207154a ==> 0e509367213418206700842008763514
s1502113478a ==> 0e861580163291561247404381396064
s1885207154a ==> 0e509367213418206700842008763514
s1836677006a ==> 0e481036490867661113260034900752
s155964671a ==> 0e342768416822451524974117254469
s1184209335a ==> 0e072485820392773389523109082030
s1665632922a ==> 0e731198061491163073197128363787
s1502113478a ==> 0e861580163291561247404381396064
s1836677006a ==> 0e481036490867661113260034900752
s1091221200a ==> 0e940624217856561557816327384675
s155964671a ==> 0e342768416822451524974117254469
s1502113478a ==> 0e861580163291561247404381396064
s155964671a ==> 0e342768416822451524974117254469
s1665632922a ==> 0e731198061491163073197128363787
s155964671a ==> 0e342768416822451524974117254469
s1091221200a ==> 0e940624217856561557816327384675
s1836677006a ==> 0e481036490867661113260034900752
s1885207154a ==> 0e509367213418206700842008763514
s532378020a ==> 0e220463095855511507588041205815
s878926199a ==> 0e545993274517709034328855841020
s1091221200a ==> 0e940624217856561557816327384675
s214587387a ==> 0e848240448830537924465865611904
s1502113478a ==> 0e861580163291561247404381396064
s1091221200a ==> 0e940624217856561557816327384675
s1665632922a ==> 0e731198061491163073197128363787
s1885207154a ==> 0e509367213418206700842008763514
s1836677006a ==> 0e481036490867661113260034900752
s1665632922a ==> 0e731198061491163073197128363787
s878926199a ==> 0e545993274517709034328855841020

bool类型的true跟任意字符串可以弱类型相等

<?php
if ( true=“H1TerHub”){
echo "success";
}

Strcmp函数的漏洞

strcmp() 函数比较两个字符串。

注释:strcmp() 函数是二进制安全的,且区分大小写。

语法:

strcmp(string1,string2)

string1 必需。规定要比较的第一个字符串。

string2 必需。规定要比较的第二个字符串。

返回值:

  • 0 - 如果两个字符串相等
  • <0 - 如果 string1 小于 string2
  • >0 - 如果 string1 大于 string2

漏洞原理:

在php 5.2版本之前,利用strcmp函数将数组与字符串进行比较会返回-1,但是从5.3开始,会返回0

<?php
    $password="***************";
    if(isset($_GET['password'])){
        if(strcmp($_GET['password'],$password)==0){
            echo "flag{xxxxx-xxx-xxxx}";
        }else{
            echo "NO password ";
        }
    }
?>
//构造password为一个数组数组传值为1
//payload:?password[]=1

Sha1函数的漏洞

和上面类似:

//url/check.php?a[]=213
<?php 
if(sha1($_GET('a')) == 1)
    echo "flag";
?>

Switch绕过

绕过方式
switch选择的时候,处理的变量会被强转为int类型,这个函数一般用于根据多个条件选择执行不同动作,和if…. else相似

<?php
    $a=$_GET['$a'];
switch ($a) {
    case 1:
        echo "error";
        break;
    case 2:
        echo "error2";
        break;
    case 3:
        echo "error3";
        break;
    case 4:
        echo "233";
        break;
}
?>
//输入7sadshsajkhdsah
//返回7

json绕过

json_decode()这个函数用于解码json格式的字符串

绕过方式
当有不同类型的数据时,该函数会转换为同一类型比较,这里会把原有的数据的数据类型转换为和传入数据的数据类型相同

<?php
if (isset($_GET['m'])) {
    $m = json_decode($_GET['m']);
    $flag ="dfdfgdg";
    if ($m->flag == $flag) {
        echo "233";
    }
    else {
        echo "haha";
    }
}
else{
    echo "hahaha";
}
?>

image-20220801190340384

字符要用json格式去编写,这里设定名称为flag,传入数字时,它会转化为同一类型进行比较,这里字符被转为0,我们传入的参数为0,所以相等。

in_array函数

函数格式 in_array(需要在数组内搜索的数值,被搜索的数组,一个可选参数,设置TURE检查数据和数组值类型是否相同)

绕过方式
这个函数的作用是检查数组中是否存在某个值,当没有最后的检测参数为true时,默认为松散比较,导致弱类型,传入不同数据类型来绕过

<?php
$array=[1,2,3];
var_dump(in_array('aaa', $array)); 
var_dump(in_array('1aa', $array));
?>
//bool(false)bool(true)

array_search()函数

该函数的作用是在数组中搜索某个键值,并返回键名

绕过方式
1.传入不同数据类型来绕过,没有最后的检测参数为true时,默认为松散比较,导致弱类型
2.当数据类型不同会先把原有数据的数据类型的进行转换,导致弱类型的产生

<?php
$array=[1,1];
var_dump(array_search('aaa', $array)); 
var_dump(array_search('1aa', $array));
?>
//bool(false)int(0)

和前面in_array一样,当没有设定检测参数为true时,会进行松散比较,会把数据类型进行转换,然后执行

intval() 函数

该函数用于获取变量的整数值

绕过方法:
该函数处理本身不能处理的字符串时并不会报错,直接返回0,当函数内有其他的操作时,会把字符串这些转为数字类型再操作,而且在处理一些特殊数据的时候会有不同的处理结果

<?php
    @$a=$_GET['a'];
if(intval($a) < 2000 && intval($a +1) >2050){
    echo "hahahah";
}
else
{
    echo "233";
}
?>
<?php
echo intval(25); //25
echo '<br/>';
echo intval(2.5); //2
echo '<br/>';
echo intval('25'); //25
echo '<br/>';
echo intval('+25'); //25
echo '<br/>'; 
echo intval('-25');//-25
echo '<br/>'; 
echo intval(025);//21
echo '<br/>'; 
echo intval('025');//25
echo '<br/>'; 
echo intval(1e10);//1410065408
echo '<br/>'; 
echo intval('1e10');//1
echo '<br/>'; 
echo intval(0x1A);//26
echo '<br/>'; 
echo intval(25000000);//25000000
echo '<br/>'; 
echo intval(250000000000000000000);//2007498752
echo '<br/>';
echo intval('420000000000000000000');//2147483647
echo '<br/>';
echo intval(25, 8);//25
echo '<br/>';
echo intval('0x42');//0
echo '<br/>';
echo intval(array());//0
echo '<br/>';
echo intval(array('aaa', 'abb'));//1
echo '<br/>';
echo intval('aaa', 8);//0
echo '<br/>';
echo intval('fgh');//0
echo '<br/>';
echo intval('1e10'+8);//1410065416
echo '<br/>';
echo intval('0x2000'+8);//8200
?>

is_numeric函数

这个函数用于检测变量是否只由数字组成,否则返回false

绕过方法

当传入数字开头,字母在后的字符串时,参数可以绕过某些检测,从而进行到下一步,而php处理不同字符串时又会把两个字符串转换到同一类型去处理

<?php
@$a="hehehehehe";
@$temp = $_GET['p'];
if(is_numeric($temp)){
die("hahha");
}
else if($temp>2010) {
    echo $a;
}
?>

strpos函数

strpos函数用于查找目标字符在字符串中出现的第一次的位置

绕过方法
strpos在处理数组时直接返回null,而没有返回false,导致问题发生
测试代码

<?php
if (isset ($_GET['a'])) {
if(@ereg("^[1-9]+$", $_GET['a']) === FALSE)
echo '必须输入数字才行'; 
else if (strpos ($_GET['a'], '#asdafdasdadas') !== FALSE)
die("bababab"); 
else
echo 'hoho';
}
?>

这里通过数组的形式去传入一个数字,首先绕过第一道检测,然后在第二处strpos检测时,通过数组去绕过,直接返回null,从而绕过

eregi()函数

//字符串对比解析,当ereg读取字符串string时,%00后面的字符串不会不会被解析。
#这里 a=abcd%001234,可以绕过
<?php
    if (ereg ("^[a-zA-Z]+$", $_GET['a']) === FALSE)  {
        echo 'You password must be alphabet';
    }
?>
//如果传入数组,ereg返回NULL

preg_match函数

//如果在进行正则表达式匹配的时候,没有限制字符串的开始和结束(^ 和 $),则可以存在绕过的问题.
$ip = '1.1.1.1 abcd'; // 可以绕过
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
  die('error');
} else {
  // echo('key...')
}

preg_replace函数

//preg_replace() 的第一个参数如果存在 /e 模式修饰符,则允许代码执行。
//如果没有 /e 修饰符,可以尝试 %00 截断。
<?php
    preg_replace("/test/e",$_GET["nac"],"jutst test");
?>
?nac=phpinfo() #可以被执行

extract()函数

//extract() 函数从数组中把变量导入到当前的符号表中。
//对于数组中的每个元素,键名用于变量名,键值用于变量值。
<?php  
    $auth = '0';  
    // 这里可以覆盖$auth的变量值
    extract($_GET); 
    if($auth == 1){  
        echo "private!";  
    } else{  
        echo "public!";  
    }  
?>

parse_str()函数

//parse_str() 的作用是解析字符串,并注册成变量.
//与 parse_str() 类似的函数还有 mb_parse_str(),parse_str() 将字符串解析成多个变量,
//如果参数 str 是 URL 传递入的查询字符串(query string),则将它解析为变量并设置到当前作用域.

//var.php?var=new  
$var='init';  
parse_str($_SERVER['QUERY_STRING']);
// $var 会变成 new
echo $var;

$$的使用

//如果把变量本身的 key 也当变量,也就是使用了 $$,就可能存在问题。
// http://127.0.0.1/index.php?_CONFIG=123
$_CONFIG['extraSecure'] = true;
foreach(array('_GET','_POST') as $method) {
    foreach($$method as $key=>$value) {
      // $key == _CONFIG
      // $$key == $_CONFIG
      // 这个函数会把 $_CONFIG 变量销毁
      unset($$key);
    }
}
if ($_CONFIG['extraSecure'] == false) {
    echo 'flag {****}';
}

unset()

unset($bar); 用来销毁指定的变量,如果变量 $bar 包含在请求参数中,
可能出现销毁一些变量而实现程序逻辑绕过。

强类型绕过

所谓MD5强类型绕过,其实就是MD5强碰撞产生的异类。

[[安洵杯 2019]easy_web](https://buuoj.cn/challenges#[安洵杯 2019]easy_web)

利用fastcoll生成两个MD5一样但是内容不一样的字符串

PHP常量

设置常量,使用 define() 函数,函数语法如下:

bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

该函数有三个参数:

  • name:必选参数,常量名称,即标志符。
  • value:必选参数,常量的值。
  • case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。
<?php
define("CTF","welcome to learn php",true);
echo ctf;
?>
//welcome to learn php

常量是全局变量,即使定义在函数外也可以直接使用!!!

<?php
define("CTF","welcome to learn php",true);
function Test() {
    echo ctf;
}
Test();    
?>
// welcome to learn php

PHP 字符串变量

<?php
$txt="Hello world!";
echo $txt;
?>

PHP 并置运算符

在 PHP 中,只有一个字符串运算符。并置运算符 (.) 用于把两个字符串值连接起来。

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
//Hello world! What a nice day!

PHP strlen() 函数

<?php
echo strlen("Hello world!");
?>
//12

PHP strpos() 函数

strpos() 函数用于在字符串内查找一个字符或一段指定的文本。

如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。

<?php
echo strpos("Hello world!","world");
?>
//6

PHP 运算符

PHP 算术运算符

在 PHP 中,赋值运算符 = 用于给变量赋值。

在 PHP 中,算术运算符 + 用于把值加在一起。

image-20220802084901187

PHP7+ 版本新增整除运算符 intdiv(),该函数返回值为第一个参数除于第二个参数的值并取整(向下取整)

<?php
var_dump(intdiv(10,3));
?>
//int(3)

PHP 赋值运算符

在 PHP 中,基本的赋值运算符是 =。它意味着左操作数被设置为右侧表达式的值。也就是说,$x = 5 的值是 5。

image-20220802085438070

PHP 递增/递减运算符

image-20220802085502027

PHP 比较运算符

image-20220802085523658

PHP 逻辑运算符

image-20220802085546922

PHP 数组运算符

image-20220802085611265

三元运算符

(expr1) ? (expr2) : (expr3) 

对 expr1 求值为 TRUE 时的值为 expr2,在 expr1 求值为 FALSE 时的值为 expr3。

自 PHP 5.3 起,可以省略三元运算符中间那部分。表达式 expr1 ?: expr3 在 expr1 求值为 TRUE 时返回 expr1,否则返回 expr3。

<?php
$ctf = '网络安全'
$test = isset($ctf) ? $ctf : 'no';
echo $test, PHP_EOL;
?>

注意:PHP_EOL 是一个换行符,兼容更大平台。

在 PHP7+ 版本多了一个 NULL 合并运算符 ??,实例如下:

<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
?>

组合比较符(PHP7+)

PHP7+ 支持组合比较符(combined comparison operator)也称之为太空船操作符,符号为 <=>。组合比较运算符可以轻松实现两个变量的比较,当然不仅限于数值类数据的比较。

$c = $a <=> $b;
//如果 $a > $b, 则 $c 的值为 1。
//如果 $a == $b, 则 $c 的值为 0。
//如果 $a < $b, 则 $c 的值为 -1。

运算符优先级

image-20220802090552689

PHP If...Else 语句

  • if 语句 - 在条件成立时执行代码
  • if...else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
  • if...elseif....else 语句 - 在若干条件之一成立时执行一个代码块
  • switch 语句 - 在若干条件之一成立时执行一个代码块

PHP Switch 语句

<?php
switch (n)
{
case label1:
    如果 n=label1,此处代码将执行;
    break;
case label2:
    如果 n=label2,此处代码将执行;
    break;
default:
    如果 n 既不等于 label1 也不等于 label2,此处代码将执行;
}
?>

PHP 数组

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

array();

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

  • 数值数组 - 带有数字 ID 键的数组
<?php
$ctf = array("web","pwn","reverse","misc","crypto");
echo count($ctf);
//count() 函数用于返回数组的长度(元素的数量):
for($x=0;$x<count($ctf);$x++)
{
    echo $ctf[$x];
    echo "<br>";
}//遍历所有数组
?>
//5web
//pwn
//reverse
//misc
//crypto
  • 关联数组 - 带有指定的键的数组,每个键关联一个值
<?php
$acm = array("algorithm"=>"1","math"=>"2");
echo "acm is".$acm[algorithm]."and".$acm[math];
//acm is1and2
  • 多维数组 - 包含一个或多个数组的数组

遍历关联数组

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

<?php
$acm = array("algorithm"=>"1","math"=>"2");
foreach($acm as $x=>$x_value)
{
    echo "Key=" . $x . ", Value=" . $x_value;
    echo "<br>";
}
?>
//Key=algorithm, Value=1
//Key=math, Value=2

PHP 数组排序

  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列

PHP 超级全局变量

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

  • $GLOBALS
    • $GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
  • $_SERVER
    • $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
    • image-20220802124119246
  • $_REQUEST
    • $_REQUEST 用于收集HTML表单提交的数据。
  • $_POST
    • $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"
  • $_GET
    • $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"
  • $_FILES
    • HTTP 文件上传变量,通过 HTTP POST 方式上传到当前脚本的项目的数组。
  • $_ENV
    • 通过环境方式传递给当前脚本的变量的数组。
    • 这些变量被从 PHP 解析器的运行环境导入到 PHP 的全局命名空间。很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能运行着不同种类的 Shell,所以不可能有一份确定的列表。请查看你的 Shell 文档来获取定义的环境变量列表。
    • 其他环境变量包含了 CGI 变量,而不管 PHP 是以服务器模块还是 CGI 处理器的方式运行。
  • $_COOKIE
    • 通过 HTTP Cookies 方式传递给当前脚本的变量的数组。
  • $_SESSION
    • 当前脚本可用 SESSION 变量的数组。

While 循环、for 循环与foreach

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

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

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

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

    • foreach 循环用于遍历数组。

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

foreach ($array as $value)
{
    要执行代码;
}
<?php
    $x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
    echo $value . PHP_EOL;
}
?>
//Google
//Runoob
//Taobao

PHP 魔术常量

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

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

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

  • __LINE__

    • 文件中的当前行号。
<?php
    echo '这是第 " '  . __LINE__ . ' " 行';
?>
    //这是第 "2"行
  • __FILE__

    • 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
<?php
    echo '该文件位于 " '  . __FILE__ . ' " ';
?>
    //该文件位于 "E:\wamp\www\test\index.php"
  • __DIR__

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

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

<?php
    echo '该文件位于 " '  . __DIR__ . ' " ';
?>
    //该文件位于 "E:\wamp\www\test"
  • __FUNCTION__

    • 本常量返回该函数被定义时的名字
<?php
    function test() {
    echo  '函数名为:' . __FUNCTION__ ;
}
test();
?>
    //函数名为:test
  • __CLASS__

    • 返回该类被定义时的名字
<?php
    class test {
    function _print() {
        echo '类名为:'  . __CLASS__ . "<br>";
        echo  '函数名为:' . __FUNCTION__ ;
    }
}
$t = new test();
$t->_print();
?>
    //类名为:test
    //函数名为:_print
  • __TRAIT__

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

    • 从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

<?php
    class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>
    //Hello World!
  • __METHOD__

    • 返回该方法被定义时的名字(区分大小写)
<?php
    function test() {
    echo  '函数名为:' . __METHOD__ ;
}
test();
?>
    //函数名为:test
  • __NAMESPACE__
    • 当前命名空间的名称(区分大小写)。此常量是在编译时定义的
<?php
    namespace MyProject;
echo '命名空间为:"', __NAMESPACE__, '"'; // 输出 "MyProject"
?>
    //命名空间为:"MyProject"

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇