php的原生类

前言:累麻了!

反射类

反射类 ReflectionClass:ReflectionClass 类报告了一个类的有关信息。正如其名用于映射反射一个类的类!
new ReflectionClass('MyClass') 会创建一个 ReflectionClass 实例,代表 MyClass 这个类。

基础用法:

1. 对象字符串的表示形式

ReflectionClass::__toString 返回 ReflectionClass对象字符串的表示形式

php 复制代码
<?php
class MyClass {
    public $name='rufeii';
    public function printName(){
        echo $this->name;
    }
}
$class = new ReflectionClass('MyClass');
echo $class;  //这里触发了__toString魔术方法
?>

展示了类的 定义位置、属性、方法 等信息。

Class [ class 类名 ] {

文件位置 @@ 路径 行号范围

  • 常量 [数量] { 具体常量... }

  • 静态属性 [数量] { 具体静态属性... }

  • 静态方法 [数量] { 具体静态方法... }

  • 普通属性 [数量] { 具体属性... }

  • 方法 [数量] { 具体方法... }

}

2.获取类的名称

(new ReflectionClass("class?"))->getName() // 获取类名称

php 复制代码
<?php
class MyClass {
    public $name='rufeii';
    public function printName(){
        echo $this->name;
    }
}
$class = new ReflectionClass('MyClass');
echo $class->getName(); // MyClass
?>
3.获取属性名称和属性值
php 复制代码
<?php
class MyClass {
    public $name='rufeii';
    public $age=19;
    public function printName(){
        echo $this->name;
    }
    public function printAge(){
        echo $this->age;
    }
}
$class = new ReflectionClass('MyClass');
$properties = $class->getProperties();

foreach ($properties as $property) {
    $name = $property->getName();
    $value = $property->getValue(new MyClass());
    echo "$name: $value\n";
}
?>

获取值用到了ReflectionProperty类的方法getValue(),是因为ReflectionClass::getProperty #返回值是一个数组,是一个类所以还可以用来调用方法。

4.读取类的方法和参数
php 复制代码
<?php
class MyClass {
    public $name='rufeii';
    public $age=19;
    public function printName($parameter1){
        echo $this->name;
        echo $parameter1;
    }
    public function printAge($parameter2){
        echo $this->age;
        echo $parameter2;
    }
}
$class = new ReflectionClass('MyClass');
$a=$class->getMethods();
foreach($a as $method)
{
        echo $method->getName()."(";
        $params=$method->getParameters();
        foreach($params as $param)
        {
            echo $param->getName().")<br>";
        }
}
?>

操作文件的类

目录遍历类

  1. DirectoryIterator 利用版本PHP5, PHP7, PHP8

  2. FilesystemIterator 利用版本,PHP 5且>= 5.3.0, PHP 7, PHP 8

  3. GlobIterator PHP 5 且>= 5.3.0, PHP 7, PHP 8

1. DirectoryIterator

怎么去遍历文件目录,使用里面的__tostring()魔术方法

php 复制代码
<?php
$dir=new DirectoryIterator("../");
foreach ($dir as $fileinfo) {
    echo $fileinfo."<br>";
}
?>
输出的第一个文件是.
第二个文件..
所以如果不用循环的话出来的就是.

当然也可以用glob://协议去作为一个伪文件系统访问接口去绕过open_basedir这个安全配置项(rce里面有个需要绕过open_basedir的)

php 复制代码
<?php
$dir=new DirectoryIterator("glob:///*");
foreach($dir as $a){
    echo $a->__toString().' ';
}
?>
2.FilesystemIterator
php 复制代码
<?php
$dir=new FilesystemIterator("../");
foreach ($dir as $fileinfo) {
    echo $fileinfo."<br>";
}
?>

与DirectoryIterator不同的是没有了前面两个没有的东西了(.和..),那么如果我们不用循环的话,直接输出的话,有可能也是可以获取敏感文件的!比如web99--web114(php特性篇)-CSDN博客 这里的web109!

那么这里也是可以用glob://协议的

3.GlobIterator

GlobIterator 继承于DirectoryIterator而且自带了glob,那么就可以直接使用linux的通配符

php 复制代码
<?php

$dir=new GlobIterator("../*");
foreach($dir as $a){
    echo $a->__toString().' ';
}
?>

那么这里同样是没有.和..的,所以也可以利用直接输出$dir,说不定有用!

文件读取的类

SplFileObject
php 复制代码
<?php
$content=new SplFileObject('/flag');
foreach($content as $content){
    echo $content." ";
}
?>

总结

简单的水了一下,后续有机会在慢慢补吧!

相关推荐
码农水水1 小时前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
do better myself3 小时前
php 使用IP2Location限制指定的国家访问实现
开发语言·php
用户14644605033795 小时前
PHP 多维数组处理利器:array_column() 用法详解
php·thinkphp
郑州光合科技余经理7 小时前
架构解析:同城本地生活服务o2o平台海外版
大数据·开发语言·前端·人工智能·架构·php·生活
智能修复7 小时前
502 Bad Gateway:互联网世界的“断桥”时刻
开发语言·php
源码师傅8 小时前
AI短剧创作系统源码 开发语言:PHP+MySQL 基于uniapp 无限SAAS多开源码
人工智能·php·短剧小程序开发·ai短剧创作系统源码·ai短剧创作系统·短剧原创制作软件
BingoGo8 小时前
PHP 8.5 #[\NoDiscard] 揪出"忽略返回值"的 Bug
后端·php
星辰烈龙1 天前
黑马程序员JavaSE基础加强d5
服务器·网络·php
No0d1es1 天前
2025年12月 GESP CCF编程能力等级认证Python三级真题
开发语言·php
哥只是传说中的小白1 天前
Nano Banana Pro高并发接入Grsai Api实战!0.09/张无限批量生成(附接入实战+开源工具)
开发语言·数据库·ai作画·开源·aigc·php·api