本文目录一览:
- 1、PHP开发竟然说Google做的GSON太低级了
- 2、php有没有什么函数可以获取一个方法中的参数名和参数类型的
- 3、php 中如何得到一个对象的类型
- 4、php如何序列化/存储闭包(Closure)
- 5、php中怎么类外访问私有方法?
- 6、PHP中如何实现Hook机制
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方法差不多。但是实现的方法比较高级而已。