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>
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;
?>
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类型比较
- 松散比较:使用两个等号
==
比较,只比较值,不比较类型。 - 严格比较:用三个等号
===
比较,除了比较值,也比较类型。
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";
}
?>
字符要用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 中,算术运算符 + 用于把值加在一起。
PHP7+ 版本新增整除运算符 intdiv(),该函数返回值为第一个参数除于第二个参数的值并取整(向下取整)
<?php
var_dump(intdiv(10,3));
?>
//int(3)
PHP 赋值运算符
在 PHP 中,基本的赋值运算符是 =。它意味着左操作数被设置为右侧表达式的值。也就是说,$x = 5 的值是 5。
PHP 递增/递减运算符
PHP 比较运算符
PHP 逻辑运算符
PHP 数组运算符
三元运算符
(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。
运算符优先级
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 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
$_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"