×

php为什么要用反射

php为什么要用反射(为什么使用php)

admin admin 发表于2023-03-27 17:41:10 浏览43 评论0

抢沙发发表评论

本文目录一览:

PHP开发竟然说Google做的GSON太低级了

初学者和刚入道的新人 都喜欢调侃。

找个 会Java和PHP看看,你怎么看?

Java开发web太笨重 PHP适合Web开发,毕竟PHP只是脚本语言,没有Java那么强大,但是在WEB上PHP略胜一筹。

Java现在的方向侧重应该是 算法、爬虫、大型WEB开发

最后我还想说一句:php是世界上最好的语言

php有没有什么函数可以获取一个方法中的参数名和参数类型的

/**

 * 获取一个函数的依赖

 * @param  string|callable $func

 * @param  array  $param 调用方法时所需参数 形参名就是key值

 * @return array  返回方法调用所需依赖

 */

function getFucntionParameter($func,$param=[]) {

    if(!is_array($param)) {

        $param = [$param];

    }

    $ReflectionFunc = new \ReflectionFunction($func);

    $depend = array();

    foreach($ReflectionFunc-getParameters() as $value) {

        if(isset($param[$value-name])) {

            $depend[] = $param[$value-name];

        }elseif($value-isDefaultValueAvailable()){

            $depend[] = $value-getDefaultValue();

        }else{

            $tmp = $value-getClass();

            if(is_null($tmp)) {

                throw new \Exception("Function parameters can not be getClass {$class}");

            }

            $depend[] = $this-get($tmp-getName());

        }

    }

    return $depend;

}

function test($a,$b=20) {

    echo $a,',',$b;

}

$depend = getFucntionParameter('test',['a'=30,'b'=40]);

call_user_func_array('test',$depend); // 30,40

上面的函数是我开发的框架的容器的方法。

php提供了很完整的反射机制。不但可以反射函数,还可以反射方法,反射类构造函数。

php 中如何得到一个对象的类型

得到一个对象的类型,使用gettype()函数:

?php

echo gettype(1); // 输出integer

echo gettype(array()); // 输出array

得到一个对象是哪个类的实例,使用get_class()函数:

?php

$o = new stdClass();

echo get_class(); // 输出stdClass

得到一个类或对象的方法和属性,要使用反射:

?php

class MyClass {

    public $var;

    public function foo() {}

}

$ref = new ReflectionClass('MyClass');

$ref-getProperties(); // 会返回一组对象,用法参考PHP手册

$ref-getMethods(); // 会返回一组对象,用法参考PHP手册

$obj = new MyClass();

$ref = new ReflectionObject($obj);

$ref-getProperties();

$ref-getMethods();

php如何序列化/存储闭包(Closure)

实在需要序列化,可以用反射(Reflection),并直接操作代码文件获得上下文信息:/*** 创建一个反射:*/$reflection = new ReflectionFunction($closure);/*** 参数可以直接得到了:*/$params = $reflection-getParameters();/*** 获得Closure的函数体和use变量,形如: * function($arg1, $arg2, ...) use ($val1, $val2, ...) { * // 要获得这个部分的代码!* }* 办法很多,你可以直接用正则、字符串查找或者Tokenizer,等等等等。 * 比如可以先从reflection里得到函数的开始行和结束行:*/$startLine = $reflection-getStartLine(); $endLine = $reflection-getEndLine(); // 然后用str*这个,str*那个的函数来清理,细节不写了:-php为什么要用反射

php中怎么类外访问私有方法?

你问的是私有方法还是私有属性?

你说的__get __set 是访问和设置属性用的。

__call才是访问方法用的。

但这两种都需要修改原始类,既然有这个权限了,那私有方法有什么必要定义呢?

另外一种获取私有属性或调用私有方法的思路是通过反射:

//MyClass这个类中包含了一个名为myFun的私有方法

class MyClass {

    

    private $tmp = 'hello';

    

    private function myFun()

    {

        echo $this-tmp . ' ' . 'world!';

    }

}

 

//通过类名MyClass进行反射

$ref_class = new ReflectionClass('MyClass');

 

//通过反射类进行实例化

$instance  = $ref_class-newInstance();

 

//通过方法名myFun获取指定方法

$method = $ref_class-getMethod('myFun');

 

//设置可访问性

$method-setAccessible(true);

 

//执行方法

$method-invoke($instance);

//获取属性

$property = $ref_class-getProperty('tmp');

 

//打印属性

var_dump($property);

不知道你提这个单纯是个问题,还是有别的需求,可以多看看php手册学习一下。

php 访问控制

php 反射

PHP中如何实现Hook机制

给你推荐2个方法

类的__call 和__callstatic 。 这2个魔术方法是当调用类的内部方法不存在时执行。__call是实例化类之后调用方法不存在。__callstatic 是调用静态方法不存在,它里面的参数包含了方法名和传递的参数。这样就可以利用这2个方法去实现hook机制。根据方法名和参数去找指定位置的文件和方法执行。use_call_func和use_call_func_array 具体看文档-php为什么要用反射

是反射机制。php已经很早就有反射机制了。利用类的反射机制。去实现hook。其实原理和1方法差不多。但是实现的方法比较高级而已。