关于php中反射类的简单理解:如何拿到一个类的所有方法(public+protected+private)

<?php

class demo
{
    public static $_instance = null;
    private $name;

    public static function getInstance()
    {
        if (!(self::$_instance instanceof self)) {

            self::$_instance = new self;
        }
        return self::$_instance;
    }

    public function __call($name, $argu)
    {
        echo str_repeat($name, $argu[0]);
        /**这据说是腾讯的面试题要求输出类似:
         * $obj->shout(1);//shout
         * $obj->sleep(2);//sleepsleep
         **/

    }

    public function setname($value)
    {
        $this->name = $value;
    }

    public function getname()
    {
        return $this->name;
    }

    protected function hello()
    {
        echo 'hello';
    }

    private function prifunc()
    {
        echo 'pir';
    }

}

$b = demo::getInstance();

// var_dump(get_class_methods($b));// 这样拿不到上面demo类的hello和prifunc方法,只能拿到public的

$b->setname('tb');// 先设置下名字
// echo $b->getname();// 拿到名字,这里举例是为了说明如果反射类,是直接不能拿到上一行的setname的值得,至于如何拿到,目前我不知道。。
$class = new ReflectionClass('demo');//那我们来个反射
// var_dump($class->getMethods());// 获取反射demo对象类的所有方法,包括public private protected
// 下面这个方法可以规范输出下
function getobjallmethods($obj)
{
    $class = new ReflectionClass($obj);
    foreach ($class->getMethods() as $key => $methodType) {
        if ($methodType->isPrivate()) {
            $allmethods[$key]['type'] = 'private';
        } elseif ($methodType->isProtected()) {
            $allmethods[$key]['type'] = 'protected';
        } else {
            $allmethods[$key]['type'] = 'public';
        }
        $allmethods[$key]['name'] = $methodType->name;
        $allmethods[$key]['class'] = $methodType->class;
    }
    return $allmethods;
}

$r = getobjallmethods('demo');
// var_dump($r);

$properities = $class->getProperties();
$classd = $class->newInstance();//实例化
// var_dump($class);
// echo $classd->hello();
$classd->setname('tb2');//如果不在此设置拿不到上一个this的name值得
echo $classd->getname();// 如果没有上门那句tb2,这句会为空
$method = $class->getmethod('getname');
// $method=$class->getmethod('hello');
echo $method->invoke($classd);//参数是类,执行这个method方法,感觉有点倒装的意思,比较官方的说法是:反射类方法对象的调用方式


	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++privatepublicprotected是访问控制修饰符,用于控制成员的访问权限。 private表示私有成员,只能在内部访问,外部无法访问。 public表示公有成员,可以在内部和外部访问。 protected表示保护成员,可以在内部和派生访问,但不能在外部访问。 ### 回答2: c private public protected 是C++的访问修饰符。它们用于控制的成员的访问权限。 c是最严格的访问权限,它表示只有内部的成员函数或友元函数可以访问该成员,外部代码无法直接访问。一般情况下,我们将成员变量都声明为私有的,通过公有的成员函数来访问和修改私有成员。 private表示私有访问权限,它表示只有内部的成员函数或友元函数可以访问该成员。私有成员只能在内部进行访问和修改,外部代码无法直接访问。 public表示公有访问权限,它表示的任何地方都可以访问该成员。公有成员可以在内部和外部进行访问和修改。 protected表示受保护的访问权限,它介于私有和公有之间。受保护成员只能在内部进行访问和修改,同时也可以在派生进行访问。 使用这些访问修饰符可以将的成员进行合理的封装,隐藏具体的实现细节,同时控制对成员的访问和修改权限。这样可以提高代码的可维护性和安全性,同时也方便了的使用和扩展。 ### 回答3: c、privatepublicprotected是面向对象编程的访问修饰符。 c是C语言的访问控制符,用于限定变量或函数的可见性和使用范围。在C语言,c可以取三个值:privateprotectedpublicprivate表示只有在当前文件可见,只能在同一个源文件访问;protected表示只有在当前文件和它的子目录可见,可以被同一的其他成员访问;public表示对所有文件都是可见的,可以被任何文件和访问。 private访问修饰符是面向对象编程的一种封装特性,用于限制的成员只能在的内部访问。private成员变量只能通过公有成员函数进行访问和修改,外部无法直接访问。通过使用private关键字,可以隐藏实现细节,提高代码的安全性和可维护性。 public访问修饰符是面向对象编程的一种封装特性,用于表示成员可以被任何地方访问。public成员变量可以被的对象或者其他的对象直接访问和修改。使用public关键字,可以使的接口更加简洁和易于使用。 protected访问修饰符是面向对象编程的一种封装特性,介于privatepublic之间。protected成员变量和函数可以在的内部访问,也可以在派生访问。使用protected关键字,可以在继承层次控制成员的访问权限,提高代码的封装性和扩展性。 总结而言,c、privatepublicprotected是面向对象编程常用的访问修饰符,用于控制成员的可见性和访问权限。适当使用这些访问修饰符可以提高代码的封装性、安全性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值