单例模式
------是为了解决(如何在整个项目中创建一个唯一的对象实例)
- 拥有一个构造函数,并且为private
- 拥有一个静态成员变量用来保持类的实例
- 拥有一个访问这个实例的静态方法
- 代码如下就是一个简单的单例模式
<?php
class Single {
static public $instance= null;
private function __construct()
{
}
/**
* @return Single|null
*/
public static function getInstance(){
if(!self::$instance){
self::$instance= new self();
}
return self::$instance;
}
public function getAbc(){
return "a bc";
}
}
在控制器中调用 采用
<?php
namespace app\index\controller;
use Single;//单例模式
class Index
{
public function getSingle()
{
$abc = Single::getInstance()->getAbc();
var_dump($abc);
die;
}
}
注册树模式
--------主要是解决(常用的基础类库挂在到注册树上 使用中不需要频繁的实例化)
- 注册树模式是将对象实例注册到一棵全局的对象树上
- 需要的时候从对象树上摘下来使用
- 代码如下就是一个简单的注册树模式
<?php
class Register
{
/**
* 注册树池子
* @var null
*/
protected static $objects = null;
/**
* 将对象挂在树上
* @param $key
* @param $object
*/
public static function set($key, $object)
{
self::$objects[$key] = $object;
}
/**
* 从树上获取对象 如果没有则注册一个
* @param $key
* @return mixed
*/
public static function get($key)
{
if (!isset(self::$objects[$key])) {
self::$objects[$key] = new $key;
}
return self::$objects[$key];
}
/**
* 注销
* @param $key
*/
public static function _unset($key)
{
unset(self::$objects[$key]);
}
}
在业务层的使用如下
创建个名字为A的类
<?php
class A
{
public function abc()
{
return "abcd";
}
}
在控制器中使用
public function register(){
$a=new \A();
\Register::set("ab",$a);//挂载到注册树中
$abc=\Register::get('ab')->abc();//取出来并且调用A类中的acb 方法
dump($abc);die;//打印
}
依赖注入
- 依赖注入主要用来减少代码间的耦合
- 有效分离对象和它所需要的的外部资源
项目中代码体现为
新建个Person类如下
<?php
namespace di;
class Person
{
/**
*依赖: Person 依赖 Car
*注入 car类 注入到 Person
* @param $obj
* @return mixed
*/
public function buy($obj){
return $obj->pay();
}
}
新建个Car类如下
<?php
namespace di;
class Car
{
public function pay(){
return 123;
}
}
在控制器中使用 如下
public function personBuy(){
$as= new Person();
$aa=new Car();
return $as->buy($aa);
}
反射机制
- 代码表示如下
新建A类
<?php
class A
{
public $ac=1;
private $bc=2;
public static $instance=null;
/**
* @param $a
* @param $b
* @return string
*/
public function abc($a,$b)
{
return "abcd";
}
/**
* @param int $type
* @return string
*/
public function mf($type=1){
return "tyepe:".$type;
}
}
在控制器中调用
public function rel(){
$obj=new \A();
$obj2=new \ReflectionClass($obj);
//$instance=$obj2->newInstance();//相当于这个类
$methods=$obj2->getMethods();
foreach ($methods as $method){
// dump($method->getDocComment());//获取方法的注释
}
dump($obj2->getProperties());//获取属性
}