<?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();