php 静态方法 call,php的 __callStatic 函数
现在很多框架中调用方法都是Foo::bar()这种格式的,但是他们真的是静态方法吗?
这种情况在 larave 中尤其常见,但是开发过程中很明显这些有一部分不是静态的,比如你使用一个模型User,那么你每次实例化出来他都是一个全新的,互不影响,这里就用到了一个魔术方法__callStatic
举个栗子:
class Test{
public function __call($name, $arguments)
{
echo 'this is __call'. PHP_EOL;
}
public static function __callStatic($name, $arguments)
{
echo 'this is __callStatic:'. PHP_EOL;
}
}
$test = new Test();
$test->hello();
$test::hi();
//this is __call:hello
//this is __callStatic:hi
当然魔术方法也是很耗性能的一种方式,每次调用的时候后回先扫一遍class没找到方法时才会调用它,而为了代码的整洁和抽象这个方法也能给很大的帮助,在这之间去要有个权衡
下面实现的 log 类,采用的就是这种方法,将方法解耦出来,只要符合规定的接口就能调用
class Test{
//获取 logger 的实体
private static $logger;
public static function getLogger(){
return self::$logger?: self::$logger = self::createLogger();
}
private static function createLogger(){
return new Logger();
}
public static function setLogger(LoggerInterface $logger){
self::$logger = $logger;
}
public function __call($name, $arguments)
{
call_user_func_array([self::getLogger(),$name],$arguments);
}
public static function __callStatic($name, $arguments)
{
forward_static_call_array([self::getLogger(),$name],$arguments);
}
}
interface LoggerInterface{
function info($message,array $content = []);
function alert($messge,array $content = []);
}
class Logger implements LoggerInterface {
function info($message, array $content = [])
{
echo 'this is Log method info' . PHP_EOL;
var_dump($content);
}
function alert($messge, array $content = [])
{
echo 'this is Log method alert: '. $messge . PHP_EOL;
}
}
Test::info('喊个口号:',['好好','学习','天天','向上']);
$test = new Test();
$test->alert('hello');
输出:
this is Log method info
array(4) {
[0]=>
string(6) "好好"
[1]=>
string(6) "学习"
[2]=>
string(6) "天天"
[3]=>
string(6) "向上"
}
this is Log method alert: hello
也许有的小伙伴已经看出来了,没错!这段代码就是仿照(抄)的 EasyWechat的日志部分,代码片段
php 静态方法 call,php的 __callStatic 函数相关推荐
- [转载] Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数
参考链接: Python中的类或静态变量 原文地址:https://www.cnblogs.com/20150705-yilushangyouni-Jacksu/p/6238187.html Pyth ...
- java main方法调用非静态方法_java中main函数怎么调用外部非static方法
展开全部 方法可以分为静态方法和实例方法 在main函数里调用非static方法(实例方法),那么32313133353236313431303231363533e78988e69d833133336 ...
- php 查询方法all,获取多条:all静态方法
查询多条数据:all( )方法all方法与前节课学习的get方法都是静态方法,可用模型类直接访问 2. 源码:/** * 查找所有记录 * @access public * @param mixed ...
- python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...
本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...
- Java:何时使用静态方法
我想知道何时使用静态方法? 假设我有一个带有几个getter和setter的类,一个或两个方法,并且我希望这些方法只能在该类的实例对象上调用. 这是否意味着我应该使用静态方法? 例如 Obj x = ...
- php类实例方法静态方法,PHP类中的静态方法使用实例
在php中静态方法我们就直接在函数或变量前加一个static就可以了,使用的时候和静态变量差不多,不需要实例化,直接用::调用了,下面我来给大家举几个关于静态方法实例. PHP也不例外!所谓静态方法( ...
- python 类可以调用实例变量_python中的实例方法、静态方法、类方法、类变量和实例变量浅析...
注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: class Foo: def __init__(self, name): self.name = name ...
- python中类方法与实例方法的区别-python中类方法,实例方法,静态方法的作用和区别...
Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义 ...
- python中类方法与实例方法的区别-Python实例方法、类方法、静态方法的区别与作用详解...
本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...
最新文章
- 除了海思麒麟 华为在ARM芯片上还有哪些成就?
- java递归深度克隆_递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。...
- 前端页面使用ace插件优化脚本
- MongoDB几个完整的库表设计实例
- String[]与ListString 相互转换 KKK笔记
- Lightbox JS 用法
- MOOC_Python语言程序设计_习题_《沉默的羔羊》文本分析
- itunes怎么下载,有什么好的教程
- 使用Python 批量转移*.tif和*.mov文件
- 基于聚集诱导荧光探针细胞膜/细胞膜表面GABA受体荧光探针/上汞离子荧光探针的研究
- 服务器主机安装win10系统稳定吗,服务器主机上安装win10
- matlab:归一化
- npm删除项目所有依赖和清缓存清缓存的办法
- 喜马拉雅音频下载器 V1.2 支持专辑批量下载 喜马拉雅mp3下载导出 喜马拉雅下载器...
- 软件测试项目管理系统系统描述
- Extract High-frequency Data via PC SAS
- 【转】Unity3.5是一次较大的更新.它包含的新功能和改进会让你爱不释手.
- python正则表达式入门教程括号及字符
- CI/CD之搭建私有git仓库gitlab
- 【工具】一款在线字数统计工具,统计单个字词组出现的频率
热门文章
- Java EE 8的前5个新功能
- 功能Java示例 第3部分–不要使用异常来控制流程
- mongodb 主键_MongoDB主键是您的朋友
- orm jdbc_Spring Data JDBC通用DAO实现–迄今为止最轻量的ORM
- jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
- jboss与nginx_JBoss BRMS与JasperReports进行报告
- 在Kotlin中使用libGDX
- 策略模式应用场景和uml_策略模式
- 通过NFS访问编年引擎
- python捕获摄像头帧_Xuggler教程:帧捕获和视频创建