首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PHP后期静态绑定

在看到后期静态绑定这个词的时候,感觉挺官方的,不太好理解,这里为我权当做个笔记了 即在类的继承过程中,使用的类不再是继承的类.而是调用的类,通过static关键字来实现,"static"不在被解析定义为当前方法所在的类...,而是在实际运行时计算得到的,即为运行时最初调用的类,虽然称为后期静态绑定 但是并不局限于静态方法的调用 class A { public static function call()...{ echo "class A"; } public static function test() { self::call(); static...::call(); } } class B extends A { public static function call() { echo "class B";...test()函数的类来决定"static::"的值,因此static的值只有在调用时才能确定下来.这里需要注意的是,static并不限于静态方法的调用,它同样适用于非静态方法,调用的方式如上一致,是在调用时动态确定的

92810

PHP后期静态绑定实例浅析

本文实例讲述了PHP后期静态绑定。...分享给大家供大家参考,具体如下: 从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类 该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static...static function who() { echo __CLASS__; } } B::test(); //A 打印结果: A 后期静态绑定的用法 后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制...) { static::who(); // 后期静态绑定从这里开始 } } class B extends A { public static function who() {...打印结果是: B 后期静态绑定的处理方式解决了以往完全没有解决的静态调用,另外一方面,如果静态调用使用parent::或者self::将转发调用信息 <?

69331
您找到你想要的搜索结果了吗?
是的
没有找到

后期静态绑定在PHP中的使用

后期静态绑定在PHP中的使用 什么叫后期静态绑定呢?其实我们在之前的文章PHP中的static中已经说过这个东西了。今天我们还是再次深入的理解一下这个概念。...首先,我们通过一段代码来引入后期静态绑定这一概念: class A { public static function who() { echo __CLASS__, PHP_EOL...别激动,这是普通的静态绑定。self关键字调用的内容取决于它定义时所在的类。也就是说不管怎么继承,用哪个子类来调用test()方法,self关键字都会调用的是A类的who()方法。 而后期静态绑定呢?...普通的静态调用可不是这样,但是现实中我们又有这样的需求,就像实例化对象的调用方式一样来调用静态属性方法,这时,我们就可以使用static关键字来实现后期静态绑定。...“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。

69310

PHP后期静态绑定之self::限制实例分析

本文实例讲述了PHP后期静态绑定之self::限制。分享给大家供大家参考,具体如下: 在此我想讲一讲后期静态绑,我想讲self::与static进行比较说明。...官方文档上是这样定义的: “后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定”,因为它可以用于(但不限于)静态方法的调用。...这里用的是:static::,以前很少在PHP中见过这种写法吧?...,一般self使用来指向类中的静态变量(不可以指向非静态变量),但是可以访问类中其他静态方法与非静态方法。...但也可以访问父类的其他方法(不可以访问其他静态与非静态变量)。 static:: 通常用于后期静态绑定中。

64531

PHP类与对象后期静态绑定操作实例详解

本文实例讲述了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下: 做项目是后期静态绑定非常有用。比如service层单例模式,使用后期静态绑定就非常好实现。...自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。...可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。 该功能从语言内部角度考虑被命名为“后期静态绑定”。...“后期绑定”的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。 <?...) { static::who(); // 后期静态绑定从这里开始 } } class B extends A { public static function who() {

41051

Static 静态+this

(一):静态   1.Static修饰的都是静态的,都是类相关的,不需要new对象,直接采用类名.的方式访问   2.当一个属性是类级别的,所有对象的这个属性都是一样的,直接定义为静态 类=属性+方法...  属性描述的是:状态   方法描述的是:行为动作 (二):什么时候定义为静态方法,什么时候定义为实例方法?  ...当一个方法不用改变的时候 ,定义为静态方法 (三):静态代码块和实例语句块   静态代码块在类加载的时候执行。...需要先new对象  this this是一个关键字,是一个引用,保存内存地址指向自身 this可以使用在实例方法中,也可以使用在构造方法中 this处在在实例方法中,代表的是当前对象 this不能在静态方法中使用...根据传进去参数的不同,分别调用不同的构造方法  this为什么不能再静态方法中使用

8710

Java(static静态

static(静态) 当创建一个类有以下代码: static String room; 一旦使用了关键字static,那么这样的内容不再属于对象自己,而属于所在的类; 当所在类被new出来之后,它不再需要用对象去...如果没有static关键字,那么必须创建对象,然后通过对象才能使用; 如果有了static关键字,那么不需要创建对象,直接通过类名称来使用。...内存图如下: 静态代码块: public class Test{ public static void main(String[] arge){ Student stu=new Student...(); } } public class Student{ static{ //静态代码块内容 System.out.println("静态代码块输出"); } } 以上代码输出结果...注意事项: 1、静态不能直接访问非静态 原因:因为在内存中是“先”有的静态内容,“后”有的非静态内容 2、静态方法中不能使用this 原因:this当前对象,通过谁调用方法,谁就是当前的对象

46810

static声明静态外部类_static静态变量的理解

这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。   ...在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。...如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的...三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。...但是,如果成员开发人员创建的时静态内部类,那么这就又另当别论了。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。

64810

动态绑定静态绑定

Java的动态/静态绑定是比较偏门的知识点之一,可能你不经常听到,但是关于他们的应用,有Java开发经验的朋友应该看一眼就明白。 静态绑定 先说静态绑定。...所谓静态绑定,既是说方法的实现在编译期就已经确定了的。这么一说,马上能想到的就是静态方法。 没错,只有静态方法是属于静态绑定,或者称之为前期绑定。而对象方法则是在运行期绑定的。...动态绑定 对于动态绑定,或者叫运行期绑定,说的是在编译期不知道实现的是哪个具体的对象,直到运行期才能确定。 让我们来举个例子。...class Drinks{ public void drink(){ System.out.println("not sure what it is"); } public static...Drinks drink = DrinkFactory.getDrink(); drink.drink(); } } class DrinkFactory { public static

1.7K30

PHP类的静态(static)方法和静态(static)变量使用介绍

直接调用类方法/变量:class::attribute/function,无论是静态/非静态都可以。但是有前提条件: A. 如果是变量,需要该变量可访问。 B....如果是方法,除了该方法可访问外,还需要满足: b1) 如果是静态方法,没有特殊条件; b2) 如果是非静态方法,需要该方法中没有使用$this,即没有调用非静态的变量/方法,当然,调用静态的变量/方法没有问题...使用class::… 调用静态方法/变量,不需要执行构造函数创建对象; 3. 使用class::… 调用非静态方法/变量,也不需要执行构造函数创建对象。...静态变量 静态成员只保留一个变量值,而这个变量值对所有的实例都是有效,也就是说,所有的实例共享这个成员。 2....静态方法 静态方法可以直接使用class::… 来调用,而非静态方法需要满足一定限制条件才能使用class::.. 的方法调用,如之前所述

4.1K10

动态绑定静态绑定

为了支持c++的多态性,才用了动态绑定静态绑定。理解他们的区别有助于更好的理解多态性,以及在编程的过程中避免犯错误。 需要理解四个名词: 1、对象的静态类型:对象在声明时采用的类型。...的类型D* 12 C* pC = new C(); 13 pB = pC;//pB的动态类型是可以更改的,现在它的动态类型是C* 3、静态绑定绑定的是对象的静态类型,某特性(比如函数)依赖于对象的静态类型...因为函数DoSomething是一个no-virtual函数,它是静态绑定的,也就是编译器会在编译期根据对象的静态类型来选择函数。...因为vfun是一个虚函数,它动态绑定的,也就是说它绑定的是对象的动态类型,pB和pD虽然静态类型不同,但是他们同时指向一个对象,他们的动态类型是相同的,都是D*,所以,他们的调用的是同一个函数:D::vfun...至于那些事动态绑定,那些事静态绑定,有篇文章总结的非常好: 我总结了一句话:只有虚函数才使用的是动态绑定,其他的全部是静态绑定。目前我还没有发现不适用这句话的,如果有错误,希望你可以指出来。

2.4K30

php面对对象之后期绑定

当你需要调用AUser的静态方法时,这样是行不通的, 因为self::取决于定义时所在的类,那该如何调用到AUser的静态方法呢? 其实只需要将self::改为static::就行了 <?...以下内容摘自PHP手册: 自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。...准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。...当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。...所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。

47410

java — 静态绑定和动态绑定

绑定:一个方法的调用与方法所在的类关联起来。java中的绑定分为静态绑定和动态绑定,又被称作前期绑定后期绑定。...静态绑定:(final、static、private)在程序执行前已经被绑定,也就是说在编译过程中就已经知道这个方法是哪个类的方法,此时由编译器获取其他连接程序实现。...1.静态绑定 private:不能被继承,则不能通过子类对象调用,而只能通过类本身的对象进行调用,所以可以说private方法和方法所属的类绑定;   final:final方法虽然可以被继承,但是不能被重写...(覆盖),虽然子类对象可以调用,但是调用的都是父类中的final方法(因此可以看出当类中的方法声明为final的时候,一是为了防止方法被覆盖,而是为了有效关闭java的动态绑定);   staticstatic...唯一的不同就是,当子类对象上转型为父类对象时,不论子类中有没有定义这个静态方法,该对象都会使用父类中的静态方法。因此这里说静态方法可以被隐藏而不能被覆盖。这与子类隐藏父类中的成员变量是一样的。

3.5K90

理解静态绑定与动态绑定

绑定就是一个方法的调用与调用这个方法的类连接在一起的过程被称为绑定 绑定分类 绑定主要分为两种: 静态绑定 和 动态绑定 绑定的其他叫法 静态绑定 == 前期绑定 == 编译时绑定 动态绑定 ==...后期绑定 == 运行时绑定 为了方便区分: 下面统一称呼为静态绑定和动态绑定 静态绑定 在程序运行前,也就是编译时期JVM就能够确定方法由谁调用,这种机制称为静态绑定 识别静态绑定的三个关键字以及各自的理解...关键词所修饰,也是编译时绑定 动态绑定 概念 在运行时根据具体对象的类型进行绑定 除了由private、final、static 所修饰的方法和构造方法外,JVM在运行期间决定方法由哪个对象调用的过程称为动态绑定...如果把编译、运行看成一条时间线的话,在运行前必须要进行程序的编译过程,那么在编译期进行的绑定是前期绑定,在程序运行了,发生的绑定就是后期绑定 代码理解 public...动态绑定静态绑定的特点 静态绑定 静态绑定在编译时期触发,那么它的主要特点是 1、编译期触发,能够提早知道代码错误 2、提高程序运行效率 动态绑定 1、使用动态绑定的前提条件能够提高代码的可用性,使代码更加灵活

1.7K80

C++ static静态成员

基本概念 静态成员:在定义前面加了 static 关键词的成员。 以下面的代码例子,来学习 static 关键词: ?...这里需要注意的是 sizeof 运算符不会计算静态成员变量的大小,如下栗子: class CTest { int n; static int s; }; 则 sizeof(CTest)...因此静态成员变量和静态成员函数不需要通过对象就能访问,因为他是共享的。...静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在; 2. 静态成员函数本质上是全局函数; 3....设置静态成员这种机制的目的是将和某些紧密相关的全局变量和函数写在类里面,看上去像是一个整体,易于维护和理解; 4. 在静态成员函数中,不能访问非静态成员变量,也不能调用非静态成员函数; 5.

56860

C语言 | static静态变量

例87:学习C语言static定义静态变量的用法。  解题思路:在C语言中,static 不仅可以用来修饰变量,还可以用来修饰函数,使用 static 修饰的变量,称为静态变量。... int static_var=0; //定义静态变量    printf("变量var值是:%d\n",var);   printf("静态变量static_var值是:%d\n",static_var...);   printf("\n");//换行    var++;   static_var++; } 编译运行结果: 变量var值是:0 静态变量static_var值是:0 变量var值是:0 静态变量...static_var值是:1 变量var值是:0 静态变量static_var值是:2 -------------------------------- Process exited after 1.12...读者需要注意的一点是:静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。

1.4K52

静态局部变量和静态全程变量static

static 被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。...(3)static 修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。static 修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。...使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存。 静态成员的定义或声明要加个关键 static静态成员可以通过双冒号来使用即 ::。...(static 修饰类:这个用得相对比前面的用法少多了,static 一般情况下来说是不可以修饰类的, 如果 static 要修饰一个类,说明这个类是一个静态内部类(注意 static 只能修饰一个内部类...一般总结:在类中,static 可以用来修饰静态数据成员和静态成员方法。

92220

C语言 | static静态变量

例87:学习C语言static定义静态变量的用法。 解题思路:在C语言中,static 不仅可以用来修饰变量,还可以用来修饰函数,使用 static 修饰的变量,称为静态变量。...int static_var=0; //定义静态变量 printf("变量var值是:%d\n",var); printf("静态变量static_var值是:%d\n",static_var...); printf("\n");//换行 var++; static_var++; } 编译运行结果: 变量var值是:0 静态变量static_var值是:0 变量var值是:0 静态变量...static_var值是:1 变量var值是:0 静态变量static_var值是:2 -------------------------------- Process exited after 1.12...读者需要注意的一点是:静态变量属于静态存储方式,属于静态存储方式的变量却不一定就是静态变量。

97232
领券