<?php
class person{
public $name;
public $age;
public $sex;
public function say()
{
echo $this->name.$this->age;
}
public function set($name,$value)
{
$this->$name = $value;
}
public function getSex()
{
echo $this->sex;
}
}
$stu = new person();
$stu->name = 'test';
$stu->age = 28;
$stu->sex = 'girl';
$stu->say();
var_dump($stu);
php反射类
//获得对象的属性列表
$reflect = new ReflectionObject($stu);
$props = $reflect->getProperties();
foreach ($props as $key_p => $value_p) {
var_dump($value_p->getName());
}
//获得对象的方法列表
$method = $reflect->getMethods();
foreach ($method as $key_m => $value_m) {
var_dump($value_m->getName());
}
laravel依赖注入使用的反射
class User
{
protected $log;
public function __construct(FileLog $log)
{
$this->log = $log;
}
public function login()
{
// 登录成功,记录登录日志
echo 'login success...';
$this->log->write();
}
}
function make($concrete){
$reflector = new ReflectionClass($concrete);
$constructor = $reflector->getConstructor();
// 为什么这样写的? 主要是递归。比如创建FileLog不需要传入参数。
if(is_null($constructor)) {
return $reflector->newInstance();
}else {
// 构造函数依赖的参数
$dependencies = $constructor->getParameters();
// 根据参数返回实例,如FileLog
$instances = getDependencies($dependencies);
return $reflector->newInstanceArgs($instances);
}
}
function getDependencies($paramters) {
$dependencies = [];
foreach ($paramters as $paramter) {
$dependencies[] = make($paramter->getClass()->name);
}
return $dependencies;
}
$user = make('User');
$user->login();