最新公告
  • 欢迎您光临蛙蛙应用,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 爱搬网_PHP获取类私有属性的3种方法

     

    这篇文章主要先容了PHP获取类私有属性的3种方式,辅助人人更好的明白和使用php,感兴趣的同伙可以了解下

    今天在推上看到一条获取PHP类私有属性的推文,感受很有意思:

    顺着推文遐想,另有其他方式吗?经由自己的测试及网上谜底,总结出三种方式:

    1. 反射

    反射可以获取类的详细信息,要获取私有属性的值,只需将对应属性的ReflectionProperty实例设置为可接见再取值即可。示例代码如下:

    namespace tlanyan;

    class Foo {
     private $bar = “Foo bar!”;
    }

    // 获取反射类及反射属性
    $class = new \ReflectionClass(Foo::class);
    $property = $class->getProperty(“bar”);
    // 设置属性可接见
    $property->setAccessible(true);

    $foo = new Foo;
    // 获取工具属性值
    // 注重:只能通过 ReflectionProperty 实例的 getValue 方式接见
    // 不能这样直接接见: $foo->bar;
    echo $property->getValue($foo), PHP_EOL:
    // 输出: Foo bar!

    本人之前写过“PHP回首之反射”一文,对照详细的先容了反射及用法,有兴趣的阅读参考。

    2. 转换成数组

    这种方式用将工具强制转换成数组,再通过键获取其值。示例代码如下:

    class Foo {
     private $bar = “Foo bar!”;
    }

    $foo = new Foo;
    // 强制转型
    $attrs = (array)$foo;
    // 拼接key,注重 “\0” 不能改成单引号!
    $key = “\0” . Foo::class . “\0” . “bar”;
    echo $attrs[$key], PHP_EOL;
    // 输出: Foo bar!

    上述代码中key的拼接方式对照诡异,key规则如下:

    public属性, key是 属性名;

    protected属性,key是 \0*\0属性名;

    private属性, key是 \0类名\0属性名。

    注重 \0 是一个字符(不是两个),对应的ASCII码是数字0。编程时要用双引号将其引起来。不能使用单引号,否则转义失效,那就是两个字符。若是你有C语言基础,应该知道 \0 就是字符串的结束符。这个符号直接输出不会显示,但可以通过strlen或者ord让其现形:

    foreach ($attrs as $key => $value) {
     echo “key:$key”, “, key length:”, strlen($key), “, ascii: “;
     for ($i = 0; $i < strlen($key); ++ $i) {
     echo ord($key[$i]), ” “;
     }
     echo PHP_EOL;
    }
    // 输出
    // key:Foobar, key length:8, ascii: 0 70 111 111 0 98 97 114
    // Foobar 有6个字符,加上两个不显示字符,以是长度是8

    还需要注重拼接private属性时类名应该是 “完全限制类名” ,建议通过Foo::class的方式获取。

    与强制转换成数组类似的另一种方式是serialize,然则serialize对照慢,而且序列化后的字符串更难识别结构和处置,不建议使用。

    3. 闭包

    文章开头的推特截图已经展示了闭包的用法,其中call方式在PHP7中引入,另一个是PHP5.4引入的bindTo。call和bindTo的用法示例如下:

    namespace tlanyan;

    class Foo {
     private $bar = “Foo bar!”;
    }

    $foo = new Foo;
    // 闭包(匿名函数)是PHP5.3引入的功效
    $closure = function() { return $this->bar; };
    // PHP5.4起支持bindTo方式
    $method = $closure->bindTo($foo, Foo::class);
    echo $method(), PHP_EOL;

    // PHP7引入call方式,可绑定this直接执行
    echo $closure->call($foo), PHP_EOL;

    bindTo方式的第二个参数注重传入工具的 “完全限制类名”,指示函数应该放置在该类的作用域下,从而可以接见私有属性。

    总结

    性能: 数组 > 反射 > 闭包

    易用性: 闭包 > 数组 > 反射

    推荐: 闭包 > 反射 > 数组

    以上就是PHP获取类私有属性的3种方式的详细内容,更多关于PHP获取类私有属性的资料请关注剧本之家其它相关文章!

    泉源:剧本之家

    链接:https://www.jb51.net/article/195305.htm

    申请创业报道,分享创业好点子。,配合探讨创业新机遇!

    爱搬网
    蛙蛙应用 » 爱搬网_PHP获取类私有属性的3种方法
    • 591会员总数(位)
    • 868资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 383稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情