• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > php实现后期静态绑定

php实现后期静态绑定

作者:匿名 字体:[增加 减小] 来源:互联网 时间:2018-12-05

匿名通过本文主要向大家介绍了php,绑定,静态等相关知识,希望本文的分享对您有所帮助

后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。

所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及forward_static_call() 。可用 get_called_class()函数来得到被调用的方法所在的类名,static:: 则指出了其范围。

self:: 的限制

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

例:

class  A  {
    public static function  who () {
        echo  __CLASS__ ;
    }    public static function  test () {
         self :: who ();
    }
}class  B  extends  A  {
    public static function  who () {
        echo  __CLASS__ ;
    }
}

B :: test ();

结果:

A

static(后期静态绑定)

后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

例:

<?phpclass A {
    public static function who() {
        echo __CLASS__;
    }    public static function test() {
        static::who(); // 后期静态绑定从这里开始
    }
}class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();?>

结果:

B

static 和 $this 的区别

在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 只能用static:: 调用静态属性。

例:调用私有方法

<?phpclass A {
    private function foo() {
        echo "success!\n";
    }    public function test() {
        $this->foo();        static::foo();
    }
}class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */}class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}$b = new B();$b->test();$c = new C();$c->test();   //fails

结果:

success!
success!
success!
Fatal error:  Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

转发和非转发调用

后期静态绑定的解析会一直到取得一个完全解析了的静态调用信息为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

例:

class A {
    public static function foo() {
        static::who();
    }    public static function who() {
        echo __CLASS__."\n";
    }
}class B extends A {
    public static function test() {
        A::foo();        parent::foo();        self::foo();
    }    public static function who() {
        echo __CLASS__."\n";
    }
}class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();

结果:

ACC

相关推荐:

php后期静态绑定实例详解

php静态绑定详细讲述

php后静态绑定的定义和使用方法实例详解

以上就是php实现后期静态绑定的详细内容,更多请关注微课江湖其它相关文章!

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 浅析mysql 语句的调度优先级及改变
  • 基于mysql多实例安装的深入解析
  • mysql_fetch_row()与mysql_fetch_array()的使用介绍
  • 基于Php mysql存储过程的详解
  • PHP之Mysql常用SQL语句示例的深入分析
  • PHP mysqli 增强 批量执行sql 语句的实现代码
  • PHP mysqli扩展库 预处理技术的使用分析
  • Mysql中文乱码以及导出为sql语句和Excel问题解决方法[图文]
  • 修改mysql密码与忘记mysql密码的处理方法
  • 多次执行mysql_fetch_array()的指针归位问题探讨

相关文章

  • 2018-12-05mysql下普通用户备份数据库时无lock tables权限的解决方法
  • 2017-05-11Centos中彻底删除Mysql(rpm、yum安装的情况)
  • 2018-12-05详解Oracle常用函数Trunc
  • 2018-12-05一个DDL导致MySQL主从停止问题及解决
  • 2018-12-05MySql数据库分区和分表方法的详解及分区和分表介绍
  • 2018-12-05关于php flock 使用实例的讲解
  • 2018-12-05分享mysql利用init-connect增加访问审计功能的实例
  • 2018-12-05 NoSQLUnit 0.5.0 发布,NoSQL 单元测试
  • 2017-05-11mysql中优化和修复数据库工具mysqlcheck详细介绍
  • 2018-12-05如何从官网下载最新MySQL安装包?

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 深入Mysql,SqlServer,Oracle主键自动增长的设置详解
    • Sql Server 2005 默认端口修改方法
    • SQL Server 7.0 入门(五)
    • standby redo log的作用
    • InnoDB monitor被莫名开启的问题分析
    • MySQL中如何用WHERE子句联结多个表
    • Oracle如何直接运行OS命令(下)第1/2页
    • MySQL之——主从复制的一些参数配置
    • 此数据库没有有效所有者,因此无法安装数据库关系图支持对象
    • Mysql中的慢查询操作

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有