当前位置: 首页 > news >正文

网站页脚模板17一起做网站app

网站页脚模板,17一起做网站app,中山建站,wordpress 评论 关闭在使用框架的时候我们经常会看到如下代码 类的方法不会显示地声明在代码里面,而是通过扩展的形式后续加进去,这么做的好处是可以降低代码的耦合度、保证源码的完整性、团队开发的时候可以分别写自己的服务去扩展类,减少代码冲突等等。我自己…

在使用框架的时候我们经常会看到如下代码
在这里插入图片描述
类的方法不会显示地声明在代码里面,而是通过扩展的形式后续加进去,这么做的好处是可以降低代码的耦合度、保证源码的完整性、团队开发的时候可以分别写自己的服务去扩展类,减少代码冲突等等。我自己看着框架源码实现了这个功能。
以下是结果:
在这里插入图片描述
base代码
在这里插入图片描述
index.php

<?php
require_once "macroable.php";
require_once "base.php";
$a = new phpmacro\Base();
$a::macro("first",function (){$this->query .="I had be macro";return $this->query;
});
$a->first();
var_dump($a->query);

base.php

<?php
namespace phpmacro;/*** @method first()*/
class Base 
{use Macroable;public $query = "init-query";function __construct(){// code...echo "base-contruct";}
}

Macroable.php

<?phpnamespace phpmacro;use BadMethodCallException;
use Closure;
use ReflectionClass;
use ReflectionMethod;trait Macroable
{/*** The registered string macros.** @var array*/protected static $macros = [];/*** Register a custom macro.** @param  string  $name* @param  object|callable  $macro* @return void*/public static function macro($name, $macro){static::$macros[$name] = $macro;}/*** Mix another object into the class.** @param  object  $mixin* @param  bool  $replace* @return void** @throws \ReflectionException*/public static function mixin($mixin, $replace = true){$methods = (new ReflectionClass($mixin))->getMethods(ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED);foreach ($methods as $method) {if ($replace || ! static::hasMacro($method->name)) {static::macro($method->name, $method->invoke($mixin));}}}/*** Checks if macro is registered.** @param  string  $name* @return bool*/public static function hasMacro($name){return isset(static::$macros[$name]);}/*** Flush the existing macros.** @return void*/public static function flushMacros(){static::$macros = [];}/*** Dynamically handle calls to the class.** @param  string  $method* @param  array  $parameters* @return mixed** @throws \BadMethodCallException*/public static function __callStatic($method, $parameters){if (! static::hasMacro($method)) {throw new BadMethodCallException(sprintf('Method %s::%s does not exist.', static::class, $method));}$macro = static::$macros[$method];if ($macro instanceof Closure) {$macro = $macro->bindTo(null, static::class);}return $macro(...$parameters);}/*** Dynamically handle calls to the class.** @param  string  $method* @param  array  $parameters* @return mixed** @throws \BadMethodCallException*/public function __call($method, $parameters){if (! static::hasMacro($method)) {throw new BadMethodCallException(sprintf('Method %s::%s does not exist.', static::class, $method));}$macro = static::$macros[$method];if ($macro instanceof Closure) {$macro = $macro->bindTo($this, static::class);}return $macro(...$parameters);}
}

其实原理就是利用了静态调用的魔术方法与匿名函数的bindTo方法实现了类与方法解藕的效果
以下是test.php,可以清晰的看明白匿名函数bindTo跟bind是怎么用的

<?php
/** * 复制一个闭包,绑定指定的$this对象和类作用域。 * * @author 疯狂老司机 */
class Animal {private static $cat = "cat";private $dog = "dog";public $pig = "pig";
}/* * 获取Animal类静态私有成员属性*/
$cat = static function() {return Animal::$cat;
};/* * 获取Animal实例私有成员属性*/
$dog = function() {return $this->dog;
};/* * 获取Animal实例公有成员属性*/
$pig = function() {return $this->pig;
};$bindCat = Closure::bind($cat, null, new Animal());// 给闭包绑定了Animal实例的作用域,但未给闭包绑定$this对象
$bindDog = Closure::bind($dog, new Animal(), 'Animal');// 给闭包绑定了Animal类的作用域,同时将Animal实例对象作为$this对象绑定给闭包
$bindPig = Closure::bind($pig, new Animal());// 将Animal实例对象作为$this对象绑定给闭包,保留闭包原有作用域
$animal = new Animal();
$pigBindto = $pig->bindTo($animal);
echo $pigBindto()."\r\n";
echo $bindCat()."\r\n";// 根据绑定规则,允许闭包通过作用域限定操作符获取Animal类静态私有成员属性
echo $bindDog()."\r\n";// 根据绑定规则,允许闭包通过绑定的$this对象(Animal实例对象)获取Animal实例私有成员属性
echo $bindPig()."\r\n";// 根据绑定规则,允许闭包通过绑定的$this对象获取Animal实例公有成员属性

输出结果
在这里插入图片描述

http://www.yayakq.cn/news/796144/

相关文章:

  • 河源城乡规划建设局网站个人做网站公司
  • 如何网站后台清理缓存赣州人才网官网登录
  • 网站网站开发教程wordpress 插件 加速
  • 网站文章页的排名怎么做上海网站建设运营站霸网络
  • 厦门易尔通做网站怎么样做个网站得投入多少
  • 企业网站的基本形式不包括杭州网站建设ttmwl
  • 定制制作网站开发有没有兼职做设计的网站
  • 宁波 手机网站建设网站建设的工作视频人的吗
  • 东莞网站建设 塑胶五金计算机网络毕业设计论文
  • 问答网站开发中信建设有限责任公司资质
  • 油漆网站设计二手建筑铝模板哪里有卖
  • 如何给网站数据备份seo网站关键词
  • 深圳 赢客创想网络技术股份有限公司 网站建设广州建设工程安全质量监督网站
  • 搜索类的网站优点管理系统中的计算机应用自考
  • 网站建设都有什么工作要做wordpress 电商模板
  • 网站怎么做查询功能网站建设的基本流程包括哪些
  • 宜宾 网站建设建设银行网站怎么登陆密码错误
  • 游戏平台代理百度seo优化收费标准
  • 中小企业网站积木式搭建网站建设成本分析
  • 多少钱能运营一个网站node.js网站开发
  • 宿州市建设工程质量监督站网站北京网站备案在哪
  • nas有域名了怎么做网站网站开发的硬件设备
  • 宁夏免费建个人网站申请域名是什么意思
  • 河北华宇建设集团有限公司网站重庆飘逸科技有限公司
  • 建设商务网站的经济可行性分析做企业官网用什么语言
  • 网站信息发布系统东兴移动网站建设
  • 做网站怎么添加背景图片wordpress 编辑 所见即所得插件
  • 万网网站备案产品验证未找到该域名授权信息网站设计大全推荐
  • 从客户—管理者为某一公司做一份电子商务网站管理与维护的方案网站免费正能量安全
  • 四川自助seo建站做dm页网站