现在很多框架中调用方法都是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 函数相关推荐

  1. [转载] Python-类变量,成员变量,静态变量,类方法,静态方法,实例方法,普通函数

    参考链接: Python中的类或静态变量 原文地址:https://www.cnblogs.com/20150705-yilushangyouni-Jacksu/p/6238187.html Pyth ...

  2. java main方法调用非静态方法_java中main函数怎么调用外部非static方法

    展开全部 方法可以分为静态方法和实例方法 在main函数里调用非static方法(实例方法),那么32313133353236313431303231363533e78988e69d833133336 ...

  3. php 查询方法all,获取多条:all静态方法

    查询多条数据:all( )方法all方法与前节课学习的get方法都是静态方法,可用模型类直接访问 2. 源码:/** * 查找所有记录 * @access public * @param mixed  ...

  4. python 静态方法 类方法 的作用_Python实例方法、类方法、静态方法的区别与作用详解...

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...

  5. Java:何时使用静态方法

    我想知道何时使用静态方法? 假设我有一个带有几个getter和setter的类,一个或两个方法,并且我希望这些方法只能在该类的实例对象上调用. 这是否意味着我应该使用静态方法? 例如 Obj x = ...

  6. php类实例方法静态方法,PHP类中的静态方法使用实例

    在php中静态方法我们就直接在函数或变量前加一个static就可以了,使用的时候和静态变量差不多,不需要实例化,直接用::调用了,下面我来给大家举几个关于静态方法实例. PHP也不例外!所谓静态方法( ...

  7. python 类可以调用实例变量_python中的实例方法、静态方法、类方法、类变量和实例变量浅析...

    注:使用的是Python2.7. 一.实例方法 实例方法就是类的实例能够使用的方法.如下: class Foo: def __init__(self, name): self.name = name ...

  8. python中类方法与实例方法的区别-python中类方法,实例方法,静态方法的作用和区别...

    Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调用的呢?它们又有何区别和作用呢?且看下文. 首先,这三种方法都定义在类中.下面我先简单说一下怎么定义 ...

  9. python中类方法与实例方法的区别-Python实例方法、类方法、静态方法的区别与作用详解...

    本文实例讲述了Python实例方法.类方法.静态方法的区别与作用.分享给大家供大家参考,具体如下: Python中至少有三种比较常见的方法类型,即实例方法,类方法.静态方法.它们是如何定义的呢?如何调 ...

最新文章

  1. 除了海思麒麟 华为在ARM芯片上还有哪些成就?
  2. java递归深度克隆_递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝。...
  3. 前端页面使用ace插件优化脚本
  4. MongoDB几个完整的库表设计实例
  5. String[]与ListString 相互转换 KKK笔记
  6. Lightbox JS 用法
  7. MOOC_Python语言程序设计_习题_《沉默的羔羊》文本分析
  8. itunes怎么下载,有什么好的教程
  9. 使用Python 批量转移*.tif和*.mov文件
  10. 基于聚集诱导荧光探针细胞膜/细胞膜表面GABA受体荧光探针/上汞离子荧光探针的研究
  11. 服务器主机安装win10系统稳定吗,服务器主机上安装win10
  12. matlab:归一化
  13. npm删除项目所有依赖和清缓存清缓存的办法
  14. 喜马拉雅音频下载器 V1.2 支持专辑批量下载 喜马拉雅mp3下载导出 喜马拉雅下载器...
  15. 软件测试项目管理系统系统描述
  16. Extract High-frequency Data via PC SAS
  17. 【转】Unity3.5是一次较大的更新.它包含的新功能和改进会让你爱不释手.
  18. python正则表达式入门教程括号及字符
  19. CI/CD之搭建私有git仓库gitlab
  20. 【工具】一款在线字数统计工具,统计单个字词组出现的频率

热门文章

  1. Java EE 8的前5个新功能
  2. 功能Java示例 第3部分–不要使用异常来控制流程
  3. mongodb 主键_MongoDB主键是您的朋友
  4. orm jdbc_Spring Data JDBC通用DAO实现–迄今为止最轻量的ORM
  5. jboss 不适用内置日志_适用于孩子,父母和祖父母的JBoss HornetQ –第1章
  6. jboss与nginx_JBoss BRMS与JasperReports进行报告
  7. 在Kotlin中使用libGDX
  8. 策略模式应用场景和uml_策略模式
  9. 通过NFS访问编年引擎
  10. python捕获摄像头帧_Xuggler教程:帧捕获和视频创建